(1)重複行を取り除くDISTINCT
所属部署が総務部の行は2件ありますが、以下のようにDISTINCTを指定すると、重複行を取り除き出力することができます。
SELECT DISTINCT 所属部署 FROM 社員
所属部署 | |
---|---|
営業部 | |
総務部 | |
(2)NULLを置換できるCOALESCE関数
休暇日数にはNULLが格納されていますが、COALESCE関数を利用すると、NULLを指定した値に置き換えて出力することができます。
SELECT 社員名, COALESCE(休職日数, 0) FROM 社員
社員名 | 休職日数 | |
---|---|---|
安達 | 0 | |
伊藤 | 0 | |
宇部 | 0 | |
(3)条件式を指定するCASE
CASEにより条件式を指定できます。以下では集約関数SUMにおいて「勤続年数が4より大きい場合は1として集計」という条件式を指定し、所属部署ごとに勤続年数が4より大きい行の数を求めています。
SELECT 所属部署, SUM(CASE WHEN 勤続年数 > '4' THEN 1 ELSE 0 END) AS 中堅社員数 FROM 社員 GROUP BY 所属部署
社員名 | 休職日数 | |
---|---|---|
安達 | 0 | |
伊藤 | 0 | |
宇部 | 0 | |
(4)「問合せ結果」に問合せる副問合せ
SELECT文の実行結果を表と見なし、これに対し、問合せや条件指定を行います。
SELECT 列名1, 列名2,… FROM(SELECT文)
SELECT 列名1, 列名2,… FROM テーブル名 WHERE 条件 (SELECT文)
一見複雑そうに見えますが、上記(SELECT文)の箇所がどのような表になるかを描いてみるとイメージし易くなります。
二つの表“納品”、“顧客”に対する次のSQL文と同じ結果が得られるSQL文はどれか。
SELECT 顧客番号, 顧客名 FROM 顧客 WHERE 顧客番号 IN (SELECT 顧客番号 FROM 納品 WHERE 商品番号 = 'G1')
ア SELECT 顧客番号, 顧客名 FROM 顧客
WHERE 'G1' IN (SELECT 商品番号 FROM 納品)
イ SELECT 顧客番号, 顧客名 FROM 顧客
WHERE 商品番号 IN
(SELECT 商品番号 FROM 納品
WHERE 商品番号 = 'G1')
ウ SELECT 顧客番号, 顧客名 FROM 納品, 顧客
WHERE 商品番号 = 'G1'
エ SELECT 顧客番号, 顧客名 FROM 納品, 顧客
WHERE 納品.顧客番号 = 顧客.顧客番号 AND 商品番号 = 'G1'
(H17春DB午前問37)
解答 演習11-1 エ
*囲み内をクリックすると解答を表示します(表示後ページをリロードすると、再び非表示になります)
(5)集合演算子
SELECT文とSELECT文の間に「集合演算子」を用いることで、集合演算を行うことができます。次のSQL文は発注先と支払先のどちらかにある取引先コードを出力(和集合)します。
SELECT 取引先コード FROM 発注先 UNION ALL SELECT 取引先コード FROM 支払先
利用できる集合演算子 | UNION | 和集合 |
---|---|---|
EXCEPT | 差集合 | |
INTERSECT | 積集合 | |
※集合演算子の後にALL を付与すると、重複する行も全て表示します
(ALL を付与しない場合は、重複行は1行にまとめられます)
※演算対象となる両SQL文において、列名の型と数を合わせる必要があります
Copyright © ITmedia, Inc. All Rights Reserved.