20040229

第5章 副問合せ

5-1 単一行副問合せ
■主たる問合せの前に副問合せを実行し、この結果を主問合せで使用する
「EMPLOYEES表の中で平均以上のSALARYを得ている人を表示」
(1) 平均給与を求める。 SELECT AVG(SALARY)
FROM EMPLOYEES;
(2) 算出したその平均給与を使って従業員を調べる。 SELECT FIRST_NAME, LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY>=
(SELECT AVG(SALARY)
FROM EMPLOYEES);
  ・副問合せ部分はカッコで囲む
  ・副問合せの中にORDER BY句は含めない
  ・副問合せは比較演算子の右側に配置する
  ・副問合せがNULLを返す場合、IS NULL、IS NOT NULL演算子を使用しない限り、主問合せはデータを戻さない


5-2 複数行副問合せ
■副問合せから複数の行が返されるものを複数行副問合せと言う
演算子 説明
IN 値リストの中のいずれかの値と等しい SELECT DEPARTMENT_ID, FIRST_NAME, 
LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY IN
(SELECT MAX(SALARY)
FROM EMPLOYEES GROUP BY DEPARTMENT_ID);
NOT IN 値リストの中のいずれかの値とも等しくない SELECT DEPARTMENT_ID, FIRST_NAME, 
LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY NOT IN
(SELECT MAX(SALARY)
FROM EMPLOYEES GROUP BY DEPARTMENT_ID);
ANY 副問合せから戻された値のいずれかの値と比較 SELECT DEPARTMENT_ID, FIRST_NAME, 
LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY < ANY
(SELECT MAX(SALARY)
FROM EMPLOYEES GROUP BY DEPARTMENT_ID);
ALL 副問合せから戻された値のすべての値と比較 SELECT DEPARTMENT_ID, FIRST_NAME, 
LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY >=ALL
(SELECT MAX(SALARY)
FROM EMPLOYEES GROUP BY DEPARTMENT_ID);



5-3 複数列副問合せ
■副問合せが複数の列を戻しているものを複数列副問合せと言う
「DEPARTMENT_IDとJOB_IDの両方がLexさんと同じ方を表示。」
(単一行副問合せ) AND (単一行副問合せ) 複数列副問合せ
SELECT DEPARTMENT_ID, JOB_ID, FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE DEPARTMENT_ID =
(SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE FIRST_NAME = 'Lex')
AND JOB_ID =
(SELECT JOB_ID
FROM EMPLOYEES
WHERE FIRST_NAME = 'Lex');
SELECT DEPARTMENT_ID, JOB_ID, FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE (DEPARTMENT_ID, JOB_ID) =
(SELECT DEPARTMENT_ID, JOB_ID
FROM EMPLOYEES
WHERE FIRST_NAME = 'Lex');