INSERT文の構文をじっくり紹介。基本構文から、条件を指定して処理を分岐させる方法も理解しておこう。今回はExcelで作成したデータの簡単なDBへの移植方法も紹介する。
前回は、データを更新するSQL文を紹介しました。「INSERT文で表へデータの追加」「UPDATE文でデータの更新」「DELETE文でデータの削除」ができましたね。
今回は、少し応用的なデータ変更のための構文を紹介します。
前回紹介した基本的なINSERT文では、VALUES句に指定したデータを1行分のデータとして表に追加できました。今回紹介するのは、INSERT文と副問合せを組み合わせることで、別の表からデータをコピーする方法です。
例えば、開発環境向けにテストデータを生成する場合や、分析処理のために既存の表からデータの一部をコピーしたい場合などに便利です。
それでは、今回の連載で使用するために、「MY_EMP」という名前の新しい表を1つ用意しましょう。表の作成構文については、次回の連載で説明しますので、まずは次のSQL文をコピーして、実行してみてください。
CREATE TABLE my_emp (empno number(22), ename varchar2(10), sal number(7, 2), deptno number(22), dname varchar2(14) );
実行すると「MY_EMP」という名前で、「EMPNO」「ENAME」「SAL」「DEPTNO」「DNAME」という5つの列がある表が作成されます。この表はいま作成されたばかりなので、データはまだ入っていません。そこで、既存のEMP表のデータをコピーして、MY_EMP表にデータ挿入してみましょう。
「MY_EMP」表の構造に合わせて、今回は、EMP表の「EMPNO」「ENAME」「SAL」「DEPTNO」列のみをコピーします。また、全てのデータではなく、「給与が2000以上である」社員のデータだけをコピーしてみましょう。
通常のINSERT文ではVALUES句で挿入する値を指定しますが、代わりに副問合せを記述することによって、別の表からコピーした値を使って、データを挿入できます。以下のような副問合せを指定すると、「給与が2000以上である」という条件に合う行と列のデータをコピーできます。
INSERT INTO my_emp(empno,ename,sal,deptno) SELECT empno,ename,sal,deptno FROM emp WHERE sal >=2000;
「MY_EMP」表を検索して、データが正しくコピーされたことを確認しましょう。
SELECT * FROM my_emp;
結果を確認すると、もともとEMP表になかった「DNAME」列にはデータがコピーされていませんね。そこで、次の項目では、DNAME列に社員の所属する部門の名前を追加しましょう(図2の構文でデータをコピーする際に、EMP表とDEPT表を結合する副問合せを記述すれば、データを一緒にコピーすることも可能です)。
DNAME列には、「社員の所属する部門名」が入ります。部門名はDEPT表のDNAME列に登録されているため、この値をコピーすればよいのですが、ここでポイントとなるのは、「その社員が所属する部門の名前をコピーする」ことです。つまり、社員によって登録すべき部門名は異なります。KINGさんであれば部門10の部門名を、BLAKEさんであれば部門30の部門名を登録する必要があります。
このように「行によって条件が変わる(社員によって指定する部門が変わる)」場合には、連載第12回で紹介した「相関副問合せ」を使うと便利でしたね。
そこで、相関副問合せを使って、社員ごとに対応した部門を検索して、データを更新しましょう。先ほどと同じようにUPDATE文の中に副問合せを記述しますが、その際に相関副問合せの構文を指定します。下記のように指定すると、「my_emp(oという別名を指定)表を更新して、dname列に値をセットする。その値は、dept(iという別名を指定)表から取ってくるが、条件として、my_emp(o)表の社員のdept_idに一致する値を取得する」という意味になります。
UPDATE my_emp o SET dname = (SELECT dname FROM dept i WHERE o.deptno = i.deptno);
結果を確認してみましょう。DNAME列に、社員の部門番号に対応した部門名が入っていることが分かります。
SELECT * FROM my_emp;
このように、相関副問合せを使うと、既存のデータに合わせてデータを更新できます。
Copyright © ITmedia, Inc. All Rights Reserved.