SQL:「どの列を・どの表から・どの条件で」取り出す
SQLはデータベースに指示を出すための言葉です。基本は SELECT 列 FROM 表 WHERE 条件 の3点セットで、「どの列を・どの表から・どの行だけ」取り出すかを書きます。表計算の「必要な行だけ絞りこむ」作業を、命令文で正確にくり返せるようにしたものだと考えるとわかりやすいです。
このページで学べること
- SQLが何をするための言葉かわかる
- SELECT・FROM・WHERE の役割がわかる
- 条件で行を絞りこめる
- 並べ替え・件数の数え方がわかる
前提知識
基本の形は3つの語だけ
- SELECT:取り出す列を指定(* はすべての列)
- FROM:取り出す表を指定
- WHERE:残す行の条件を指定(省略すると全行)
次のような「会員」表があるとします。
| 会員ID | 名前 | 年齢 | 都道府県 |
|---|---|---|---|
| 1 | 青木 | 25 | 東京都 |
| 2 | 井上 | 17 | 大阪府 |
| 3 | 上田 | 34 | 東京都 |
「20歳以上の会員の名前」を取り出すなら SELECT 名前 FROM 会員 WHERE 年齢 >= 20; です。結果は青木・上田の2件。条件に合う行だけ、指定した列だけが返ります。
並べ替えは ORDER BY(DESC で大きい順)、件数を数えるのは COUNT(*) を使います。文の最後には ;(セミコロン)を付けます。
利用者が入力した文字をそのままSQLに埋めこむと、SQLインジェクションという攻撃を受けるおそれがあります。実際のプログラムでは値を直接つなげず、専用のしくみ(プレースホルダ)を使います。くわしくは情報セキュリティを参照してください。
SQL は 「どの列を・どの表から・どの行だけ」という文の順に書きます。SELECT 名前(どの列を)/ FROM 会員(どの表から)/ WHERE 年齢 >= 20(どの行だけ)。読みやすさを優先した並びです。
ところがコンピュータが処理する順番は、書く順番とちがいます。実際は FROM(表を用意)→ WHERE(行を絞る)→ SELECT(列を取り出す)→ ORDER BY(並べ替える)の順。並べ替えは、絞りこんだ結果に対して最後に行うので、ORDER BY もいちばん最後に書きます。書き順を「読みやすさの順」、処理順を「作業の順」と分けて覚えると、文法エラーの理由が納得できます。
図でイメージする(行と列でしぼる)
| ID | 名前 | 年齢 | 都道府県 |
|---|---|---|---|
| 1 | 青木 | 25 | 東京都 |
| 2 | 井上 | 17 | 大阪府 |
| 3 | 上田 | 34 | 東京都 |
WHERE 年齢 >= 20 → 青木・上田の行が残る
| 名前 |
|---|
| 青木 |
| 上田 |
結果は2件
例題(くわしい手順)
例題1:条件と並べ替えを組み合わせる
上の会員テーブルから「東京都に住む会員の名前と年齢を、年齢の大きい順に」取り出します。
- 列を決める:名前と年齢 → SELECT 名前, 年齢
- 表と条件:FROM 会員 WHERE 都道府県 = '東京都'(文字は引用符で囲む)
- 並べ替え:ORDER BY 年齢 DESC を最後に付ける
- 確かめる:東京都の会員は青木25と上田34の2人。DESC(大きい順)なので34の上田が先に来ます。
SQL の記号(=・>=・<> など)は必ず半角で入力します。全角の = で書くとエラーになります。結果は「上田 34」「青木 25」の順。WHERE → ORDER BY の順番で書くのが決まりです(逆にすると文法エラーになります)。
例題2:件数を数える
会員テーブル(青木25・井上17・上田34)で SELECT COUNT(*) FROM 会員 WHERE 年齢 >= 20; の結果はいくつですか。
- FROM で表を用意:会員テーブルの3行が対象です。
- WHERE で絞る:年齢が20以上なのは青木(25)と上田(34)。井上(17)は外れます。
- COUNT(*) で数える:残った行は 1 + 1 = 2 件。結果は 2 です。
- 確かめる:WHERE を外すと3件になります。条件がきちんと効いていることが分かります。
COUNT(*) は「残った行の数」を返します。SELECT でどの列を選んでも件数は変わりません。「絞ってから数える」という処理の順番を意識すると、結果を予想できるようになります。
SELECT * と列を指定する場合の違い
| 書き方 | 取り出す内容 | 向いている場面 |
|---|---|---|
| SELECT * | すべての列 | 中身を確認したいとき |
| SELECT 名前, 年齢 | 指定した列だけ | 実際の処理(通信量が少なく、必要な情報だけ扱える) |
個人情報を扱うときは、必要な列だけを取り出すのが安全です(データ最小化の考え方)。
よくある間違い
WHERE 都道府県 = 東京都 のように書くとエラーになります。文字は '東京都' のように引用符で囲みます(数値は囲みません)。
SQLは SELECT → FROM → WHERE → ORDER BY の順で書きます。順番を入れかえると文法エラーになります。
「等しくない」は <> または != です。また、空欄(NULL)かどうかは = ではなく IS NULL で調べます。
練習問題
まず自分で解いてから解説を開きましょう。
会員テーブルの全データを取り出すSQLを書きなさい。
解答・解説を見る
答え:SELECT * FROM 会員;
* はすべての列という意味です。WHERE を省略しているので全行が対象になります。
つまずいたら → 「* はすべての列」(本ページ 基本の形は3つの語だけ)に戻りましょう。
会員テーブルから、年齢が20以上の行だけを取り出す条件を書きなさい。
解答・解説を見る
答え:WHERE 年齢 >= 20
数値なので引用符は不要です。20 も含めたいので > ではなく >= を使います。
つまずいたら → 「WHERE で残す行の条件を書く」(本ページ 基本の形は3つの語だけ)に戻りましょう。
上の会員テーブル(青木25・井上17・上田34)で SELECT COUNT(*) FROM 会員 WHERE 年齢 >= 20; の結果はいくつですか。
解答・解説を見る
答え:2
条件を満たすのは青木(25)と上田(34)の2件。COUNT(*) はその件数を返します。
つまずいたら → 「WHERE で絞ってから COUNT(*) で数える」(本ページ 例題2)に戻りましょう。
ORDER BY 年齢 DESC はどんな並び順になりますか。
解答・解説を見る
答え:年齢の大きい順(降順)
DESC は降順、ASC(省略時)は昇順です。上の表なら上田34 → 青木25 → 井上17 の順になります。
つまずいたら → 「DESC は大きい順(降順)」(本ページ 例題1)に戻りましょう。
よくある質問
Q. SQLとは何ですか?
データベースにデータの取り出しや追加を指示するための言葉です。基本は SELECT 列 FROM 表 WHERE 条件 の形で、必要な行と列だけを取り出せます。
Q. SELECT * はどんな意味ですか?
すべての列を取り出すという意味です。中身の確認には便利ですが、実際の処理では必要な列だけを指定したほうが安全で効率的です。
Q. WHERE の条件で文字を扱うときの注意は?
文字列は '東京都' のように引用符で囲みます(数値は囲みません)。また利用者の入力をそのままSQLに埋めこむとSQLインジェクションの危険があるため、プレースホルダを使います。
Q. SQLで並べ替えるにはどう書きますか?
文の最後に ORDER BY を書きます。「ORDER BY 価格」で安い順、「ORDER BY 価格 DESC」で高い順になります。
次に学ぶ内容
高等学校「情報I」および基本的なIT知識の範囲を参照し、オリジナルに作成(実在試験問題の転載はありません)。正確性は編集方針にそって確認しています。