日本Oracleが主催する研修セミナーにSQL入門というコースがあり、このコースではDMLとDCLの基本操作の取得を目標としている。そのため、試験では次のようなことが問われる。
- 重複するデータを排除するために用いられるキーワードは?
- データの並び替えを行うときに用いる句は?
- グループ関数を使う際、グループ化するのに用いる句は?
- グループ化したものに条件を付加したい場合に用いる句は?
これらの問題がすぐに思い浮かぶなら心配ないが、どれか1つでも答えが分からない場合は、勉強のしなおしが必要である。
また、SELECT文以外でも、INSERT文、UPDATE文、DELETE文の基本文法も必要である。
DCLについてはもちろん文法も必要だが、「トランザクション」という概念の方が重要で、これをしっかり抑える必要がある。
- リレーショナルデータベースに対して、何らかの操作を行う場合に使用する言語。
- リレーショナルデータベースは、データを行と列の2次元の表形式で取り扱う。 また、表と表の間は列の値同士によって関連付けられる。
- SQLはDML、DCL、DDLの3種類に分類される。
- DML(データ操作文)
- SELECT、INSERT、UPDATE、DELETE
表内のデータそのものに対しての操作を行う。- DCL(データ制御文)
- COMMIT、ROLLBACK、SAVEPOINT
変更したデータを確定させたり取り消したりいった制御を行う。- DDL(データ定義文)
- CREATE 〜、ALTER 〜、DROP 〜、など
作成、変更、修正といった表などのオブジェクトそのものを定義する。
SQLの中でもSELECT文に関しては、WHERE句とORDER BY句、GROUP BY句を中心に学習したほうがよい。
SELECT文で検索するにあたり、特定行を指定したい場合はWHERE句を用いて条件を記述する。
SELECT 列名
FROM 表名
WHERE 列名 比較演算子 値;ここでのポイントは比較演算子である。
特に数学的な比較演算子(=、>=、<=)ではない主な比較演算子は次の通り。
BETWEEN a AND b a以上b以下 IN (x, y, z) xまたはyまたはz LIKE 'あ%' 「あ」で始まる文字列(何文字でもよい) IS NULL NULL値 <例題>
- 下記のSELECT文を実行したとき、給与が25万と35万の従業員は検索されるかどうか答えよ。
SELECT 従業員名, 給与
FROM 従業員名
WHERE 給与 NOT BETWEEN 250000 AND 350000;- 従業員テーブルから従業員名が「松」で始まり、全体で4文字の名前の従業員を検索するSELECT文を答えよ。
<解説>
- BETWEEN 250000 AND 350000という条件は「250000以上350000以下を検索する」という意味なので、その条件にNOTと付けると、「それ以外」という意味になる。つまり、NOTを使わずに検索されたものを省いて表示されるため、給与が25万と35万の従業員は検索されない。
- パターンマッチングの問題。パターンマッチング文字は「_」と「%」で、「_」は任意の1文字を、「%」は0文字以上の任意の文字列を表す。よって、検索条件は従業員名 LIKE '松_ _ _'となる。
NULLは値がないことを意味するが、NULLの扱いは特殊なことが多いので、しっかり把握しておく必要がある。
- NULLを含む演算結果は必ずNULLになる。
- NULLと0は別物である。
- NULLを他の値に置き換えたいときはNVL関数を使う。
- NULLである行を検索したい場合は列名 IS NULLである。
- NULLでない行を検索したい場合は列名 IS NOT NULLである。
試験問題としては出しやすい問題であるし、実務的にも非常によく使うので、しっかり理解すること。
SQLには多くの関数が用意されているが、その中でも出題されやすいポイントを説明する。
- 2001年9月6日 18:00:00にTRUNC(SYSDATE)を検索すると、どのような結果が返ってくるか。
SELECT TRUNC(SYSDATE) FROM dual; - 同じ日時にROUND(SYSDATE)を検索すると、どのような結果が返ってくるか。
SELECT ROUND(SYSDATE) FROM dual; - SUBSTR('MOTOKI', 2, 5)を検索すると、どのような結果が返ってくるか。
TRUNCやROUNDは数値型のデータの指定行を切り捨て(TRUNC)たり、四捨五入(ROUND)する関数だが、日付型データにも使用できる。上記1,2の結果はそれぞれ01-9-6、01-9-7となる。時間表示まで行った場合、時間の部分はどちらも00:00:00となる。
SUBSTRは、2番目の引数と3番目の引数の意味を間違えないように。問題の場合、2文字目から5文字分取り出すのであり、2文字目から5文字目まで取り出すのでは無いことに注意!
副問い合わせとは、「メインのSQL文の中に、サブのSQL文を記述する」ことであり、WHERE句、HAVING句、UPDATE文のSET句などで使用できる。
例1)、emp表で、最高給与取得者を求める
SELECT ename, sal
FROM emp
WHERE sal = (SELECT MAX(sal) FROM emp);例1解説
複数行問い合わせの場合は、比較演算子に注意しなければならない。「=」「!=」「<」「>」などの演算子は使用できず、「IN」「NOT IN」「ANY」「ALL」を使用しなければならない。
例2)、副問い合わせから10,20,30の値が戻ってくる場合、次のSQL文の意味は?
SELECT ename FROM emp
WHERE deptno >ANY (SELECT deptno FROM dept);
SELECT ename FROM emp
WHERE deptno >ALL (SELECT deptno FROM dept);例2解説
- ANYは「いずれか」を意味する。つまり1は10,20,30のいずれかより大きいものという意味になり、結局10より大きいものという意味になる。
- ALLは「すべて」を意味するので、2は10,20,30のすべてより大きいものという意味になり、結局30より大きいものという意味になる。
不等号(<、>)の向きが変わった場合にどうなるかもチェックしておこう。
Oracleを利用する上で、「トランザクション」という概念は必要不可欠であり、完全に理解しなければならない。SQL入門試験のみならず、すべての試験で出題されるのでしっかり勉強しよう。
トランザクションとは「Oracleへの接続または前回のCOMMIT(またはROLLBACK)から、次のCOMMIT(またはROLLBACK)までの一連の変更処理」のことである。基本的には、前回のCOMMIT(またはROLLBACK)から次のCOMMIT(またはROLLBACK)までの処理を「1トランザクション」という単位で扱う。
トランザクションを終了させるにはCOMMIT文またはROLLBACK文の発行を行うが、Oracleから切断したり、DDL文を発行するとトランザクションが終了する。ただしこれは、Oracle内部で暗黙的にCOMMITまたはROLLBACKが実行されている(暗黙COMMIT)。SQL試験を受験する上で、上記の知識はもちろん、COMMITやROLLBACKを発行した際に、何処から何処までの処理が確定または取り消されるのかを把握しなければならない。特にSAVEPOINTを利用する場合の動作は必ず出題される。
<例題>
次の1〜9までのコマンドを順に発行した場合、結果がどうなるか答えよ。
- COMMIT;
- INSERT INTO 〜;
- UPDATE 〜;
- SAVEPOINT A;
- INSERT INTO 〜;
- SAVEPOINT B;
- UPDATE 〜;
- DELETE FROM 〜;
- ROLLBACK TO A;
結果としては、5〜8までの処理は取り消される。
OracleユーザであればSQL*Plusを使うことは多く、SQL入門試験でも出題されるので、特に次の5点については必ず勉強しておくこと。
- DESCRIBE(DESC)コマンドの意味と使用方法。
- バッファ編集コマンドの種類と意味。
- コマンド・ファイルに関わるコマンドの種類と意味。
- SETコマンドの種類と意味。
- 列表示属性の設定方法(COLUMNコマンド)。