「副問合せ」とは,メインのSQL文の中に,サブのSELECT文を記述したものを言います。簡単に言うと,SELECT文の中に埋め込まれたもうひとつのSELECT文のことです。

 副問合せは,WHERE句,UPDATE文のSET句などに使用することができますが,Bronze SQL試験対策としては,WHERE句で使用する副問合せを学習すればいいでしょう。

 副問合せにおける重要なポイントは,「単一行副問合せ」なのか「複数行副問合せ」なのかです。さらに,付け加えると,「単一列副問合せ」と「複数列副問合せ」というのもあります(表1)。Bronze SQL試験で重要なのは,「単一列の単一行副問合せ」と「単一列の複数行副問合せ」です。

表1●副問合わせ
種類概要
単一行副問合せ副問合せから,1行のみが戻される
複数行副問合せ副問合せから,複数行が戻される
単一列副問合せ副問合せから,1列のみが戻される
複数列副問合せ副問合せから,複数列が戻される

副問合わせの種類を知る

 例えば,図1のSQL文において,メインのSQL文は,「SELECT DNAME FROM DEPT WHERE DEPTNO = ・・・」であり,サブのSELECT文は,「SELECT MAX(DEPTNO) FROM EMP」です。なお,サブのSELECTは必ず括弧「( )」で囲みます。

図1●単一行副問合せ
図1●単一行副問合せ

 サブのSELECT文である「SELECT MAX(DEPTNO) FROM EMP」は,EMP表のDEPTNO列における最も大きな値をひとつだけ戻します。つまり,単一行副問合せです。また,DEPTNO列の値しか戻さないので,「単一列副問合せ」でもあると言えます。

 図2におけるサブのSELECT文は,「SELECT DEPTNO FROM EMP」です。DEPTNO列の値しか戻さないので,「単一列副問合せ」であることは,図1と同じですが,EMP表に含まれる全行のDEPTNO列の値が戻されるので「複数行副問合せ」です(EMP表には14件の行が存在します,図3)。

図2●複数行副問合せ
図2●複数行副問合せ

図3●EMP表の全行
図3●EMP表の全行 [画像のクリックで拡大表示]

 図4におけるサブのSELECT文は,「SELECT DEPTNO,MAX(SAL) FROM EMP GROUP BY DEPTNO」です。サブのSELECT文は,DEPTNO列とMAX(SAL)の2列の値を戻しますので,複数列副問合せです。

図4●複数列副問合せ
図4●複数列副問合せ

 複数列副問合せを使用する場合は,メインのSQL文(図4では「SELECT DEPTNO,ENAME,SAL FROM EMP WHERE ・・・」)内の比較する列(図4ではDEPTNOとSAL)を,括弧で囲んで複数列指定する必要があります。

 図4の場合,副問合せからはDEPTNOの値ごとに1行ずつ戻されます。つまり,副問合せからは複数行戻されるので,複数列の複数行副問合せであることが分かります。