応用情報技術者 PR

【応用情報】SQL文について解説 – Select文編

記事内に商品プロモーションを含む場合があります

この記事ではSQLのSelect文についてIT初心者にも分かりやすく解説します。

Select文

  • 基本形:
    Select 取得したい列名 From 取得元テーブル Where 取得条件
  • 昇順に並び替え:
    Select 取得したい列名 From 取得元テーブル Order by 並び替えたい項目
  • 重複行の削除:
    Select Distinct 重複削除したい項目 From 取得元テーブル
  • データの平均値を取得:
    Select AVG(平均したい項目) From 取得元テーブル
    Group by グルーピングする項目 Having 集計結果に対する取得条件
  • テーブル同士の足し算:
    Select 取得したい列名 From 取得元テーブル
    Union (All)  Select 取得したい列名 From 取得元テーブル

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

SQL文とは

SQL文とはデータベースを操作するための言語で、

  • Create :データの作成
  • Read   :データの取得
  • Update:データの更新
  • Delete :データの削除

の4つの命令をデータベースに指示します。

【応用情報技術者】CRUDとは何かCRUDとは、ほとんど全てのシステムが持つ4つの重要な機能であるCreate(生成)、Read(読み取り)、Update(更新)、Delete(削除)の頭文字を取ったものです。...

この記事では応用情報技術者で出題されるReadの命令文に限定して紹介していきます。

Select文の基本形

データを取得する

データの取得で使われるSQL文の基本形はSelect文です。

Select 取得したい列名 From 取得元テーブル Where 取得条件

例えば、「商品」というテーブルから商品コードが’B002’又は’C003’の、商品コードと販売単価を取得するSQL文はこのようになります。

Select 商品コード,販売単価 From 商品
Where 商品コード = ‘B002’ or 商品コード = ‘C003’

ちなみに、Where句は無くてもOKです。Where句を指定しなければ全てのデータが取得できます。

Select 商品コード,販売単価 From 商品

データの並び替え

データを昇順・降順に並び替えするSQL文は以下の通りです。降順に並び替えたい時はDescを付けます。

Select 取得したい列名 From 取得元テーブル
  Order by 並び替えたい項目 (Desc)

例えば、「商品」というテーブルから商品コードと販売単価を取得して昇順(あいうえお順)に並び替えるSQL文はこのようになります。

Select 商品コード,販売単価 From 商品 Order By 商品コード

データの読み出し-重複行削除

データが重複している場合、重複しているデータを一括にまとめて表示したい場合に発行するSQL文は以下の通りです。

Select Distinct 重複削除したい項目 From 取得元テーブル

例えば、「商品」というテーブルから仕入先を集約して取得するSQL文はこのようになります。S1という仕入先は2つありますが、1つにまとめて取得します。

Select Distinct 仕入先 From 商品

Select文の特別な処理

Nullの場合の特別な処理

テーブルに何も登録されていない状態をNullと言います。
Nullを含むデータを取得する時、Nullの代わりに値を入れる場合に発行するSQL文は以下の通りです。

Select COALESCE(Nullの場合に値を入れたい項目,代わりに入れる値)
From 取得元テーブル

例えば、商品の販売店を取得したいけど、販売店の登録がまだ無いデータはとりあえず「東京店」として取得したい場合のSQL文はこのようになります。

Select 商品コード,Coalesce(販売店,’東京店’) From 商品表

条件に基づいて結果を返す

条件に基づいて違う結果を返したい場合に発行するSQL文は以下の通りです。

CASE When 条件 THEN 条件の時の結果 ELSE 条件外の時の結果

例えば、テストの得点が60点以上なら合格、60点未満なら不合格と表示したい場合のSQL文はこのようになります。
ちなみに、asを使うと列名に名前を付けることが出来ます。
合格、不合格を入れる列に名前を付けたいので、「As ‘結果’」と列名を指定します。

Select 生徒番号 Case When 得点>=60 Then ‘合格’ Else ‘不合格’ As ‘結果’

データをグルーピングする

データの集計・平均

データの集計と平均の基本形は以下の通りです。

データの集計
Select
SUM(集計したい項目) From 取得元テーブル
  Group by グルーピングする項目 Having 集計結果に対する取得条件

データの平均
Select
AVG(平均したい項目) From 取得元テーブル
  Group by グルーピングする項目 Having 平均結果に対する取得条件

例えば、製品分類毎の販売単価の平均値を取得するSQL文はこのようになります。

Select 製品分類,AVG(販売単価) From 商品
Group by 製品分類

平均値が1000未満のデータだけ取得したい場合のSQL文はこのようになります。PCの販売単価の平均値は800、文房具の販売単価の平均値は1050なので、PCの平均値だけ取得します。

Select 製品分類,AVG(販売単価) From 商品
Group by 製品分類 Having AVG(販売単価)<1000

