この記事では、Select文について、初心者にも分かりやすく、図解付きで丁寧に解説しています!
SQL
- SQLとはデータベースに命令をするための言語。
Select文
- 基本形:
Select 列名 From 表名 Where 条件 - 複数の条件を使う:
Select 列名 From 表名 Where 条件1 And 条件2
Select 列名 From 表名 Where 条件1 Or 条件2 - 抽出結果を並び替える:
(昇順)Select 列名 From 表名 Order By 列名
(降順)Select 列名 From 表名 Order By 列名 Desc - 重複データを削除する:
Select Distinct 列名 From 表名 - Nullの場合、値を設定する:
Select Coalesce(列名,設定する値) From 表名 - 条件に基づいて値を設定する:
Case When 条件 Then 条件を満たす場合の値 Else それ以外の場合の値
SQLとは
SQLとはデータベースに命令するための言語で、主に以下の4つの命令があります。

この記事では試験で頻繁に出題されるReadの命令文の基本形について解説します。
Select文 – 基本形
Select文はデータを抽出するためのSQLです。Select文では、Fromの後に抽出したいテーブル、Selectの後に抽出したい列を指定します。条件を指定したい場合はWhereの後ろに書きます。
Select文の基本形
Select 列名 From テーブル名 Where 条件

Where句を指定しないことも出来ます。この場合は、全てのデータを抽出します。
Select 氏名,役職 From 社員表

また、列名を指定せずに「*」を使うと、全ての列を抽出できます。
Select * From 社員表 Where 所属部署=’人事部’

抽出条件を’or’で指定する
Where 条件1 or 条件式と指定すれば、条件1と条件2のどちらかを満たすデータが抽出できます。
Select 氏名,役職 From 社員表 Where 社員番号=’001′ or 社員番号=’004′

社員番号=’001’と社員番号=’004’のどちらかを満たすデータを抽出できるので、「田中」と「岡」が抽出されます。
抽出条件を’and’で指定する
Where 条件1 and 条件2と指定すれば、条件1と条件2の両方を満たすデータが抽出できます。
Select 社員番号 From 社員表 Where 所属部門=’営業部’ and 役職=’部長’

所属部門=’営業部’と役職=’部長’の両方の条件を満たす社員番号’001’だけが抽出対象になります。
Select文 – 並び替え
Select文でデータを抽出する時、抽出結果を並び替えることができます。
抽出したデータを昇順(あいうえお順)に並び替える
Select 列名 From テーブル名 Where 条件 Order by 列名 Asc(省略可)
抽出したデータを降順(あいうえお順の逆)に並び替える
Select 列名 From テーブル名 Where 条件 Order by 列名 Desc
昇順で並び替える
Order byで並び替えの基準となる列を指定します。Order by 列名にすると指定した列名に対して昇順で並び替え、Order by 列名 Descにすると降順で並び替えます。
Select 社員名,役職 From 社員表 Where 社員番号=’004′ or 社員番号=’002′ Order by 社員番号

社員番号=’004’と’002’のデータを抽出した上で、抽出結果を社員番号に対して昇順で並び替えます。昇順っていうのは小さいもの順とか「あいうえお」順のことですね。
重複したデータを削除する:Distinct
Select文で抽出したデータが重複していた場合、重複したデータを削除するのに「Distinct」を使います。
抽出したデータから重複を削除する
Select Distinct 列名 From 表名
例えば、1,000円以上注文した顧客名を抽出するSelect文はこうなります。A社は2回、1,000円以上の注文をしていますが、まとめて抽出したいのでDistinctで重複を削除します。
Select Distinct 顧客名 From 注文表 Where 注文金額>=1,000

Nullの場合、代わりに値を設定する:Coalesce
テーブルに何も登録されていない状態をNullと言います。Nullのデータを抽出する時、Nullの代わりに値を設定するのに「Coalesce」を使います。
Nullの代わりに値を設定する
Select Coalesce(列名,設定する値) From 表名
例えば、商品の販売店を抽出したいが、販売店の登録がまだ無いデータはとりあえず「東京店」として取得したい場合のSelect文はこうなります。商品番号’0002’は販売店が登録されていないので、’東京店’を設定します。
Select 商品番号,Coalesce(販売店,’東京店’) From 商品表

条件に基づいて値を設定する:Case When~
ある条件に基づいて値を設定する場合は「Case When~」の構文を使います。
Case When 条件 Then 条件を満たす場合の値 Else それ以外の場合の値
例えば、テストの得点が60点以上なら合格、60点未満なら不合格と表示するSelect文はこうなります。ちなみに、asを使うと抽出した結果の列に名前を付けることが出来ます。
得点が60点以上なら「合格」、それ以外なら「不合格」とします。また、「合格」「不合格」の結果を入れる列名を「結果」とします。
Select 生徒番号 Case When 得点>=60 Then ‘合格’ Else ‘不合格’ As ‘結果’
From テスト結果表

応用情報技術者試験での出題例
令和年6度春期問26
応用情報技術者
午前試験 令和6年度春期問26
“部品”表及び”在庫”表に対し,SQL文を実行して結果を得た。SQL文の a に入れる字句はどれか。

ア COALESCE(MIN(在庫.在庫数),0)
イ COALESCE(MIN(在庫.在庫数),NULL)
ウ COALESCE(SUM(在庫.在庫数),0)
エ COALESCE(SUM(在庫.在庫数),NULL)
正解は”ウ”
LEFT OUTER JOINやGROUP BYについてはこちらの記事で解説していますので、自信が無ければ見てください。
①まずはLEFT OUTER JOINで”部品”表と”在庫”表を結合しましょう。
“部品”表と”在庫”表を部品ID同士で結合します。
SELECT 部品.部品 ID AS 部品ID,
CASE WHEN 部品.発注点 > a
THEN N’必要’ ELSE N’不要’ END AS 発注要否
FROM 部品 LEFT OUTER JOIN 在庫
ON 部品.部品ID = 在庫.部品ID
GROUP BY 部品.部品ID, 部品.発注点

②部品.部品ID, 部品.発注点でグループ化して、「MIN」と「SUM」を取得する。
SELECT 部品.部品 ID AS 部品ID,
CASE WHEN 部品.発注点 > a
THEN N’必要’ ELSE N’不要’ END AS 発注要否
FROM 部品 LEFT OUTER JOIN 在庫
ON 部品.部品ID = 在庫.部品ID
GROUP BY 部品.部品ID, 部品.発注点
部品IDと発注点でグルーピングした後、MINでは在庫数が最小のデータを、
SUMでは在庫数の合計を計算します。

③CASE WHEN ~ THENとCOALESCEを考える。
COALESCEを使うと、Nullの場合に代わりの値を設定することが出来ます。
アとウ:COALESCE(~,0)の場合は、Nullの場合に0を、
イとエ:COALESCE(~,NULL)の場合は、Nullの場合にNullを設定します。
この問題では、在庫数と発注点を比較していますが、Nullにしてしまうと比較が出来ません。よって、Nullの場合に0を設定するアかウが答えになります。
SELECT 部品.部品 ID AS 部品ID,
CASE WHEN 部品.発注点 > a
THEN N’必要’ ELSE N’不要’ END AS 発注要否
FROM 部品 LEFT OUTER JOIN 在庫
ON 部品.部品ID = 在庫.部品ID
GROUP BY 部品.部品ID, 部品.発注点

アのMINの場合、P01の発注要否が必要になり、
ウのSUMの場合、P01の発注要否が不要になります。
よって答えはウになります。