2009/04/05

SELECTしたコードからSELECTする(サブクエリ)

サブクエリが使えるのはMySQL4.1以降のみ

サブクエリ・・・「副問い合わせ」
クエリを実行して取り出されたデータを使って、さらにクエリを発行する(2段階処理)

例えば、
最も売上の高い社員データを抽出するにあたって、

SELECT * FROM tb ORDER BY uria DESC LIMIT 1; (・・・①)

という方法でやってみたけれど、
サブクエリを使うと、こんなやり方ができる。

SELECT * FROM tb WHERE uria IN (SELECT MAX(uria) FROM tb); (・・・②)

もし最高売上獲得社員が複数いた場合、
①のやり方では一人しか抽出できないので、正確に最高額を売り上げた社員を割り出すことはできないが、②のやり方なら何人いても大丈夫!

GROUP BY関数
MAXAVGSUMなどの集計を行う関数はGROUP BY関数と呼ばれ、本来はグループ化したときの値を処理する。ただし、「GROUP BY・・・」がない場合は、テーブル全体を1つのグループとして処理する。

INを使う -カラムを返すサブクエリ-
サブクエリがカラムを返す例
1段階目:サブクエリで条件に一致したカラムを返す
2段階目:その値を含むレコードを対象に抽出する

サブクエリの構文
SELECT 表示するカラム FROM テーブル名 WHERE カラム名 IN (SELECTによるサブクエリでカラムを抽出);

INではなく=(イコール)を使おうとすると、サブクエリが1件以上抽出された場合は
「Subquery returns more than 1 row」
というエラーになる。
INは「・・・の中のどれか」という意味になるので、安心。

EXISTSで、存在するレコードだけを対象にする
特定のカラムではなく、1段階目のサブクエリが「対象となるレコードが存在する」という情報を返す

NOT EXISTSで、サブクエリによって抽出されないレコードを対象にして処理する

0 件のコメント:

コメントを投稿