データベース

【応用情報】SQLを解説 – Select文の基本形

この記事ではSelect文の基本をIT初心者にも分かりやすく解説します。

SQL

  • SQLとはDBMSへ指示をするための言語。

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 それ以外の場合の値

応用情報ではSelect文に関する問題が出題されます。是非最後までご覧ください。

SQLとは

SQLとはDBMSへ指示をするための言語で、例えば、以下の4つの指示を伝えます。

この記事では応用情報技術者で頻繁に出題されるReadの命令文の基本形について解説します。

Select文の基本形

データを検索して読取るために使用されるのがSelect文です。
Select文では、「どの表から」「どの列を」「どんな条件で」で抽出するのかを指示します。これがSelect文の基本形です。

Select 列名 From 表名 Where 条件

例えば、社員表から人事部の人を検索して、氏名と役職を抽出するSelect文はこうなります。

Select 氏名,役職 From 社員表 Where 所属部署=’人事部’

ちなみに、条件を指定せずにSelect文を実行することもできます。
その場合は全てのデータを抽出します。

Select 氏名,役職 From 社員表

また、列名を指定せずに「*」を使うと、全ての列を抽出できます。

Select * From 社員表 Where 所属部署=’人事部’

条件を組み合わせる

Where句では複数の条件を組み合わせて使用することも出来ます。
複数の条件を組み合わせる場合には、「And」と「Or」を使います。

複数の条件を同時に満たす場合に抽出
Select 列名 From 表名 Where 条件1 And 条件2

複数の条件のうち、どれかを満たす場合に抽出
Select 列名 From 表名 Where 条件1 Or 条件2

例えば、社員表から人事部の課長を検索するSelect文はこうなります。
人事部かつ課長の社員を抽出するため、Where句でAndを使います。

Select 氏名,役職 From 社員表 Where 所属部署=’人事部’ And 役職=’課長’

例えば、社員表から経理部又は営業部の人を検索するSelect文はこうなります。
経理部又は営業部の社員を抽出するため、Where句でOrを使います。

Select 氏名,役職 From 社員表 Where 所属部署=’経理部’ Or 所属部署=’営業部’

抽出したデータを並び替える:Order By

Select文で抽出したデータを並び替える場合には、「Order By」を使います。

抽出したデータを昇順(あいうえお順)に並び替える
Select 列名 From 表名 Order By 列名 ASC(省略可)

抽出したデータを降順(あいうえお順と逆順)に並び替える
Select 列名 From 表名 Order By 列名 DESC

例えば、社員表から抽出したデータを社員番号順に並び替えるSelect文はこうなります。
昇順で並び替えるのでOrder Byを使用します。

Select 社員番号,氏名 From 社員表 Where 所属部署=’人事部’
Order by 社員番号

例えば、社員表から抽出したデータを社員番号で逆順に並び替えるSelect文はこうなります。降順で並び替えるのでOrder By ~ Descを使用します。

Select 社員番号,氏名 From 社員表 Where 所属部署=’人事部’
Order by 社員番号 Desc

重複したデータを削除する: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の発注要否が不要になります。

よって答えはウになります。