あの日使い始めたXAMPPのDBサーバーの本当の名前を学習当初の僕達はまだ知らない（PaaSを使うときの注意）

　本Qiitaは**DBやデータ型に関して私がしばらくの間気づいていなかった個人的勘違いに関する備忘録**です。（※気づいた勘違いは2つあるのですが、長くなりそうなので記事を分けました）
 　この無料プログラミング学習コミ二ティProgakuでのモブプロや、現在個人的にしているflaskやDjangoによるWebアプリ作成のハンズオンなどを通して「**そもそもDBサーバーやDBクライアントなどの言葉の意味等を自分の中で諸々整理する必要があるな**」と感じ、諸々ググったり、[主な参考資料①](#主な参考資料)でSQLとかDBを勉強し直す中でずっと勘違いしていたことに気づきました。

<h2>勘違い①</h2>
<h3>転職のための民間スクール利用時によく利用していた開発環境の1つXAMPPのUIの「MySQL」のボタンを押してローカルで動かしていたDBサーバーは実は「MariaDB」だった。（※実はデフォルトの設定がMariaDBになっている場合がある）</h3>

![XAMPP_UI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/37e6ea37-ff0d-87af-41d2-91d857dab14a.png)

<details><summary>勘違い②</summary>

<h3>DBの1つである SQLite に格納されるデータは<br>
「NULL」「INTEGER」「REAL」「TEXT」「BLOB」<br>の5種類に大別されるが、格納されるデータのデータ型とテーブルのカラム定義でどんなデータ型を設定できるかは別物で、<br>
DBのテーブルのカラム定義時に一見これら5つに含まれているように見えないデータ型も大概設定できる。</h3>
（例：日付とかタイムスタンプのカラムをmodels.pyで設定するときに
やむを得ず「String」でしか設定できないわけではない。普通にDateTimeとか使える。）
</details>
これについては、記事を書き次第ここにQiitaリンクを貼ります

<h1>勘違い①に気づくまでの道のり</h1>

<h2>（1）そもそも DB サーバーと DB クライアントの違いがよく分かっていなかった</h2>

<h3>（i）そもそも「DBサーバー」とは何か整理してみる</h3>

これまで自分がよく耳にしてきたものだと「**MySQL、MariaDBなど、いわゆるRDBMS（リレーショナルデータベース管理システム）**」がこれにあたる。「DBを使える状態にしてくれているシステム」

<h4>※DBクライアント使ったり、ターミナル開いてコマンドを使ったり、その他何らかのGUIツールを利用しないと「内部構造が思った通りになっているかやその中身がどうなっているかは分からない」</h4>

<h4>※上記のような可視化するツールやコマンドが分からない（orない）場合、そのDBを使っているプロジェクト内で一覧表示等の「データを取ってくる＆表示する」機能を実装していない限り、DB内がどうなっているか（or思ったように機能しているか）分からない</h4>

<h3>その他DBサーバー・DB操作に関する諸注意</h3>

・MySQLだろうが、SQLiteだろうが**RDB（リレーショナルデータベース）なら形はExcelと同じ格子状の表形式**

・DBクライアントでも用いる**SQL（DB操作をするための言語）は、基本となる文法の「動詞」は「INSERT」「SELECT」「UPDATE」「DELETE」の4つのみ**

・SQLiteのようにサーバーの設定を必要としない(というかサーバーがない)DBもある。なおSQLite3は名前に「Lite」とある癖に容量が100TB以上ある。完全に名前詐欺。

・例えば、LaravelのEloquent ORM やPythonのSQLAlchemyのようなORM(Object-Relational Mapping:オブジェクト関係マッピング)も最終的にはSQLに変換されている

____

<h3>（ii）そもそも「DBクライアント」とは何か整理してみる</h3>

<h3>「MySQLWorkbench、phpadmin、DBeaverなど、データベースの中身をクライアント側がSQLを使って表示することで可視化できるようにしたもの」</h3>

※「**MySQLやMariaDBそのものを維持・開発している凄い人」から見ての「クライアント**」なので、ここでの「クライアント」はChromeやEdge等ブラウザを使う我々側を指す

<h2>（2）学習の過程でDBサーバーで使用することのできる修飾語（WHERE、JOIN、LIMIT、・・・等々）が異なることを知る。</h2>

[主な参考資料①](#主な参考資料)には「dokoQL」という学習用のSQL実行環境がついていますが、当然現場では使えないので、**転職活動時にLaravel.ver9で作ったポートフォリオ内のCRUDのDBに紐付けたMySQLWorkbenchやそれに対応するローカルのphpadmin等で諸々試していたところ気づきました**。

**※上記ポートフォリオには意見投稿フォームのようなもの（上記のCRUD）がつけてあり、Seederでサンプルデータを流し込んであります。またそのポートフォリオは転職活動時、PaaS（アプリケーションの開発や運用に必要なプラットフォームをクラウド上で利用できるサービス）の1つであるHerokuを使ってデプロイしていました**。

<h3>〇当時のSQL学習の様子</h3>

<details><summary>詳細</summary>

<h3>phpadminを動かしたときの様子</h3>

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/c2fc9dc0-6b91-9c29-a1ea-48e2a8c68eb6.png)

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/f2052810-f2e5-6bd1-b87f-f0ea849809f5.png)

