「SQLによる検索」を実践する「データベーススペシャリスト試験」戦略的学習のススメ(12)(2/4 ページ)

» 2017年07月11日 05時00分 公開

SELECT文に関するその他のテクニック

(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文)の箇所がどのような表になるかを描いてみるとイメージし易くなります。

演習11-1

 二つの表“納品”、“顧客”に対する次のSQL文と同じ結果が得られるSQL文はどれか。

SELECT 顧客番号, 顧客名 FROM 顧客
  WHERE 顧客番号 IN
  (SELECT 顧客番号 FROM 納品
     WHERE 商品番号 = 'G1')
演習11-1

ア 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。