データベース初心者の基礎知識ブログ
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

副問合せが行を返すかチェックは EXISTS で

副問合せの式で、特定の列を指定する場合は ANY を使いますが、行そのものがあるかどうかを調べるには、EXISTS を使うこともできます。

20100902_08.jpg

このテーブルから、50点以上取っている生徒を検索する場合、ANY を使えば、

SELECT 生徒テーブル.名前
FROM 生徒テーブル
WHERE 50 <=
ANY ( SELECT 点数 FROM 成績テーブル
WHERE 生徒テーブル.生徒ID = 成績テーブル.生徒ID )

こんな感じでしたね。

これを EXISTS(マッチする行が存在するかどうか)を使ってみると、

SELECT 生徒テーブル.名前
FROM 生徒テーブル
WHERE
EXISTS ( SELECT * FROM 成績テーブル
WHERE 生徒テーブル.生徒ID = 成績テーブル.生徒ID
AND 成績テーブル.点数 >= 50 )

こんな風に書きます。

条件の50点以上のところが、ANY の場合は服問汗の外側に、EXISTS の場合は内側になりますね。

 

副問合せの ANY を IN で書き換えてみよう

さて、副問合せの ANY ですが、IN 演算子を使っても書き換えられます。

20100902_08.jpg

このテーブルで

この2つのテーブルから、国語でも算数でもいいから、50点以上取った生徒を検索したい、

とすると、

SELECT 生徒テーブル.名前
FROM 生徒テーブル
WHERE 50 <=
ANY ( SELECT 点数 FROM 成績テーブル
WHERE 生徒テーブル.生徒ID = 成績テーブル.生徒ID )

これは、IN 演算子を使ってこんな感じです。

SELECT 生徒テーブル.名前
FROM 生徒テーブル
WHERE 50 <=
IN ( SELECT 点数 FROM 成績テーブル
WHERE 生徒テーブル.生徒ID = 成績テーブル.生徒ID )

副問合せで全てにマッチする場合は ALL で

お次も同じように副問合せの話です。

今度は、どの教科も50点以上の生徒を導き出してみましょう。

20100902_08.jpg

このようなテーブルの場合は、

SELECT 生徒テーブル.名前
FROM 生徒テーブル
WHERE 50 <=
ALL ( SELECT 点数 FROM 成績テーブル
WHERE 生徒テーブル.生徒ID = 成績テーブル.生徒ID )

違いは、「ANY」との違いですね。

ALL を付けると、「すべての」ということになります。

これも副問合せを使わずに書くことができます。

SELECT 生徒テーブル.名前
FROM 生徒テーブル, 成績テーブル 国語, 成績テーブル 算数
WHERE 生徒テーブル.生徒ID = 国語.生徒ID
AND 生徒テーブル.生徒ID = 算数.生徒ID
AND 国語.教科 = '国語' AND 国語.点数 >= 50
AND 算数.教科 = '算数' AND 算数.点数 >= 50

これはちょっと難しいですね。成績のテーブルを2つ使わないとうまくいきません。

これならば ALL を使ったほうが簡単そうです。

1 | 2 | 3 | 4 | 5 | 最初次のページへ >>