Q2: 選択 (1/3)
Q. populationテーブル内のレコードのうち,
都道府県が愛知県であるものを表⽰する
SQL⽂を書け.
SELECT * FROM population
WHERE 都道府県 = “愛知県”;
A.
Slide 35
Slide 35 text
部分⽂字列のマッチング
SELECT * FROM population
WHERE 都道府県 LIKE “%京都%”;
LIKE句を使うと部分文字列判定が可能
地域コード 都道府県 調査年度 総人口 …
R01300 東京都 2021 14010000 …
R02600 京都府 2021 2561000 …
R01300 東京都 2020 14047594 …
R02600 京都府 2020 2578087 …
テーブル:population
パーセント記号は0⽂字以上の任意の⽂字
Slide 36
Slide 36 text
WHERE句の中で使える演算⼦の例
演算子 意味
A = B AはBである
A != B AはBでない
A > B AはBより大きい
A >= B AはB以上
X BETWEEN A AND B XはA以上B以下
A IN (B, C, D) AはB,C,Dのいずれか
A LIKE ‘xxx%’ Aはxxxから始まる文字列
A AND B AかつB
A OR B AまたはB
参考:https://www.sejuku.net/blog/51583
四則演算⼦はどこでも使える
Slide 37
Slide 37 text
複数条件の指定
SELECT 都道府県 FROM population
WHERE 総⼈⼝ ≧ 1000000 AND
⼤学学⽣数 > ⾼等学校⽣徒数 ;
論理演算子AND/ORで複数条件指定が可能
都道府県
東京都
京都府
大阪府
…
テーブル:population
( )
( )
丸括弧で条件を
明確化できる
Q3: 選択 (2/3)
Q. populationテーブル内のレコードのうち
§ 総⼈⼝が300万⼈未満,かつ
§ 都道府県名が県で終わる,かつ
§ 中学校⽣徒数が⾼等学校⽣徒数以下
のレコードを求める表⽰するSQL⽂を書け.
SELECT * FROM population WHERE
総⼈⼝ < 3000000 AND 都道府県
LIKE “%県” AND 中学校⽣徒数 ≦
⾼等学校⽣徒数;
A.
Slide 40
Slide 40 text
コラム: SQLでは改⾏は無視される
SELECT 都道府県 FROM population WHERE
総⼈⼝ ≧ 1000000 AND ⼤学学⽣数
> ⾼等学校⽣徒数;
SELECT
都道府県
FROM
population
WHERE
(総⼈⼝ ≧ 1000000)
AND (⼤学学⽣数 > ⾼等学校⽣徒数);
=
⾃分・他⼈にとって可読性の⾼いコードを書こう
Q3: 選択 (2/3)
Q. populationテーブル内のレコードのうち
§ 総⼈⼝が300万⼈未満,かつ
§ 都道府県名が県で終わる,かつ
§ 中学校⽣徒数が⾼等学校⽣徒数以下
のレコードを求める表⽰するSQL⽂を書け.
SELECT
*
FROM
population
WHERE
総⼈⼝ < 3000000
AND 都道府県 LIKE “%県”
AND 中学校⽣徒数 ≦ ⾼等学校⽣徒数;
A.
Slide 43
Slide 43 text
コラム: 重複を許してしまうSQL
SQLは関係データモデルを扱うにも関わらず
問い合わせ結果に重複を許す
SELECT
都道府県
FROM
population
WHERE
(総⼈⼝ ≧ 1000000)
AND
(⼤学学⽣数 > ⾼等学校⽣徒数);
都道府県
東京都
京都府
大阪府
東京都
京都府
大阪府
SQLの仕様として覚えておく
Slide 44
Slide 44 text
DISTINCT修飾句
DISTINCT句は問い合わせ結果から
重複レコードを除外する
SELECT DISTINCT
都道府県
FROM
population
WHERE
(総⼈⼝ ≧ 1000000)
AND
(⼤学学⽣数 > ⾼等学校⽣徒数);
都道府県
東京都
京都府
大阪府
Q4: 選択 (3/3)
Q. Q3のSQL⽂を修正して,Q3の条件を満たす
都道府県を表⽰するSQL⽂を書け. ただし,
出⼒される都道府県名に重複があってはなら
ない.
SELECT DISTINCT
都道府県
FROM
population
WHERE
総⼈⼝ < 3000000
AND 都道府県 LIKE “%県”
AND 中学校⽣徒数 ≦ ⾼等学校⽣徒数;
A.
Slide 47
Slide 47 text
整列(1/2)
SELECT * FROM population
ORDER BY 総⼈⼝ LIMIT 10;
ORDER BY句は指定した列の値でレコードをソート
地域コード 都道府県 調査年度 総人口 …
R03100 鳥取県 2021 549000 …
R03100 鳥取県 2020 553407 …
R03200 島根県 2021 665000 …
…
テーブル:population
総⼈⼝の昇順で
レコードを並び替える
昇
順
Slide 48
Slide 48 text
整列(2/2)
SELECT * FROM population
ORDER BY 総⼈⼝ DESC LIMIT 10;
降順(大きい順)にソートする時はDESCを指定
地域コード 都道府県 調査年度 総人口 …
R01300 東京都 2020 14047594 …
R01300 東京都 2021 14010000 …
R01400 神奈川県 2020 9237337 …
…
テーブル:population
総⼈⼝の降順で
レコードを並び替える
降
順
Q5: ソート (1/2)
Q. populationテーブル内のレコードのうち調査
年度が2021のものについて,⼤学学⽣数順の
⼤きいもの順に並び替えて表⽰するSQL⽂を
書け.
SELECT
*
FROM
population
WHERE
調査年度 = 2021
ORDER BY
⼤学学⽣数 DESC;
A.
Q6: ソート (2/2)
Q. populationテーブル内のレコードのうち調査
年度が2021のものについて,総⼈⼝に占める
⼤学学⽣数の割合が⼤きいもの順に並び替え
て表⽰するSQL⽂を書け. その際,総⼈⼝に
占める⼤学学⽣数の割合も合わせて表⽰せよ.
SELECT
*,
⼤学学⽣数 / 総⼈⼝ AS ⼤学⽣割合
FROM
population
WHERE
調査年度 = 2021
ORDER BY
⼤学学⽣数 / 総⼈⼝ DESC;
A.
GROUP BY(1/3)
都道府県 年度 総人口
北海道 2021 5183000
青森県 2021 1221000
…
北海道 2020 5524614
青森県 2020 1237984
…
年度が同じ値のものを
グループとしてまとめる
SELECT 年度, SUM(総⼈⼝)
FROM population GROUP BY 年度;
GROUP BY句は指定した列の値が同じもの
をグループ化
Slide 61
Slide 61 text
GROUP BY(1/3)
都道府県 年度 総人口
北海道 2021 5183000
青森県 2021 1221000
…
北海道 2020 5524614
青森県 2020 1237984
…
SELECT 年度, SUM(総⼈⼝)
FROM population GROUP BY 年度;
GROUP BY句は指定した列の値が同じもの
をグループ化
年度 SUM(総人口)
2021 125500000
2020 126146099
Slide 62
Slide 62 text
GROUP BY(2/3)
SELECT 年度, SUM(総⼈⼝)
FROM population GROUP BY 年度;
SELECTの中に
GROUP BYで指定した列名を入れる
Slide 63
Slide 63 text
GROUP BY(3/3)
都道府県 年度 総人口
北海道 2021 5183000
北海道 2020 5524614
青森県 2021 1221000
青森県 2020 1237984
岩手県 2021 1196000
岩手県 2020 1210534
都道府県が同じ値のものを
グループとしてまとめる
SELECT 都道府県, AVG(総⼈⼝)
FROM population GROUP BY 都道府県;
指定した列によってグループ化の結果は異なる
Slide 64
Slide 64 text
GROUP BY(3/3)
都道府県 年度 総人口
北海道 2021 5183000
北海道 2020 5524614
青森県 2021 1221000
青森県 2020 1237984
岩手県 2021 1196000
岩手県 2020 1210534
年度 AVG(総人口)
北海道 5203807
青森県 1229492
岩手県 1203267
…
SELECT 都道府県, AVG(総⼈⼝)
FROM population GROUP BY 都道府県;
指定した列によってグループ化の結果は異なる
Slide 65
Slide 65 text
Q7: GROUP BY (1/3)
Q. populationテーブル内のレコードに対して都道府県
ごとの集約演算を⾏い,都道府県別に
-(調査期間中の)⼤学学⽣数の平均
-(調査期間中の)⼤学学⽣数の最⼤値と最⼩値の差
を求めるSQL⽂を書け.
Slide 66
Slide 66 text
Q7: GROUP BY (1/3)
Q. populationテーブル内のレコードに対して都道府県
ごとの集約演算を⾏い,都道府県別に
-(調査期間中の)⼤学学⽣数の平均
-(調査期間中の)⼤学学⽣数の最⼤値と最⼩値の差
を求めるSQL⽂を書け.
SELECT
都道府県,
AVG(⼤学学⽣数) AS ⼤学⽣数平均,
MAX(⼤学学⽣数) - MIN(⼤学学⽣数) AS 差
FROM
population
GROUP BY
都道府県;
A.
Q8: GROUP BY (2/3)
A. SELECT
都道府県,
AVG(⼩学校児童数+中学校⽣徒数)
AS 義務教育⽣徒平均,
AVG(⾼等学校⽣徒数+⼤学学⽣数)
AS ⾼校・⼤学学⽣数平均,
MAX(⼤学学⽣数-⾼等学校⽣徒数),
MIN(⼤学学⽣数-⾼等学校⽣徒数)
FROM
population
WHERE
総⼈⼝ ≧ 3000000
GROUP BY
調査年度;
Slide 69
Slide 69 text
HAVING句
SELECT 都道府県, AVG(総⼈⼝)
FROM population GROUP BY 都道府県
HAVING AVG(総⼈⼝) ≧ 5000000 ;
HAVING句を使うと、集約演算結果の中から
条件を満たすものだけを抽出できる
都道府県 年度 総人口
北海道 2021 5183000
北海道 2020 5524614
青森県 2021 1221000
青森県 2020 1237984
…
年度 AVG(総人口)
北海道 5203807
青森県 1229492
岩手県 1203267
…
埼玉県 7342382
千葉県 6279740
50万以下で条件満たさず
Slide 70
Slide 70 text
HAVING句
SELECT 都道府県, AVG(総⼈⼝)
FROM population GROUP BY 都道府県
HAVING AVG(総⼈⼝) ≧ 5000000 ;
HAVING句を使うと、集約演算結果の中から
条件を満たすものだけを抽出できる
都道府県 年度 総人口
北海道 2021 5183000
北海道 2020 5524614
青森県 2021 1221000
青森県 2020 1237984
…
年度 AVG(総人口)
北海道 5203807
埼玉県 7342382
千葉県 6279740
…
HAVING句と WHERE句の違い(1/2)
SELECT 調査年度, SUM(総⼈⼝)
FROM population
GROUP BY 調査年度
HAVING SUM(総⼈⼝) >= 5000000;
HAVING句はGROUP BYの後に評価される
(GROUP BYの集約演算結果に対して絞り込みを⾏う)
都道府県 年度 総人口
北海道 2021 5183000
青森県 2021 1221000
…
北海道 2020 5524614
青森県 2020 1237984
…
年度 SUM(総人口)
2021 125500000
2020 126146099
どの結果も500万以上でOK
集約
関数
Slide 73
Slide 73 text
HAVING句と WHERE句の違い(2/2)
SELECT 調査年度, SUM(総⼈⼝)
FROM population
WHERE 総⼈⼝ ≧ 5000000
GROUP BY 調査年度;
WHERE句はGROUP BYの前に評価される
(WHERE句で絞り込まれた結果をGROUP BYする)
都道府県 年度 総人口
北海道 2021 5183000
青森県 2021 1221000
…
北海道 2020 5524614
青森県 2020 1237984
…
年度 SUM(総人口)
2021 68923000
2020 69119106
集約
関数
Slide 74
Slide 74 text
Q9: GROUP BY (3/3)
A. SELECT
都道府県,
AVG(総⼈⼝) AS ⼈⼝平均,
AVG(⾼等学校⽣徒数) AS ⾼校学⽣数平均,
AVG(⼤学学⽣数) AS ⼤学⽣数平均,
AVG(⼤学学⽣数-⾼等学校⽣徒数)
FROM
population
GROUP BY
都道府県
HAVING
⼤学学⽣数 – ⾼等学校⽣徒数 ≧ 10000;
Slide 75
Slide 75 text
SQLの記述順序([ ]の箇所は必要に応じて書く)
SELECT
列名1, 列名2, ...
FROM
参照する表1, 表2, ...
[WHERE 条件]
[GROUP BY 列名1, 列名2, ...]
[HAVING 条件]
[ORDER BY 列名1, 列名2, ...]
[LIMIT 数字] ;
記述順序を間違うとエラー発⽣
セミコロンを忘れない!!