Previous: selectのネスティング
Up: サブ・クェリー
Previous Page: selectのネスティング

existsの使用

サブ・クェリーの中で、

where exists ( select ..... )
	where not exists ( select ..... )

といった形式が使われることがある。

この形式では、内側のselectが、行を見つけることに成功すれば、existsは真を返す。 逆に、not exists は、内側のselectが検索に失敗した時に、真を返す。これまで見て きたサブ・クェリーとは異なって、外側のselectは内側のselectの返す項目の値を使わ ないので、existsは、通常、次の形式で用いられる。

where exists ( select * from ..... )
	where not exists ( select * from ..... )

次の例は、existsを用いた、「データベース」という文字を含む書名の書籍を出版した 出版社の検索例である。ほとんど同じ検索である、例31(ジョイン)、例36(inを用い たサブ・クェリー)と比較して欲しい。 この例では、内側のselect文が、テーブルとしては書籍台帳しか指定していないのに、 「出版社一覧.出版社コード」という形で、外側のselect文のテーブルの修飾を受けて いることに注目せよ。

例 39: 「データベース」という書籍を出版した出版社の検索(exists)

select 出版社
	from   出版社一覧
	where  exists
	    (  select  *
	       from    書籍台帳
	       where   書名 like '%データベース%'
	               and  出版社コード = 出版社一覧.出版社コード
	    )

出版社 -------------------- HBJ出版局 オーム社 サイエンス社 JICC出版局 ダイヤモンド社 東洋経済新報社 日本科学技術情報セン 日本電気文化センター パワー社 パーソナルメディア 丸善 学術情報センター 関西データベース協議 教科書研究センター データベース振興セン 山田常雄氏追悼論集刊

(16 rows affected)

この形式が威力を発揮するのは、次のような検索の場合である。 今、ISBNを持つ本を一度も出版したことのない、小さな出版社を検索するとしよう。 まず、ISBNを持つ本の書籍番号とISBNの対からなるテーブル「ISBN一覧」の 書籍番号と書籍台帳の書籍番号を比較して、「ISBN一覧」に存在する (exists)書籍番号を持つ行を書籍台帳の中で選択する。ついで、こうして選ば れた行の中の出版社コードを、出版社一覧の出版社コードとを比較して、前者に存在 しない(not exists)コードを持つ出版社一覧の行から、項目「出版社」を出力すれば いい。

例 40: ISBNを持たない図書のみを出版した出版社の検索(exists,not exists)

select 出版社
	from   出版社一覧
	where  not exists
	    (  select  *
	       from    書籍台帳
	       where   出版社コード = 出版社一覧.出版社コード
	               and exists
	    	       (   select  *
	                   from    ISBN一覧
	                   where   書籍番号 = 書籍台帳.書籍番号
	               )
	    )

maruyama@wakhok.ac.jp
1995年02月10日 (金) 00時49分16秒 JST