データベース初心者の基礎知識ブログ -2ページ目

副問合せでどれかにマッチする場合は ANY で

さて、副問合せの問題では、こんな表を使いましょう。

20100902_08.jpg

生徒テーブルと、成績のテーブルですね。

この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 句で条件を繋げていきます。

20100819_05.jpg

こんな結果を得る場合は、

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

20100831_10.jpg

解答

フロアが2階にある部門に所属する社員の数、なので、こうなりますね。

20100831_11.jpg