SQL実行順序を完全攻略!WHEREとSELECTの違いを初心者向けに徹底解説
生徒
「SQLを勉強し始めたんですけど、書く順番とコンピュータが動く順番が違うって聞いて混乱しています。WHEREとSELECT、どっちが先に動くんですか?」
先生
「それは初心者が最初につまずく大事なポイントですね。実は、私たちが書く順番は『人間にとっての読みやすさ』を優先していますが、コンピュータは『作業の効率』を優先して動いているんです。」
生徒
「なるほど。だからWHEREで絞り込むのと、SELECTで列を選ぶ順番を勘違いしちゃうんですね。」
先生
「その通りです。今回は、データベースという大きな本棚からどうやってデータが取り出されるのか、その裏側の手順を『カレー作り』などの例えを使ってわかりやすく紐解いていきましょう!」
1. SQLとは何か?
SQL(エスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、インターネットショッピングの会員名簿の中から特定の人を探したり、銀行の残高を更新したり、新しい商品を登録したりするときに使います。プログラミング未経験の方でも、Excel(エクセル)のような「表」をイメージすれば大丈夫です。SQLは、その表に対して『この行だけ見せて!』や『この列だけ抜き出して!』と命令する魔法の言葉なのです。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. データベースの「テーブル」をイメージしよう
SQLを学ぶ前に、まずは操作対象となる「テーブル」を理解しましょう。テーブルとは、データベースの中でデータが保存されている「表」そのもののことです。縦の列を「カラム(フィールド)」、横の一行を「レコード」と呼びます。今回は、あるお店の「顧客リスト」を例にして考えてみます。
操作前のテーブル(users)
id | name | age | city | status
---+------------+-----+---------+---------
1 | 山田太郎 | 25 | 東京都 | 会員
2 | 佐藤花子 | 19 | 大阪府 | 非会員
3 | 鈴木一郎 | 30 | 北海道 | 会員
4 | 田中愛 | 22 | 東京都 | 会員
5 | 伊藤健二 | 45 | 福岡県 | 非会員
6 | 渡辺直美 | 28 | 東京都 | 会員
3. 基本文法のSELECTとWHEREの役割
SQLで最もよく使われるのが、データを取得する命令です。ここで主要な2つのキーワードが登場します。
- SELECT(セレクト): 「どの列(項目)」を表示するかを選びます。
- WHERE(ウェア): 「どの行(データ)」を取り出すか、条件を指定して絞り込みます。
例えば、「東京都に住んでいる人の名前だけを知りたい」という場合、人間は「まず名簿の名前の列を見て、そこから東京の人を探す」と考えがちですが、SQLの書き方は少し異なります。まずは基本的なコードの書き方を見てみましょう。
SELECT name, city
FROM users
WHERE city = '東京都';
実行後の結果:
name | city
-----------+---------
山田太郎 | 東京都
田中愛 | 東京都
渡辺直美 | 東京都
4. SQLの「書く順番」と「実行される順番」の違い
ここが今回のメインテーマです。SQLには、人間がコードを記述する順番(構文順)と、データベースのシステムが実際に内部で処理を行う順番(実行順序)の2種類が存在します。
人間が書く順番(構文順)
- SELECT(列を選ぶ)
- FROM(テーブルを選ぶ)
- WHERE(条件で絞る)
コンピュータが実行する順番(内部処理順)
- FROM: まず、どの本棚(テーブル)を見るか決める。
- WHERE: 次に、条件に合う行だけを抜き出す(フィルタリング)。
- SELECT: 最後に、必要な項目(列)だけを切り出す。
なぜこの順番なのでしょうか?例えば、カレーを作るときを想像してください。「ジャガイモの皮をむく(SELECT)」という作業を、冷蔵庫にある「すべての食材(テーブル)」に対して行うのは非効率ですよね。まずは「カレーに使う野菜だけを取り出す(WHERE)」という作業を先に行い、その後に「選ばれた野菜の皮をむく(SELECT)」方が、手間が少なくて済みます。データベースも同じで、最初に不要なデータを捨ててから、必要な列だけを抽出する方が速く処理できるのです。
5. 実践例1:20歳以上の会員を抽出する
それでは、具体的な例でさらに深掘りしましょう。今度は「20歳以上の人の名前と年齢」を取り出してみます。ここでは、比較演算子(ひかくえんざんし)という「~以上」「~より大きい」を表す記号を使います。
SELECT name, age
FROM users
WHERE age >= 20;
このSQLが動くとき、データベース内部では以下のように動いています。
- FROM users: 「users」という表を広げる。
- WHERE age >= 20: 年齢が20以上の行だけを残し、それ以外(佐藤花子さんなど)を一旦無視する。
- SELECT name, age: 残ったデータの中から「name」と「age」の列だけを画面に表示する。
実行後の結果:
name | age
-----------+-----
山田太郎 | 25
鈴木一郎 | 30
田中愛 | 22
伊藤健二 | 45
渡辺直美 | 28
6. 実践例2:複数の条件で絞り込む(ANDの使い方)
もっと複雑な指示を出してみましょう。「東京都に住んでいて、かつ会員の人」を探します。複数の条件を組み合わせるには「AND(アンド)」という言葉を使います。これもWHEREの中で使われる重要な要素です。
SELECT *
FROM users
WHERE city = '東京都' AND status = '会員';
※「SELECT *」の「*(アスタリスク)」は、「すべての列を表示して」という意味です。わざわざ列の名前を全部書かなくていいので便利です。
実行後の結果:
id | name | age | city | status
---+------------+-----+---------+---------
1 | 山田太郎 | 25 | 東京都 | 会員
4 | 田中愛 | 22 | 東京都 | 会員
6 | 渡辺直美 | 28 | 東京都 | 会員
ここでも順番は不変です。まずFROMでテーブルを選び、次にWHEREで「東京」かつ「会員」という条件で激しく絞り込みを行い、最後にSELECTですべての列を表示しています。
7. なぜWHEREとSELECTの順番を間違えると困るのか?
初心者の方がよくやってしまうミスに、「SELECTで別名をつけたのに、WHEREでその名前が使えない!」というものがあります。これを「エイリアス(別名)」の問題と呼びます。例えば、「name」という列に「名前」というあだ名をつけたとしましょう。
-- これはエラーになる可能性があります(データベースの種類によります)
SELECT name AS 名前
FROM users
WHERE 名前 = '山田太郎';
なぜエラーになるのか?それは、WHEREが動くときには、まだSELECT(あだ名をつける作業)が終わっていないからです。コンピュータはWHEREの段階で「『名前』っていう列なんて無いよ!」と怒ってしまうのです。このように、実行順序を知っておくと、エラーが出たときに「あ、まだこの段階ではその名前は使えないんだな」と冷静に判断できるようになります。
8. データの並べ替え(ORDER BY)との関係
データの抽出が終わった後、最後に「見やすく並べたい」ということがあります。そのときに使うのが「ORDER BY(オーダーバイ)」です。これは実行順序の最後の方に位置します。
実行順序の完全版(今回学習した範囲)
- FROM(どこから?)
- WHERE(どんな条件で?)
- SELECT(どの項目を?)
- ORDER BY(どんな順番で並べる?)
最後に「年齢が若い順(昇順)」に並べるSQLを書いてみましょう。
SELECT name, age
FROM users
WHERE status = '会員'
ORDER BY age ASC;
※「ASC」は小さい順(昇順)という意味です。
実行後の結果:
name | age
-----------+-----
田中愛 | 22
山田太郎 | 25
渡辺直美 | 28
鈴木一郎 | 30
このように、SQLの処理の流れを一つずつ追いかけていくと、データベースがどうやって私たちの命令を解釈しているのかが見えてきます。一見難しそうに見える英語の羅列も、実は非常に論理的なステップで動いているのです。