WebプログラミングU

 目次へ 前へ 次へ

2010/4/1 久米

付録 2.4 SQL高度な問い合わせ

準備

  1. 名簿エクスポートファイルからデータをインポート
  2. 都道府県コードから表を作る

都道府県コードの表 todofuken

列名 データ型
kencode char(2)
kenmei varchar(8)

2.4.1 複数の表からデータを得る

東京都の人を検索する

文法 説明
SELECT 列名, ...
FROM 表1, 表2
WHERE 表1.列名=表2.列名
SELECT todofuken.kencode, kenmei, sei, mei
FROM meibo, todofuken
WHERE meibo.kencode=todofuken.kencode
AND todofuken.kenmei='東京都'
WHERE句のところに
同じ意味を持つ列同士を=で結ぶ
あとは、検索条件をANDで続ける

演習1 大阪府の人を検索せよ

演習2 東京都でかつ一人暮らしの人を検索せよ

2.4.2 データを計算した結果を得る

問い合わせ
種類
関数
件数 COUNT(列名or * ) SELECT COUNT(*)
FROM meibo
合計 SUM(列名) SELECT SUM(kazoku)
FROM meibo
平均 AVG(列名) SELECT AVG(kazoku)
FROM meibo
最大 MAX(列名) SELECT MAX(tanjobi)
FROM meibo
最小 MIN(列名) SELECT MIN(tanjobi)
FROM meibo
文字列
連結
CONCAT(列名, ..) SELECT CONCAT(sei, mei, 'さん')
FROM meibo

2.4.3 データのグループ化

文法 説明
SELECT グループ化する列名, ...
FROM 表
GROUP BY グループ化する列名
SELECT kencode, AVG(kazoku)
FROM meibo
GROUP BY kencode
GROUP BYで
グループ化する列を
指定する

グループ化した検索結果に対する条件

文法 説明
SELECT グループ化する列名, ...
FROM 表
GROUP BY グループ化する列名
HAVING 条件
SELECT kencode, AVG(kazoku) a
FROM meibo
GROUP BY kencode
HAVING a>1
HAVINGの後に
条件を記述
左記は
AVG(kazoku)>1でも可

※ AVG(kazoku) a の意味はAVG(kazoku)をaという印でアクセスできるようにしたもの。

演習3

4.4.1の複数表検索を利用して、kencodeごとではなく、kenmeiごとにグループ化し
kenmeiごとの最大家族数を検索せよ

 

2.4.4 NULLの検索

文法 説明
SELECT 列名, ...
FROM 表
WHERE 列名 IS NULL
(あるいは
WHERE 列名 IS NOT NULL)

SELECT sei, mei
FROM meibo
WHERE tatemono IS NULL

NULLの検索は
列名=NULL
ではなく
列名 IS NULL

 

2.4.5 表の結合

等価結合

文法 説明
SELECT 列名, ...
FROM 表1 INNER JOIN 表2
ON 表1.列名=表2.列名
SELECT kenmei, sei, mei
FROM meibo INNER JOIN todofuken
ON meibo.kencode=todofuken.kencode

SELECT kenmei, sei, mei
FROM meibo, todofuken
WHERE meibo.kencode=todofuken.kencode
と同じ意味

外部結合 左外部結合

文法 説明
SELECT 列名, ...
FROM 表1 LEFT JOIN 表2
ON 表1.列名=表2.列名
SELECT kenmei, sei, mei
FROM meibo LEFT JOIN todofuken
ON meibo.kencode=todofuken.kencode

右側に記述した表に該当する値がなくても
NULL値で置き換えて取り出す。
(つまり左側の表の行は全て取り出される)

外部結合 右外部結合

文法 説明
SELECT 列名, ...
FROM 表1 RIGHT JOIN 表2
ON 表1.列名=表2.列名
SELECT kenmei, sei, mei
FROM meibo RIGHT JOIN todofuken
ON meibo.kencode=todofuken.kencode

左側に記述した表に該当する値がなくても
NULL値で置き換えて取り出す。
(つまり右側の表の行は全て取り出される)