Oracle9i入門SQL編 Tips集 日本オラクル株式会社 エデュケーションサービス本部 杉田 敦史 この度は、弊社研修サービスをご利用いただき誠にありがとうございます。こちらの資料は、業務で使えるSQL文を紹介するTips集となっております。なお、紹介したSQL文は本コースOracle9i入門SQL編の表を使用して実行しています。 業務で使えるSQL 1. CSVデータ(カンマ区切り)を取り出すSQL文 SELECT employee_id ||','|| last_name ||','|| salary "CSV_DATA" FROM employees; CSV_DATA ----------------------- 100,King,24000 101,Kochhar,17000 102,De Haan,17000 103,Hunold,9000 ・・・ 2. 本日入社した従業員を表示するSQL文 SELECT last_name, hire_date FROM employees WHERE hire_date >= TRUNC(SYSDATE, 'DD') AND hide_date < TRUNC(SYSDATE, 'DD') + 1; LAST_NAME HIRE_DATE ----------- ----------- SUGITA 2002-04-01 * 特に特定の日付に注文された注文データを検索するときに使用します。 日付型は秒単位までデータを持つため、 WHERE <日付データの列名> = '2002-04-01' とすると2002年4月1日0時00分のデータしか表示しません。 3. 月末までの残り日数を表示するSQL文 SELECT LAST_DAY(sysdate) - sysdate "REMAINDER" FROM dual; REMAINDER ----------- 2 4. 表に格納されている行データを3行だけみるSQL文 SELECT last_name, salary FROM employees WHERE rownum <= 3; LAST_NAME SALARY --------------- ---------- King 24000 Kochhar 17000 De Haan 17000 * 表にどのようなデータが格納されているか確認するときに利用する。 5. 給与の高いTOP3を表示するSQL文 SELECT rownum "RANK", last_name, salary FROM (SELECT last_name, salary FROM emp ORDER BY sal DESC) WHERE rownum <= 3; RANK LAST_NAME SALARY ------ --------------- ---------- 1 King 24000 2 Kochhar 17000 3 De Haan 17000 6. 文字列のバイト数を表示するSQL文 SELECT LENGTH('オラクル') "LENGTH", LENGTHB('オラクル') "LENGTHB" FROM dual; LENGTH LENGTHB ---------- ---------- 4 8 *LENGTH(文字列):文字列のバイト数を戻す関数 7. 職種ごとの、合計給与と各部門の合計給与を表示するSQL文 SELECT department_id, job_id, SUM(salary) SUM FROM employees WHERE department_id IN(20,50,80) GROUP BY ROLLUP(department_id, job_id); DEPARTMENT_ID JOB_ID SUM ------------- ---------- ---------- 20 MK_MAN 13000 20 MK_REP 6000 20 19000 ← 部門番号20の合計給与 50 ST_CLERK 11700 50 ST_MAN 5800 50 17500 ← 部門番号50の合計給与 80 SA_MAN 10500 80 SA_REP 19600 80 30100 ← 部門番号80の合計給与 66600 ← 全体の合計給与 8. 2つの表の差分データを取り出すSQL文 SELECT last_name, salary, department_id FROM employees MINUS SELECT name, sal, deptno FROM tmp_employees; LAST_NAME SALARY DEPARTMENT_ID --------------- ---------- ------------- Abel 11000 80 Taylor 8600 80 Zlotkey 10500 80 *TMP_EMPLOYEES表は、EMPLOYEES表で部門番号80の従業員の給料だけを10%昇給したもので、その他の従業員情報は同じ表です。(研修環境にTMP_EMPLOYEES表はありません。) 9. 給与が$10,000以上と$10,000未満の従業員を分けて表示するSQL文 SELECT last_name "名前", DECODE(SIGN(salary-10000), 1, salary, 0, salary) "$10,000以上", DECODE(SIGN(salary-10000),-1,salary) "$10,000未満" FROM employees; 名前 $10,000以上 $10,000未満 ---------- ----------- ----------- King 24000 Kochhar 17000 De Haan 17000 Hunold 9000 Ernst 6000 Lorentz 4200 ・・・ *SIGN関数:数値および式の正負判定を行なう関数 n>0 SIGN(n)=1, n=0 SIGN(n)=0, n<0 SIGN(n)=-1 10. INSERT文で改行を値として挿入する INSERT INTO departments(department_id, department_name) VALUES(200, 'Education'|| CHR(10) ||'Knowledge'); SQL> SELECT department_id, department_name FROM departments 2 WHERE department_id = 200; DEPT# DEPARTMENT_NAME ----- -------------------- 200 Education Knowledge *CHR(10)は改行, CHR(09)はTABを表します。 業務で使えるSQL*Plus SQL*Plusのよく使うコマンド コマンド 略称 用途 DESCRIBE object EDIT SAVE file EDIT file @file RUN file LIST APPEND text INPUT text DELETE n CHANGE /old/new DESC object ED SAV file ED file L A text I text DEL n C /old/new 指定した表、ビュー、シノニムの列定義をリストする バッファの内容を編集する バッファの内容をfileに保存する fileを編集する fileの内容を実行する 〃 バッファの内容をリストする バッファの行末にtextを追加する バッファの行末にtextからなる1行を追加する 行nを削除する 現行行のoldをnewに置換する その他にも...多くの便利なコマンドが用意されています。 例えば COLUMN 列の表示形式を指定する SQL> SELECT empno,ename,sal 2 FROM emp WHERE deptno=10; EMPNO ENAME SAL ----- ---------- ----- 7839 KING 5000 7782 CLARK 2450 7934 MILLER 1300 SQL> COLUMN sal FORMAT $9,999 SQL> / EMPNO ENAME SAL ------ ---------- --------- 7839 KING $5,000 7782 CLARK $2,450 7934 MILLER $1,300 SPOOL 問合せの結果をOSファイルに保存する SQL> SPOOL test.txt ←test.txtにスプール SQL> SELECT empno,ename FROM emp WHERE deptno=10; EMPNO ENAME ----- ---------- 7839 KING 7782 CLARK 7934 MILLER SQL> SPOOL OFF ←スプール終了 test.txtの中身 1. データベースへのログインを簡単にする SQL*Plusショートカットをダブルクリックするだけで、データベースへログインすることができます。頻繁にデータベースへログインする場合に、重宝します。 SQL*Plusのショートカットを[右クリック>プロパティ]を表示します。ショートカットタブの「リンク先」を以下のように変更します。(下図参照) (例)リンク先 [...\sqlplusw.exe sql01/sql01@basic9] 次回からSQL*Plusショートカットをダブルクリックするだけで、データベースへログインできます。ログインするユーザーごと/データベースごとに、同じようにショートカットを作成すれば、データベース管理が効率的になります。 2. SQL*Plusで作成したファイルはどこに保存される? SQL*Plusでファイルを作成するコマンドはSAVEコマンド,EDITコマンド、SPOOLコマンドなどがあります。以下のようにSQL*Plusバッファの内容をファイルに保存する場合、 SQL> save test.sql 保存されたtest.sqlはSQL*Plusの作業フォルダに作成されます。作業フォルダの指定は、SQL*Plusのショートカットを[右クリック>プロパティ]を表示し、ショートカットタブの「作業フォルダ」を指定します。(下図参照) また、以下のように保存先を指定することもできます。 SQL> save G:\oracle\basic9\test.sql 3. SQL*Plusで好きなエディタを使う Windows版のSQL*PlusのEDITコマンドでは、デフォルトでメモ帳(Notepad)が起動します。このデフォルトのエディタを、使い慣れた別のエディタに変更することができます。下記の例では、秀丸エディタを指定しています。login.sqlに以下の1文を追加してください。 DEFINE_EDITOR=C:\Hidemaru\Hidemaru.exe ←エディタの絶対パスを指定する 4. SQLプロンプトのカスタマイズ(現在時刻の表示) どの処理がいつ実行されたのかを、ログに残したいというケースがあります。そのような場合に、SQLプロンプトに時間が記述されていると非常に便利です。現在時刻をSQLプロンプトに表示させるコマンドがあります。 SQL> spool test.log SQL> set time on 20:47:23 SQL> ← 現在時刻がSQLプロンプトに表示される ・・・ 20:57:36 SQL> spool off 5. SQL文の出力を抑制する バッチ処理などを行なう際に、SQL文の結果の出力を抑制させたい場合があります。出力を抑制するためのコマンドがあります。 SQL> set termout off SQL> @test.sql SQL> ← バッチ処理が終了するまで何も出力されない。 6. SQL*Plusを終了せずにOSコマンドを実行する (注) GUI版のSQL*Plusでは使用できません。CUI版のSQL*Plusをご利用ください。 SQL*Plusを終了せずに、OSコマンドを実行することができます。 [UNIX] SQL> ![command] SQL> !ls local.cshrc local.profile local.login login.sql [MS-DOS] SQL> $[command] SQL> $dir 2001/11/02 17:32