「副問合せ」とは,メインのSQL文の中に,サブのSELECT文を記述したものを言います。簡単に言うと,SELECT文の中に埋め込まれたもうひとつのSELECT文のことです。
副問合せは,WHERE句,UPDATE文のSET句などに使用することができますが,Bronze SQL試験対策としては,WHERE句で使用する副問合せを学習すればいいでしょう。
副問合せにおける重要なポイントは,「単一行副問合せ」なのか「複数行副問合せ」なのかです。さらに,付け加えると,「単一列副問合せ」と「複数列副問合せ」というのもあります(表1)。Bronze SQL試験で重要なのは,「単一列の単一行副問合せ」と「単一列の複数行副問合せ」です。
種類 | 概要 |
---|---|
単一行副問合せ | 副問合せから,1行のみが戻される |
複数行副問合せ | 副問合せから,複数行が戻される |
単一列副問合せ | 副問合せから,1列のみが戻される |
複数列副問合せ | 副問合せから,複数列が戻される |
副問合わせの種類を知る
例えば,図1のSQL文において,メインのSQL文は,「SELECT DNAME FROM DEPT WHERE DEPTNO = ・・・」であり,サブのSELECT文は,「SELECT MAX(DEPTNO) FROM EMP」です。なお,サブのSELECTは必ず括弧「( )」で囲みます。
![]() |
図1●単一行副問合せ |
サブのSELECT文である「SELECT MAX(DEPTNO) FROM EMP」は,EMP表のDEPTNO列における最も大きな値をひとつだけ戻します。つまり,単一行副問合せです。また,DEPTNO列の値しか戻さないので,「単一列副問合せ」でもあると言えます。
図2におけるサブのSELECT文は,「SELECT DEPTNO FROM EMP」です。DEPTNO列の値しか戻さないので,「単一列副問合せ」であることは,図1と同じですが,EMP表に含まれる全行のDEPTNO列の値が戻されるので「複数行副問合せ」です(EMP表には14件の行が存在します,図3)。
![]() |
図2●複数行副問合せ |
![]() |
図3●EMP表の全行 [画像のクリックで拡大表示] |
図4におけるサブのSELECT文は,「SELECT DEPTNO,MAX(SAL) FROM EMP GROUP BY DEPTNO」です。サブのSELECT文は,DEPTNO列とMAX(SAL)の2列の値を戻しますので,複数列副問合せです。
![]() |
図4●複数列副問合せ |
複数列副問合せを使用する場合は,メインのSQL文(図4では「SELECT DEPTNO,ENAME,SAL FROM EMP WHERE ・・・」)内の比較する列(図4ではDEPTNOとSAL)を,括弧で囲んで複数列指定する必要があります。
図4の場合,副問合せからはDEPTNOの値ごとに1行ずつ戻されます。つまり,副問合せからは複数行戻されるので,複数列の複数行副問合せであることが分かります。