1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLの書き順と実行順について

Posted at

MySQLでエラーが発生した際、原因がSQLの書き順と実行順の違いであったことが判明しました。
そもそも、両者が違うことを知らなかったので、備忘録として残します。

そもそもSQLとは?

リレーショナルデータベースに情報を入れたり、各種処理(検索・抽出など)したりするための言語。

リレーショナルデータベースとは
関連性のある情報を表形式でまとめているもの。

SQLの書き順と実行順

(人が)SQLを書くときの順番

  1. SELECT句:「こんな情報が欲しい」
  2. FROM句:「このテーブルから欲しい情報取ってきてね」
  3. JOIN句:「テーブルをこんな風に結合してね」
  4. ON句:「テーブル同士をこのカラムで結合してね」
  5. WHERE句:「こんな条件でデータを取得してきてね」
  6. GROUP BY句:「●●列ごとの情報が知りたい」
  7. HAVING句:「グループ化した後に条件を設定する」
  8. ORDER BY句:「取得したデータを並び替えてね」
  9. 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を書いて覚えていこうと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?