※便宜上ここでは、contact_formsテーブルは「A」、github_contact_formsテーブルは「B」としています。

![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/63f89e71-4d30-9aae-1fec-1c5f762b94cc.png)

以下このうち、見やすさ上ここではあくまで2つのカラムに関して抜き出したものを示します。

![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/475b9974-286d-ee3c-f3ed-5a4691e4d4fa.png)

![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/5198744b-47ba-56d0-aba2-3a21f92f498c.png)

<h4>〇2つのテーブルの共通部分を取り出す「INTERSECT」、片方から「INTERSECT」で取得されるものを取り除いたもの（いわゆる差集合的なもの）を取得する「EXCEPT」を使ってみた様子</h4>

![INTERSECT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/9ceaacfc-70ae-0521-b49c-54282aa85881.png)

![EXCEPT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/034808dc-8a1f-14d6-4003-897002ba8f21.png)


<h3>たしかに「INTERSECT」「EXCEPT」いずれも含めて実行されていることがわかるかと思います。ところが、デプロイしてある方のDB&MySQLWorkBenchで試してみると・・・</h3>

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/b1841f73-fc99-d87a-dd6b-0f96474c8745.png)

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/79a0d56c-d95e-b24f-73c6-4bc2d2904504.png)

実際のエラーメッセージ
```
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near [入力したSQL文の一部].
```
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/b5b15643-b234-4037-3797-6d7deb9bc167.png)

</details>

<h3>あれ？？(´д｀)？？ローカルかデプロイしてあるか違うだけでこれどちらもMySQLの同じ構造・同じ中身のDBのはずだよな。。。</h3>

<h2>（3）状況を整理してみる</h2>

