基本情報のSQL問題の解き方|SELECT・WHERE・ORDER BYを例題で解説
SQLの問題が出ると、英単語が並んでいるだけに見えて、どの行が出てくるのか想像できない。
選択肢の表を見比べて、なんとなくで答えを選んでいませんか?
先に答えをお伝えします。
SQLの問題は、書かれている順番ではなく、FROM → WHERE → SELECT → ORDER BY の順番で読むと、結果の表を予測できます。まず使う表を決め、条件に合う行だけを残し、必要な列を選び、最後に並べ替えるという流れです。
この記事では、SQLを初めて読む人に向けて、SELECT・WHERE・ORDER BYの3つを中心に説明します。この記事のために作った小さな表を使い、SQL文から出力結果を予測する練習をしていきます。
基本情報技術者試験の全体像を先に確かめたい人は、こちらの親記事が参考になります。
【関連記事】基本情報技術者試験とは?試験内容・難易度・勉強法を初心者向けに解説
SQLとは?表からデータを取り出すための言葉¶
SQLとは、データベースに対して、データを取り出したり書き換えたりするよう命令するための言語です。データベースとは、たくさんのデータを決まった形で整理して保存しておく仕組みのことです。
基本情報で扱うのは、データを表の形で管理する関係データベースです。表は行と列でできていて、1行が1件のデータ、1列が1つの項目を表します。
この記事で使う表¶
ここからは、次の社員表を使って説明します。会社の社員5人分のデータが入っているものとします。
| 社員番号 | 氏名 | 部署 | 年齢 | 給与 |
|---|---|---|---|---|
| 101 | 青木 | 営業 | 28 | 280 |
| 102 | 井上 | 開発 | 35 | 420 |
| 103 | 上田 | 営業 | 42 | 450 |
| 104 | 江藤 | 総務 | 35 | 300 |
| 105 | 小川 | 開発 | 24 | 260 |
給与の単位は万円とします。この表の名前は、SQLの中では社員と書くことにします。
SQLは4つの部品で読む¶
今回扱うSQL文は、4つの部品でできています。それぞれの役割を表にまとめます。
| 部品 | 役割 | 読む順番 |
|---|---|---|
| FROM | どの表からデータを取り出すか | 1番目 |
| WHERE | どの行を残すか(条件) | 2番目 |
| SELECT | どの列を結果に出すか | 3番目 |
| ORDER BY | 結果をどの順番に並べるか | 4番目 |
SQL文はSELECTから書き始めますが、頭の中で処理する順番はFROMが先です。表を決めないと、行も列も選べないからです。
この読む順番を覚えておくだけで、結果の予測がぐっと楽になります。
SELECTとWHEREの基本|列を選び、行を絞る¶
まずは、いちばん基本の形から見ていきます。SELECTは列を選ぶ命令、WHEREは行を絞る命令です。
SELECTで列を選ぶ¶
SELECTの後ろには、結果に出したい列の名前を、カンマで区切って並べます。
SELECT 氏名, 部署 FROM 社員
このSQLは、社員表のすべての行から、氏名と部署の2列だけを取り出します。WHEREが無いので、5人全員が結果に出てきます。
列の名前の代わりに * と書くと、すべての列を取り出すという意味になります。SELECT * FROM 社員 なら、社員表がそのまま結果になります。
WHEREで行を絞る¶
WHEREの後ろには、残したい行の条件を書きます。条件に合う行だけが残り、合わない行は結果から外れます。
SELECT 氏名, 給与 FROM 社員 WHERE 給与 >= 300
読む順番に沿って考えてみましょう。まず社員表を用意し、給与が300以上の行だけを残します。
残るのは、井上(420)、上田(450)、江藤(300)の3行です。江藤の給与は300ちょうどですが、>= は以上という意味なので残ります。
最後に氏名と給与の2列を選ぶので、結果は次の表になります。
| 氏名 | 給与 |
|---|---|
| 井上 | 420 |
| 上田 | 450 |
| 江藤 | 300 |
比較演算子の一覧¶
WHEREの条件で使う記号を、比較演算子と呼びます。基本情報でよく見るものを表にまとめます。
| 記号 | 意味 | 例 |
|---|---|---|
| = | 等しい | 部署 = '営業' |
| <> | 等しくない | 部署 <> '営業' |
| > | より大きい | 年齢 > 30 |
| >= | 以上 | 年齢 >= 30 |
| < | より小さい | 年齢 < 30 |
| <= | 以下 | 年齢 <= 30 |
等しくないは、プログラミング言語でよく見る != ではなく、<> と書くのがSQLの基本の形です。また、文字のデータは '営業' のように、シングルクォーテーションで囲みます。
複数の条件を組み合わせる|AND・OR・BETWEEN・IN・LIKE¶
試験では、条件が1つだけのSQLはあまり多くありません。複数の条件を組み合わせたときに、どの行が残るかを正しく判断できるようにしておきましょう。
ANDとORの違い¶
ANDは、両方の条件を満たす行だけを残します。ORは、どちらか一方でも満たせば残します。
SELECT 氏名 FROM 社員 WHERE 部署 = '開発' AND 年齢 >= 30
開発部の社員は井上と小川の2人です。そのうち30歳以上なのは井上だけなので、結果は井上の1行になります。
同じ条件をORにすると、結果は大きく変わります。開発部の井上・小川に、30歳以上の井上・上田・江藤を合わせ、重なりを除くと4人になります。
ANDはORより先に計算される¶
ANDとORが1つの条件に混ざっているときは、ANDが先に計算されます。かけ算が足し算より先に計算されるのと同じ考え方です。
SELECT 氏名 FROM 社員
WHERE 部署 = '営業' OR 部署 = '総務' AND 給与 >= 400
このSQLは、部署 = '営業' OR(部署 = '総務' AND 給与 >= 400)と同じ意味になります。営業部の青木と上田はそのまま残ります。
一方、総務部で給与が400以上の社員はいません。結果は青木と上田の2行です。
もし、営業部か総務部のうち給与が400以上の人を出したいなら、括弧を付けて書きます。(部署 = '営業' OR 部署 = '総務')AND 給与 >= 400 なら、結果は上田だけになります。
この優先順位は、擬似言語の論理演算と同じ考え方です。and・or・notの読み方を確かめたい人は、こちらの記事も参考になります。
【関連記事】擬似言語の論理演算(and・or・not)の読み方|複合条件で迷わないコツを解説
BETWEEN・IN・LIKEの使い方¶
ANDやORを何度も書かなくて済むよう、よく使う条件には専用の書き方があります。3つの違いを表で比べます。
| 書き方 | 意味 | この表での結果 |
|---|---|---|
| 年齢 BETWEEN 28 AND 35 | 28以上35以下 | 青木・井上・江藤 |
| 部署 IN ('営業', '総務') | 営業か総務のどちらか | 青木・上田・江藤 |
| 氏名 LIKE '上%' | 上で始まる | 上田 |
BETWEENは、両端の値を含むのがポイントです。28歳の青木も35歳の井上も、結果に残ります。
LIKEは、文字の一部が合っているかを調べる書き方です。
% は0文字以上の任意の文字列、_ はちょうど1文字の任意の文字を表します。'%田' なら田で終わる氏名、'_川' なら2文字目が川の2文字の氏名という意味になります。
ORDER BYで並べ替える¶
ORDER BYは、結果の行を並べる順番を決める命令です。SQL文の最後に書き、処理も最後に行われます。
昇順と降順¶
ORDER BYの後ろに列の名前を書き、ASCなら小さい順(昇順)、DESCなら大きい順(降順)に並べます。ASCもDESCも書かなければ、昇順として扱われます。
SELECT 氏名, 年齢 FROM 社員 WHERE 部署 <> '総務' ORDER BY 年齢 DESC
総務部以外の4人が残り、年齢の大きい順に並びます。結果は上田(42)、井上(35)、青木(28)、小川(24)の順です。
ORDER BYを書かないSQLでは、結果の行の順番は決まっていません。選択肢に同じ行が違う順番で並んでいるときは、ORDER BYがあるかどうかを先に確かめましょう。
複数の列で並べ替える¶
ORDER BYには、列を複数書くこともできます。最初の列で並べ、同じ値が並んだときだけ、次の列で並べます。
SELECT 氏名, 年齢, 給与 FROM 社員 ORDER BY 年齢 DESC, 給与
まず年齢の大きい順に並べ、同じ年齢の社員がいたときだけ、給与の小さい順に並べるという意味です。社員表では、井上と江藤がどちらも35歳なので、この2人の順番を給与で決めます。
| 氏名 | 年齢 | 給与 |
|---|---|---|
| 上田 | 42 | 450 |
| 江藤 | 35 | 300 |
| 井上 | 35 | 420 |
| 青木 | 28 | 280 |
| 小川 | 24 | 260 |
DESCは、直前の年齢にだけかかります。給与には何も付いていないので昇順のままです。
DESCが全体にかかると思い込むと、順番を取り違えてしまいます。
出力結果を予測する練習問題¶
ここまでの内容を使って、結果を予測する練習をしてみましょう。答えを見る前に、FROM → WHERE → SELECT → ORDER BY の順で、紙に書きながら考えてみてください。
練習1¶
SELECT 氏名 FROM 社員
WHERE 給与 BETWEEN 280 AND 420 AND 部署 <> '開発'
ORDER BY 給与
給与が280以上420以下なのは、青木・井上・江藤の3人です。そのうち開発部の井上を除くと、青木と江藤が残ります。
給与の小さい順に並べるので、結果は青木(280)、江藤(300)の順になります。
練習2¶
SELECT 社員番号 FROM 社員
WHERE 年齢 < 30 OR 部署 = '営業' AND 給与 > 400
ORDER BY 社員番号 DESC
ANDが先なので、年齢 < 30 OR(部署 = '営業' AND 給与 > 400)と読みます。30歳未満は青木と小川、営業部で給与が400より大きいのは上田です。
3人の社員番号は101、105、103です。大きい順に並べると、105、103、101になります。
結果を予測できたら、選択肢の表と1行ずつ見比べます。行の数、列の数、並び順の3つを順に確かめると、見落としを防げます。
結果を予測するときに間違えやすい点¶
最後に、出力結果を予測するときにつまずきやすい点を表にまとめます。練習問題を解いて答えが合わなかったときは、この表のどれに当てはまるかを確かめてみてください。
| 間違えやすい点 | 起きること | 確かめ方 |
|---|---|---|
| SELECTから順に読む | 条件で使う列と結果に出す列を混同する | FROM → WHERE → SELECT の順に読み直す |
| >= と > を取り違える | 境目の値の行が増えたり減ったりする | 条件と同じ値の行を、1つずつ確かめる |
| ANDとORの優先順位を忘れる | 残る行がまったく変わる | ANDの部分に括弧を付けて書き直す |
| BETWEENの両端を外す | 両端の値の行が抜ける | BETWEENは以上・以下と読み替える |
| DESCが全体にかかると思う | 2つ目以降の列の順番を間違える | DESCは直前の列だけ、と確かめる |
どの間違いも、条件と同じ値や、同じ値が並ぶ行のような、境目のデータで起きやすいものです。自分で小さな表を作るときは、境目に当たる行をわざと入れておくと、よい練習になります。
SQLの問題は科目Aで出題される分野です。科目A全体をどう進めるかは、こちらの記事が参考になります。
【関連記事】基本情報 科目Aの勉強法|暗記に頼らず得点を伸ばす進め方
条件に合う行を1つずつ確かめる作業は、科目Bでプログラムを追うときの考え方とよく似ています。科目Bの出題内容を知りたい人は、こちらの記事を読んでみてください。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
私たちの Giji Academy では、擬似言語の講座を記法の基礎から条件分岐・繰返し・配列、科目B対策まで段階的に用意しています。
擬似言語シミュレーターを使えば、プログラムをブラウザ上で1行ずつ実行し、変数の値が変わる様子を確かめられます。講座は擬似言語の講座一覧から始められます。
まとめ¶
SQLの問題は、FROM → WHERE → SELECT → ORDER BY の順番で読むと、結果の表を予測できます。表を決め、条件で行を絞り、列を選び、最後に並べ替える流れです。
複数の条件があるときは、ANDがORより先に計算されることに注意しましょう。BETWEENは両端を含み、LIKEの % は0文字以上、_ は1文字を表します。
ORDER BYは書いた列ごとに昇順・降順が決まり、何も付けなければ昇順です。小さな表を自分で作り、結果を予測する練習を重ねれば、SQLの問題は得点源にできます。