恥ずかしくないSQLをかく (副問い合わせ編)

SQLの副問い合わせを学習していこうと思います。

この副問い合わせを用いることで、複雑なSQL文を書くことができるようになります。

使用DBはOracleです。

そもそも副問い合わせとは、あるSQL文の中に埋め込まれたSELECT文のことを言いますが、

日本語にするとよくわからないので、ここはさらりと流してくれて結構です。

まずは、副問い合わせの基本構文を確認しましょう。

SELECT 列名

FROM 表名

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

です。上記の()内のSELECT文が副問い合わせです。

教科書通りの説明書きを見ても分かりづらいと思うので、実際のSQL文を見ていきましょう。

下のようなEMP表があったとします。

EMPNO ENAME SAL JOB

                • -------- ------- -------------

0001 SUZUKI 10000 MANAGER

0004 SATO 2000 LEADER

0005 YAMADA 11000 MANAGER

それでは実際に副問い合わせを用いたSELECT文を書いてみましょう。

SELECT EMPNO, ENAME

FROM EMP

WHERE JOB IN (SELECT JOB FROM EMP WHERE EMPNO = 0001);

上のSELECT文では、

(EMPNOが0001と同一のJOBのものの)EMPNOとENAMEを取得する

つまり(JOBがMANAGERの人の)EMPNOとENAMEを取得する

というものになります。よって結果は、

EMPNO ENAME

                • -------

0001 SUZUKI

0005 YAMADA

となります。

また副問い合わせで得た結果の値を更新したり、挿入したりすることもできます。

UPDATE文でどういうことか確認してみましょう。

UPDATE EMP SET SAL = (SELECT SAL FROM EMP WHERE EMPNO = 0001)

WHERE EMPNO = 0005;

上記のUPDATE文は、

EMPNOが0005のSALの値を(EMPNOが0001のSALの値に)更新する

つまり、EMPNOが0005のSALの値を(10000に)更新する

という文章になります。表内を確認してみましょう。

SELECT * FROM EMP;

EMPNO ENAME SAL JOB

                • -------- ------ -------------

0001 SUZUKI 10000 MANAGER

0004 SATO 2000 LEADER

0005 YAMADA 10000 MANAGER

と表示されます。

このように、副問い合わせを用いることで、様々なバリエーションのSQL文を書くことができるのです。