平均値を取得した列に「平均値」と名前を付けたいので、「As ‘平均値’ 」と列名を指定します。

Select 製品分類,AVG(販売単価) As ‘平均値’ From 商品
Group by 製品分類

テーブルの足し算

テーブル同士の縦の足し算

テーブル同士を単純に縦方向に合体させるSQL文は以下の通りです。

Select 取得したい列名 From 取得元テーブル
  Union (All)  Select 取得したい列名 From 取得元テーブル

例えば、東京在庫と大阪在庫の表を足し算したい場合のSQL文はこのようになります。

Select 商品コード,在庫数 From 東京在庫
Union All Select 商品コード,在庫数 From 大阪在庫

Union Allではなく、Unionを使うと重複した行を削除して足し算します。
例えば、パンフレットAとパンフレットBの表を重複行を削除して足し算したい場合のSQL文はこのようになります。東京店でC003を販売しているという情報がパンフレットAとBで重複しているため、1つにまとめて取得しています。

Select 商品コード,販売店 From パンフレットA
Union Select 商品コード,販売店 From パンフレットB

テーブル同士の横の足し算

テーブル同士を単純に横方向に合体させるSQL文は以下の通りです。

①Select 取得したい列名 From 取得元テーブル
  Inner Join 足すテーブル
  On 取得元テーブル.項目=足すテーブル.項目

②Select 取得したい列名 From 取得元テーブル
  Left Outer Join 足すテーブル
  On 取得元テーブル.項目=足すテーブル.項目

「On 取得元テーブル.項目=足すテーブル.項目」で足し算の条件を指定します。

Inner Join

Inner Joinを使うと、足すテーブルに値がない場合は取得されないようになります。

例えば、生徒表とクラス表を足し算したい場合のSQL文はこのようになります。

Select 生徒表.生徒番号,クラス表.担任 From 生徒表
Inner Join クラス表
On 生徒表.クラス番号=クラス表.クラス番号

生徒表のクラス番号とクラス表のクラス番号同士で足し算をします。
Z組がクラス表に登録されていないので、足し算することが出来ずに取得結果に表示されません。

Left Outer Join

Left Outer Joinを使うと、足すテーブルに値がなくても足し算されます。

例えば、生徒表とクラス表を足し算したい場合のSQL文はこのようになります。

Select 生徒表.生徒番号,クラス表.担任 From 生徒表
Left Outer Join クラス表
On 生徒表.クラス番号=クラス表.クラス番号

Left Outer JoinではZ組がクラス表に登録されていなくても、生徒番号0003のデータが取得出来ます。しかし、クラス表に登録が無いので担任はNullになります。

応用情報技術者試験での出題例

令和4年度秋期問28

応用情報技術者
午前試験 令和4年度秋期問28

“商品”表に対して、次のSQL文を実行して得られる仕入先コード数は幾つか。

ア 1     イ 2     ウ 3     エ 4

正解と解説

正解は”ウ”

SELECT AVG (販売単価 – 仕入単価) FROM 商品
まずはこのSQLの結果から求めます。このSQLでは商品テーブルに格納されている全データの販売単価 – 仕入単価の平均値を取得しています。よって、

(200+200+100+900+400+200+300+500+500+300)÷10=360

で、360という値を返します。

ここから問題文のSQLは以下のようになります。
SELECT DISTINCT 仕入先コード FROM 商品 WHERE (販売単価 – 仕入単価) >360

下の黄色のデータが(販売単価 – 仕入単価)が360超のデータです。

ここから仕入先コードの重複を削除するので結果は以下になります。

よって取得できる仕入先コードが3個なので答えはウです。

令和3年度秋期問29

応用情報技術者
午前試験 令和3年度秋期問29

“部門別売上別”表から、部門コードごと、期ごとの売上を得るSQL文はどれか。

正解と解説

正解は”イ”

UNIONでは表同士を純粋に足し算します。

SELECT 部門コード,’第1期’ AS 期, 第1期売上 AS 売上 FROM 部門別売上
このSQLから得られる結果は以下の通りです。

SELECT 部門コード,’第2期’ AS 期, 第2期売上 AS 売上 FROM 部門別売上
このSQLから得られる結果は以下の通りです。

以上2つの表を足し算し、部門コード、期で昇順に並び替えると問題文の表が取得できます。

ちなみに、
ア INTERSECTでは2つの表で共通している項目が取得できます。今回だと共通している部分が無いので結果は何もなしになります。

ウ CROSS JOINでは2つの表に存在するデータの全ての組み合わせを取得できます。ちなみに問題文のSQLは引っ掛けになっているのでCROSS JOIN本来の使い方とは違う形で書かれています。

エ INNER JOINでは表同士を横に結合できます。こちらも問題文のSQLは引っ掛けになっているのでINNER JOIN本来の使い方とは違う形で書かれています。