しばらく悩むまま※[主な参考資料①](#主な参考資料)をとりあえず内容を進めてパラパラしていると**付録の「DBMS比較表」という「各主要なDBサーバーでは、それぞれどの修飾語が使えるのか一覧にしたもの」の存在を知り**、以下のことに気づきます。

<h3>「INTERSECT」「EXCEPT」はMySQLでは使えない（サポートされていない）<br>（※2024年12月15日時点自分の調べ）</h3>

**※代わりにMySQLにおいては、「INTERSECT」については「INNER JOIN」や「EXISTS」、「EXCEPT」については「NOT IN」や「LEFT JOIN」といった修飾語を使うことで同等の結果が期待できるクエリをどうやら組めるようです**

____
事実、もう一度状況を整理・確認してみると、ポートフォリオをHerokuでデプロイ時、**実際に使ったDBはJawsDB（MySQLとPostgreSQLのDBをサポートしているクラウドベースのデータベースサービス）でHerokuの設定を見ると、「Installed add-ons」のところに「JawsDB MySQL」とありました。**

※参考　@haruyan_hopemucci さんQiita

https://qiita.com/haruyan_hopemucci/items/14e0dbeb0aedd85a74ee



<h2>（4）じゃあ、phpadminの「MySQL」お前何者やねん(-_-)</h2>

<h3>試しに「phpadmin」の公式サイトを見てみる</h3>

そうすると、[主な参考資料④](#主な参考資料)に次のようにありました...

phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement.

<h4>問題は2文目「phpMyAdmin supports a wide range of operations on MySQL and MariaDB.」</h4>

<h3>エッ？？お前もしかしてMariaDBなん？？(´д｀)？？</h3>

そんな疑いをもち、とりあえずローカルのXAMPPの「MySQL」を起動し、phpadminのUIをもう一度よく眺めていると、次のようなものを発見しました・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/2f1f3f4d-322b-769f-842e-5e8fe3d3a26d.png)

イヤイヤ(´д｀)ならボタンを・・

なお、その後以下のようなものも発見しました・・

https://dad-union.com/php/2263

<h2>XAMPPのデフォルトがMariaDBであることを責めるわけではない。とりあえずMariaDBを少し褒めておく（ただUIは変えといてほしかった・・）</h2>

以前どこかで、**XAMPPそのものはセキュリティやパフォーマンスの観点からXAMPPを本番環境として使うことは推奨されるものではない**という話は聞いていました。ただ、[主な参考資料①](#主な参考資料)の付録の「DBMS比較表」を見る限り、**MariaDBは比較的、使える修飾語が他のDBサーバーに比べて多い（もしくはメジャーなものは大概使える）** という特徴があり、**開発環境でSQLの挙動を調べるときや個人のSQLの学習には向いている**のではないかと個人的に感じました。また**MariaDBはMySQLから派生したオーブンソースのDBサーバーだそうで、XAMPPがそうであるように、MySQL同様基本的に無料で使えます。**

<h2>あらためて別の言葉でまとめると、「HerokuというPaaSを通してデプロイしたことで、開発環境と本番環境でDBサーバーにズレが生じた」という事例でした</h2>

他にも似たような事例があればコメントで教えていただけるとありがたいです。

# 主な参考資料

①スッキリわかるSQL入門 第3版 ドリル256問付き! (スッキリわかる入門シリーズ) 
　中山 清喬・飯田 理恵子 (著), 株式会社フレアリンク (監修)
　※2024/2/5に第4版が出ていました。
<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295013390/ref=sr_1_3?crid=5WXGENAFUQWA&dib=eyJ2IjoiMSJ9.xInwby6L9meVu-DcOzcsfK6z5ePG5-SuA18Than2xNKh0KHSJDNGGALEr7zTf9r59ZDVSys1oF9x82ScC0hI9hY_blH9ogwrELAkMU2cx32pevQ778V1t-pMXTF4yOxTqgMS49aM3qmh1sbAdh8Ze8B8SQl0XeYT6QnQUQS3S59mabYmuD7Wpea3JoD_ZH_oMxfJivtWG5rFApQwAksmqVz2P9DrHT5pArygK-mga1gf6v5xRKoO0h_vtcOzHWVjOWp4_JxfYoPknx8VUWGIAqU8eB-6iyCxYsAwwrhd8C8UirN9l-5d7KyDZEfHn8e3RJ6vud09OVM1XrYXm4I6A2ydqAtDhiqaRkVBuL0pWW0ayThvsNRanm4Eljzrd-RvRbuykLPnPOKaFyCMLR0WszPhShB-2U-YuWscY2YYq5OdjCWwUyKrymz0dNX8chTV.Rg3Y5xYQcKRb_kArCt967Dhbev47lnbcMUed7JQu9iE&dib_tag=se&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80&qid=1734106526&sprefix=%2Caps%2C212&sr=8-3
</details>


②超絶初心者のためのサーバとクライアントの話　@shuntaro_tamura(田村 俊太郎) in 株式会社シロクさん-Qiita
https://qiita.com/shuntaro_tamura/items/ae55b99deb9e2a170754

③【SQL入門】phpMyAdminとは？インストール方法・使い方を解説　TECH MANIA
https://techmania.jp/blog/sql-phpmyadmin/

④ phpadmin の公式ドキュメントと思われるサイト
https://www.phpmyadmin.net/