恥ずかしくない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文を書くことができるのです。