副問合せでどれかにマッチする場合は ANY で
さて、副問合せの問題では、こんな表を使いましょう。
生徒テーブルと、成績のテーブルですね。
この2つのテーブルから、国語でも算数でもいいから、50点以上取った生徒を検索したい、
とすると。
SELECT 生徒テーブル.名前
FROM 生徒テーブル
WHERE 50 <=
ANY ( SELECT 点数 FROM 成績テーブル
WHERE 生徒テーブル.生徒ID = 成績テーブル.生徒ID )
こんな風に、ANY を使います。
副問合せ(サブクエリ)で、点数の結果を出しておいて、それらが50点以上だったら、という検索をします。
これを副問合せを使わない方法でも書けます。
SELECT DISTINCT 生徒テーブル.名前
FROM 生徒テーブル, 成績テーブル
WHERE 生徒テーブル.生徒ID = 成績テーブル.生徒ID
AND 成績テーブル.点数
成績テーブルから点数を検索した後に、重複をDISTINCTで省きます。
どちらも同じ結果が得られますね。
条件にSELECTを入れるのが副問合せ
RDBMS の R(Relational)な部分へ突入します。
データベースでSQL文を作るときは、2つ以上のテーブルを組み合わせて作ることがとても多いです。
このテーブルの組み合わせで、たいていの場合は、WHERE 句で条件を繋げていきます。
こんな結果を得る場合は、
SELECT 手帳テーブル.名前
FROM 手帳テーブル, 趣味テーブル
WHERE 手帳テーブル.趣味ID = 趣味テーブル.ID
AND 趣味テーブル.趣味 = '車'
この例で、副問い合わせを使ってみましょう。
副問い合わせっていうのは、WHERE 句に SELECT 文が入る、特殊なパターンです。
基本は、副問い合わ(サブクエリともいう)を使わないパターンが良いのですが、どうしてもうまくいかない、という時に使います。
SELECT 手帳テーブル.名前
FROM 手帳テーブル
WHERE 手帳テーブル.趣味ID = (
SELECT 趣味テーブル.ID
FROM 趣味テーブル
WHERE 趣味テーブル.趣味 = '車 )
こんな風になります。
これを解説すると、まず、副問い合わせで、趣味が車の ID を検索します。
SELECT 手帳テーブル.名前
FROM 手帳テーブル
WHERE 手帳テーブル.趣味ID = (
SELECT 趣味テーブル.ID
FROM 趣味テーブル
WHERE 趣味テーブル.趣味 = '車 )
これを検索すると、「1」になりますね。
SELECT 手帳テーブル.名前
FROM 手帳テーブル
WHERE 手帳テーブル.趣味 = (
1 )
そして、手帳テーブルから趣味IDが、「1」な人を検索しする、という手順です。
この副問合せ、これだけだと意味がないように見えるのですが(事実、できるだけ、副問合せを使わない書き方のほうが分かり易いです)、限定比較述語ってのを使うときに役に立ちます。
午前の問題4
問題
社員テーブルと部門テーブルに対して、次のSQLを実行したときの結果は?
SELECT COUNT(*)
FROM 社員, 部門
WHERE 社員.所属 = 部門.部門名 AND 部門.フロア = 2
解
答
は
こ
ち
ら
解答
3
フロアが2階にある部門に所属する社員の数、なので、こうなりますね。