応用情報技術者ではよくSQL文に関する問題が出題されます。ここでマスターしましょう。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/12ca6208c43f8060a5a67e01a5e3673c-1024x621.jpg)
SQL文とは
SQL文とはデータベースを操作するための言語で、
- Create :データの作成
- Read :データの読み出し
- Update:データの更新
- Delete :データの削除
の4つの命令をデータベースに指示します。
![](https://shikaku-dou.com/wp-content/uploads/2022/09/835e10b404134718e60f254c93af2109-320x180.jpg)
この記事では応用情報技術者で出題されるSQL文に限定して紹介していきます。
Select文
データの読み出しの基本形
データの読み出しで使われるSQL文の基本形はSelect文です。
Select 取得したい列名 From 取得元テーブル Where 取得条件
例
Select 商品コード,販売単価 From 商品
Where 商品コード = ‘B002’ or 商品コード = ‘C003’
「商品」というテーブルから商品コードが’B002’又は’C003’のデータのうち、商品コードと販売単価を取得するSQL文です。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/1b8b9cbfdf80e298ca5f2ca2166d016e-e1688772157760-1024x376.jpg)
ちなみに、Where句は無くてもOKです。Where句を指定しなければ全てのデータが取得できます。
Select 商品コード,販売単価 From 商品
![](https://shikaku-dou.com/wp-content/uploads/2023/07/a34d588640f57318b470be9a6bcb3094-e1688772905978-1024x384.jpg)
データの並び替え
データを昇順・降順に並び替えするSQL文は以下の通りです。降順に並び替えたい時はDescを付けます。
Select 取得したい列名 From 取得元テーブル
Order by 並び替えたい項目 (Desc)
例
Select 商品コード,販売単価 From 商品 Order By 商品コード
このSQL文では取得したデータを商品コードに関して昇順(あいうえお順)に並び替えます。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/bd5d92d84646ef61dfc715eba68b910b-e1688778819351-1024x410.jpg)
データの読み出し-重複行削除
データが重複している場合、重複しているデータを一括して表示したい場合に発行するSQL文は以下の通りです。
Select Distinct 重複削除したい項目 From 取得元テーブル
例
Select Distinct 仕入先 From 商品
このSQL文では重複している仕入先をまとめて取得します。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/c9dfe57e3ee8ceef357dd1f4767a1e7a-e1688776293718-1024x453.jpg)
データの集計・平均
データの集計と平均の基本形は以下の通りです。
データの集計
Select SUM(集計したい項目) From 取得元テーブル
Group by グルーピングする項目 Having 集計結果に対する取得条件
データの平均
Select AVG(平均したい項目) From 取得元テーブル
Group by グルーピングする項目 Having 平均結果に対する取得条件
例
Select 製品分類,AVG(販売単価) From 商品
Group by 製品分類
このSQLでは製品分類毎に販売単価の平均値を取得しています。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/14a23b1431040d27639c4df2fefe38ee-e1688774540661-1024x325.jpg)
Select 製品分類,AVG(販売単価) From 商品
Group by 製品分類 Having AVG(販売単価)<1000
このSQLでは製品分類毎に販売単価の平均値を算出し、平均値が1000未満のデータのみ取得します。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/62c6d606970ac085dc3ac9c96540bbc4-e1688775152561-1024x320.jpg)
ちなみに、asを使うと列名に名前を付けることが出来ます。
Select 製品分類,AVG(販売単価) As ‘平均値’ From 商品
Group by 製品分類
このSQLでは販売単価の平均値を格納する列の名前を平均値にすることが出来ます。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/0702f81f7f8f08819b9559b485ea4374-e1688779594470-1024x320.jpg)
テーブル同士の足し算
テーブル同士を単純に合体させるSQL文は以下の通りです。
Select 取得したい列名 From 取得元テーブル
Union (All) Select 取得したい列名 From 取得元テーブル
例
Select 商品コード,在庫数 From 東京在庫
Union All Select 商品コード,在庫数 From 大阪在庫
Union Allを使うとテーブル同士を単純に足し算出来ます。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/1808c5afc0a0d56b2e6808384c86a299-e1688777658724-1024x345.jpg)
Select 商品コード,在庫数 From 東京在庫
Union Select 商品コード,在庫数 From 大阪在庫
Allを省くと、重複した行を削除して足し算します。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/8e5780b561a2ca2c3a5775c35230610b-e1688778239667-1024x315.jpg)
応用情報技術者試験での出題
応用情報技術者試験を突破するのに必要な知識はこれだけです。
データの読み出し
基本形:
Select 取得したい列名 From 取得元テーブル Where 取得条件
昇順に並び替え:
Select 取得したい列名 From 取得元テーブル Order by 並び替えたい項目
重複行の削除:
Select Distinct 重複削除したい項目 From 取得元テーブル
データの平均値を取得:
Select AVG(平均したい項目) From 取得元テーブル
Group by グルーピングする項目 Having 集計結果に対する取得条件
テーブル同士の足し算:
Select 取得したい列名 From 取得元テーブル
Union (All) Select 取得したい列名 From 取得元テーブル
出題例
応用情報技術者 午前試験
令和4年度秋期問28
“商品”表に対して、次のSQL文を実行して得られる仕入先コード数は幾つか。
〔SQL文〕
SELECT DISTINCT 仕入先コード FROM 商品
WHERE (販売単価 – 仕入単価) >
(SELECT AVG (販売単価 – 仕入単価) FROM 商品)
![](https://shikaku-dou.com/wp-content/uploads/2023/07/363ea5ccbe3c2213ba7f696b066d395a-e1688797745688-1024x732.jpg)
ア 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超のデータです。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/e19bfeb78faec22a6f2fc6ed37760c07-e1688798817749-1024x481.jpg)
ここから仕入先コードの重複を削除するので結果は以下になります。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/0bc56d0e3c72f600a8f354e99f550662-e1688799130822-1024x194.jpg)
よって取得できる仕入先コードが3個なので答えはウです。
応用情報技術者 午前試験
令和3年度秋期問29
“部門別売上別”表から、部門コードごと、期ごとの売上を得るSQL文はどれか。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/f845ee70eaa3a85169eda85a9a369d8a-e1688799463369-1024x394.jpg)
ア SELECT 部門コード,’第1期’ AS 期, 第1期売上 AS 売上
FROM 部門別売上
INTERSECT
(SELECT 部門コード,’第2期’ AS 期, 第2期売上 AS 売上
FROM 部門別売上)
ORDER BY 部門コード,期
イ SELECT 部門コード,’第1期’ AS 期, 第1期売上 AS 売上
FROM 部門別売上
UNION
(SELECT 部門コード,’第2期’ AS 期, 第2期売上 AS 売上
FROM 部門別売上)
ORDER BY 部門コード,期
ウ SELECT A.部門コード,’第1期’ AS 期, A.第1期売上 AS 売上
FROM 部門別売上 A
CROSS JOIN
(SELECT B.部門コード,’第2期’ AS 期, B.第2期売上 AS 売上
FROM 部門別売上 B) T
ORDER BY 部門コード,期
エ SELECT A.部門コード,’第1期’ AS 期, A.第1期売上 AS 売上
FROM 部門別売上 A
INNER JOIN
(SELECT B.部門コード,’第2期’ AS 期, B.第2期売上 AS 売上
FROM 部門別売上 B) T ON A.部門コード = T.部門コード
ORDER BY 部門コード,期
正解は”イ”
UNIONでは表同士を純粋に足し算します。
SELECT 部門コード,’第1期’ AS 期, 第1期売上 AS 売上 FROM 部門別売上
このSQLから得られる結果は以下の通りです。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/26e6b4b1df72fe2f13bab31c24f654f7-e1688800454857-1024x248.jpg)
SELECT 部門コード,’第2期’ AS 期, 第2期売上 AS 売上 FROM 部門別売上
このSQLから得られる結果は以下の通りです。
![](https://shikaku-dou.com/wp-content/uploads/2023/07/7f547155e5e682df755845bd9481609c-e1688800711283-1024x223.jpg)
以上2つの表を足し算し、部門コード、期で昇順に並び替えると問題文の表が取得できます。
ちなみに、
ア INTERSECTでは2つの表で共通している項目が取得できます。今回だと共通している部分が無いので結果は何もなしになります。
ウ CROSS JOINでは2つの表に存在するデータの全ての組み合わせを取得できます。ちなみに問題文のSQLは引っ掛けになっているのでCROSS JOIN本来の使い方とは違う形で書かれています。
エ INNER JOINでは表同士を横に結合できます。こちらも問題文のSQLは引っ掛けになっているのでINNER JOIN本来の使い方とは違う形で書かれています。
応用情報技術者 午前試験
平成31年度春期問28
過去3年分の記録を保存している”試験結果”表から、2018年度の平均点数が600点以上となったクラスのクラス名と平均点数の一覧を取得するSQL文はどれか。ここで、実線の下線は主キーを表す。
試験結果(学生番号, 受験年月日, 点数, クラス名)
ア SELECT クラス名, AVG(点数), FROM 試験結果
GROUP BY クラス名 HAVING AVG(点数) >= 600
イ SELECT クラス名, AVG(点数), FROM 試験結果
WHERE 受験年月日 BETWEEN ‘2018-04-01’ AND ‘2019-03-31’
GROUP BY クラス名 HAVING AVG(点数) >= 600
ウ SELECT クラス名, AVG(点数), FROM 試験結果
WHERE 受験年月日 BETWEEN ‘2018-04-01’ AND ‘2019-03-31’
GROUP BY クラス名 HAVING 点数 >= 600
エ SELECT クラス名, AVG(点数), FROM 試験結果
WHERE 点数 >= 600
GROUP BY クラス名
HAVING (MAX(受験年月日)
BETWEEN ‘2018-04-01’ AND ‘2019-03-31’)
正解は”イ”
ア 期間を絞っていないので×です。
ウ HAVINGは集計結果や平均結果などグルーピングした結果にのみ適用されます。ここでは点数を指定しているのでエラーとなります。
エ MAX関数はグルーピングした結果に該当するのでエラーにはなりませんが、受験年月日が最も大きいデータ(2019-03-31)のみ集計することになるので×です。