8.副問い合わせによる問い合わせの解決方法

8.1 副問い合わせの基本

副問い合わせ

OracleサーバーではSQL文の中に別の問い合わせ(SELECT文)を入れ子にすることができる。この入れ子になっている内側のSELECT文のこと。外側のSELECT文が主問い合わせ。

副問い合わせを使用すると,副問い合わせの実行結果をもとに外側のSQL文を実行できるため,通常のSQL文では複数のSQL文に分けて実行しなければならない処理も1つのSQL文で処理できる。

 

基本構文

SELECT 列名 [,列名…]

FROM 表名

WHERE 列名 比較演算子 (SELECT 列名 FROM 表名

              [WHERE 条件];)

・「()」で括る

・「WHERE」以外にも「HAVING句」「FROM句」にも副問い合わせを記述できる。

・SELECT文だけでなく,INSERT文,UPDATE文にも副問い合わせできる。

・副問い合わせは比較演算子の左辺に記述しても実行できる。

・通常,副問い合わせを使用したSQL文では,副問い合わせのSELECT文が1回実行された後に,副問い合わせの実行結果を元に主問い合わせが1回実行される。

 

副問い合わせの色々な使用方法

主問い合わせと異なる表を問い合わせる副問い合わせ

主問い合わせと副問い合わせのFROM句に異なる表を指定できる。

SELECT empno,ename,deptno

FROM employees

WHERE deptno = (SELECT deptno FROM departments

        WHERE dname ='営業');

departments表からdnameが営業であるdeptnoを取り出す

取り出したdeptnoに等しいdeptnoをもつempnoとenameとdeptnoをemployees表から取り出す。

 

複数の副問い合わせを使用する主問い合わせ

1つの主問い合わせに複数の副問い合わせを使用できる。

SELECT empno, ename, sal, deptno

FROM employees

WHERE sal >= (SELECT sal FROM employees

       WHERE empno ='1003')

AND   deptno = (SELECT deptno FROM departments

          WHERE dname ='営業’);

employess表でempnoが1003であるsalの値以上であるsal

かつ

departments表のdnameが営業であるdeptno

であるempno,ename,sal,deptnoを表示する

 

副問合せのWHERE句以外で使用

HAVING句に副問合せを使用する。

SELECT e.deptno , d.dname ,AVG(sal)

FROM employwws e JOIN departments d

ON e.deptno = d.deptno

GROUP BY e.deptno,d.dname

HAVING AVG(sal) >= (SELECT AVG(sal) FROM emploees)

ORDER BY e.deptno; 

 employees表のでdeptnoで昇順で表示

employees表の給与の平均が全体の平均給与より高いものを表示

employees表のdeptnoとdepartment表のdnameでグループ化

それぞれの表のdeptnoで結合する

 

FROM句での副問合せの使用

FROM句に指定された副問合せが実行されて実行したSELECT文の結果セットが1つの表のように扱われる。ビューに似てるので「インラインビュー」と呼ばれる。

SELECT empno, ename, sal

 FROM   (SELECT empno, ename, sal FROM employees

    WHERE deptno = 30);

 

データを1件も戻さない副問合せ

副問合せの実行結果が0件の場合,主問合わせにはNULL値が戻されるため,主問合わせの実行結果も0件になる。

 

8.2 単一行副問い合わせと複数行副問い合わせ

副問い合わせは,主問合せに戻すデータの件数によって「単一行副問合せ」と「複数行副問合せ」の2つに分類される。

 

単一行副問合せ

データを1件だけ戻す副問合せ。

WHERE句の比較演算子に単一行演算子を使用する。

単一行演算子

=  等しい

>  大きい

>= 以上

< 小さい

<= 以下

<>,=!,^= 等しくない

 

 

複数行副問合せ

複数件のデータを戻す副問合せ。

WHERE句の比較演算子に複数行演算子を使用する

複数行演算子

・IN(値のりすと)

リスト内のいずれかの値と等しければTRUE

・単一行演算子+ANY(値のリスト)

リスト内のいずれかの値が条件を満たすとTRUE

直前に単一行演算子を使用する。「=ANY」「>ANY」など。

=ANYはINと同じ意味。

 ・単一行演算子+ALL(値のリスト)

リスト内のすべての値が条件を満たすとTRUE

直前に単一行演算子を使用する。「<>ALL」「<ALL」など。

 複数行問合せと比較する比較演算子に単一行演算子のみを使用するとエラーになる。

 

副問合せにおけるIN演算子とNULL値

NOT IN(リスト)は<>ALL(リスト)と同じ。

NOT IN(リスト)はリスト内の全ての値がと等しくない場合にTRUEを返す。

NOT INのリストにNULL値が含まれるとデータは1件も戻されない。