MySQLでエラーが発生した際、原因がSQLの書き順と実行順の違いであったことが判明しました。
そもそも、両者が違うことを知らなかったので、備忘録として残します。
そもそもSQLとは?
リレーショナルデータベースに情報を入れたり、各種処理(検索・抽出など)したりするための言語。
リレーショナルデータベースとは
関連性のある情報を表形式でまとめているもの。
SQLの書き順と実行順
(人が)SQLを書くときの順番
- SELECT句:「こんな情報が欲しい」
- FROM句:「このテーブルから欲しい情報取ってきてね」
- JOIN句:「テーブルをこんな風に結合してね」
- ON句:「テーブル同士をこのカラムで結合してね」
- WHERE句:「こんな条件でデータを取得してきてね」
- GROUP BY句:「●●列ごとの情報が知りたい」
- HAVING句:「グループ化した後に条件を設定する」
- ORDER BY句:「取得したデータを並び替えてね」
- LIMIT句:「データは●●個取ってきてね」
(コンピューターが)SQLを実行するときの順番
1. FROM句:「このテーブルから情報を取得するよ」
2. ON句:「テーブル同士がどのカラムで結合するか選ぶよ」
3. JOIN句:「結合するテーブルを選ぶよ」
4. WHERE句:「テーブルの中でも指定された条件をもとにフィルタリングするよ」
5. GROUP BY句:「指定された列を基準にグループを作るよ」
6. HAVING句:「グループ化したものを条件にもとづいてフィルタリングするよ」
7. SELECT句:「欲しがっている情報を取得するよ」
8. ORDER BY句:「取得したデータを並び替えるよ」
9. LIMIT句:「データの数を絞るよ」
太字の部分が違いますね。
書き順と実行順を知らないと、思わぬエラーが起こることに…!
実際にあったエラー例
・商品テーブル
商品ID | 商品名 | 値段 | 購入者数 | 商品カテゴリーID |
---|---|---|---|---|
1 | りんご | 200円 | 8 | 1 |
2 | みかん | 80円 | 14 | 1 |
3 | バナナ | 100円 | 18 | 1 |
4 | じゃがいも | 150円 | 5 | 2 |
5 | にんじん | 200円 | 20 | 2 |
・商品カテゴリーテーブル
商品カテゴリーID | カテゴリー名 |
---|---|
1 | 果物 |
2 | 野菜 |
--カテゴリーごとの合計購入者数が30人以上なら表示する
SELECT カテゴリーID,SUM(購入者数) AS 合計購入者
FROM 商品テーブル
WHERE 合計購入者 >= 30
GROUP BY 商品カテゴリーID;
エラー発生の理由は、
SQLの実行順では、「WHERE句」→「SELECT句」だから!
SELECT句でSUM(購入者)に「合計購入者」と名前を付けたとしても、先にWHERE句が実行されるため、「合計購入者」の名前を参照できません。
標準SQLでは同じ理由で「GROUP BY句」「HAVING句」でもASで設定した別名は参照できないようですが、MySQLでは拡張機能として両方の句で別名を参照できるようです。
まとめ
SQLの書き順と実行順は違います。
このことを意識して、プログラムを書かないとエラーにつながることに。
正直この実行順をすべて覚えておくことは難しいですが、繰り返しSQLを書いて覚えていこうと思います。