SQL
SQLとはリレーショナルデータベースを操作するために規格化されたデータベース言語で、大きく分けて三つの機能を持っている。
- データ定義(DDL)
- データ操作(DML)
- データ制御(DCL)
SQLでの操作はDMLによるものがほとんどである。
1. データ定義
2. データ操作
SQLにおけるデータ操作は主に次の4つのコマンドによって行われる。
- SELECT文・・・テーブルからデータを抽出する。
- INSERT文・・・テーブルにレコードを追加する。
- UPDATE文・・・テーブル中にあるレコードのデータの内容を更新する。
- DELETE文・・・テーブル中にあるレコードを削除する。
2.1 SELECT文
基本:
- SELECT文を使う場合には、SELECTの後ろにカラム名をカンマ区切りで記述します
- SELECT *(アスタリスク)と記載することで、すべてのカラムを表示させることもできる
- FROMの後ろにはテーブル名を記述する
例:
SELECT カラム名 FROM テーブル名;
SELECT ENAME, JOB, SAL FROM EMP;
演算子の利用:
- SELECT文には算術式を記載することで、計算結果を表示することが可能
- 使用可能な演算子は
+
,-
,*
,/
の4つ - カッコを使い計算の優先順位を指定することも可能
例:
SELECT ENAME, SAL * 1.02 FROM EMP;
WHERE句を使ったデータの選別:
- WEHRE句の後ろに条件式を記述することで、条件に合致したレコードのみを選択することが可能
- WHEREの条件に使用可能な比較演算子は以下の通り
- 複合条件でレコードを選択する場合は論理演算子(
AND
,OR
,NOT
)を使用する
比較演算子 | 説明 |
---|---|
< | 左辺が右辺より小さい |
<= | 左辺が右辺以下 |
> | 左辺が右辺より大きい |
>= | 左辺が右辺以上 |
<> | 左辺と右辺が等しくない |
例:
SELECT ENAME FROM EMP WHERE DEPTNO = 20;
SELECT ENAME, JOB FROM EMP WHERE JOB = "CLERK" OR JOB = "SALESMAN";
SELECT ENAME, JOB, SAL FROM EMP WHERE (JOB = "CLERK" OR JOB = "SALESMAN") AND SAL >= 1000;
2.2 ORDER BY(ソート)
基本:
- レコードをソートするにはORDER BYを使用する
- ORDER BYのあとにソートのキーにするカラム名を記述すればソートされる
- 複数のソートキーを使用する場合はカラム名をカンマ区切りで記述する
記述位置:
- ORDER BYはWHERE条件の後ろに記述する
- WHERE条件を指定しない場合はFROM句のあとにORDER BY句を記述する
昇順・降順:
- 通常は昇順でソートされる
ORDER BY SAL DESC
のようにDESCキーワードを付けることによって降順でソートされる- 明示的に昇順でソートする場合はASCキーワードを付ける
例:
SELECT ENAME, JOB , SAL FROM EMP ORDER BY SAL DESC;
SELECT ENAME, JOB , DEPTNO, SAL FROM EMP WHERE JOB <> "PRESIDENT" ORDER BY DEPTNO, SAL;
2.3 集合関数
- 集合関数は引数に指定したカラムの値を集計し結果を返す
- WHERE条件が指定されている場合は、抽出されたレコードを対象に集計した結果を返す
- SQLには以下の関数が提供されている
- SUMとAVGはINT型やFROAT型などの数値型のカラムのみ引数にできる
- CHAR型をMAXやMINすると想定外の挙動をする可能性があるので注意
関数 | 説明 |
---|---|
SUM | 引数の総和を求める。NULLの場合は集計対象外 |
MAX | 引数の最大値を求める。 |
MIN | 引数の最小値を求める。 |
AVG | 引数の平均値を求める。NULLの場合は集計対象外。 |
COUNT | 引数の値の総数を求める。NULLの場合は集計対象外。COUNT(*)と記載可。 |
例:
SELECT SUM(SAL), MAX(SAL), MIN(SAL), AVG(SAL), COUNT(SAL) FROM EMP;
2.4 BETWEEN演算子(範囲で抽出)
- BETWEEN演算子はWHERE句で使用する
カラム名 BETWEEN 下限値 AND 上限値
と記述し、カラムの値が下限値以上、上限値以下の場合真を返す- 下限値と上限値を逆に記述することは不可
- BETWEENを使わずに比較演算子で書き直すことも可能
- 否定する場合は
カラム名 NOT BETWEEN 下限値 AND 上限値
のようにBETWEENの前にNOTをつけること
例:
SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000;
SELECT ENAME, SAL FROM EMP WHERE SAL NOT BETWEEN 1000 AND 2000;
2.5 LIKE演算子(パターンマッチング)
- LIKE演算子はWHERE句で使用
カラム名 LIKE 比較文字列
と記述しカラム名と比較文字列のパターンマッチングを行う- 比較文字列に使用可能なワイルドカードは
%
,_
の2種類 - %や_そのものを検索文字列として使用したい場合はESCAPEキーワードを使用する
- LIKE演算子を否定する場合は、
カラム名 NOT LIKE 比較文字列
のようにLIKE演算子の前にNOTを記述する
例:
WHERE ENAME LIKE '%?_%' ESCAPE '?'
SELECT ENAME, SAL FROM EMP WHERE ENAME LIKE "%A%";
2.6 GROUP BY
- 指定したカラムごとにグループ化し、集合関数の計算結果を取得することができる
- グループ化の方法はグループ化するカラムを
GROUP BY カラム名
のように記述する - SELECT文には、GROUP BYで指定したカラムと集合関数のみ記述することが可能
- WHERE条件を記述することも可能
- WHERE条件によりレコードが抽出され、GROUP BYで指定したカラムごとにグループ化され、集合関数で計算結果が求められる
- 複数のカラムによるグループ化を行う場合は、GROUP BYの後ろにカラム名をカンマ区切りで記述する
例:
SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO;
2.7 HAVING
- HAVINGはGROUP BY句に対して抽出条件を設定できる
- WHERE条件がGROUP BYでグループ化される前のレコード抽出段階の条件になるのに対し、HAVINGはグループ化後の条件になる
- GROUP BY句の後ろに
HAVING 条件式
と記述する - HAVING句に使用される条件は、グループごとに値を持たなくてはならないので、グループ化したキーか集合関数の比較条件のみ記述可能
例:
SELECT DEPTNO ,COUNT(*) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 4;
SELECT JOB ,MAX(SAL), MiN(SAL), AVG(SAL) FROM EMP GROUP BY JOB HAVING MAX(SAL) >= 2000 ;
2.8 DISTINCT
- DISTINCTキーワードはSELECT句の後ろに記載
- DISTINCTはSELECT文で抽出されたレコードの重複行を削除する機能がある
例:
SELECT DISTINCT JOB FROM EMP;
2.8 INSERT文(レコードの追加)
- INSERT文を使う場合には、INSERT INTO の後に表名を記載し、その後ろの(カッコ)の中には列名をカンマ区切りで指定
- 全ての列に値を入れるときは列名を省略できる
- レコード追加したい値はVALUESの後ろの(カッコ)の中に、値をカンマ区切りで記載
- 値が文字列の場合はクォーテーションで囲む必要がある
- VALUESキーワードの部分をSELECT文に変更することで、別表から選択したレコードを表に追加することも可能
例:
INSERT INTO EMP (EMPNO,NAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES (9999,'SAN','SALESMAN',7698,1981-09-28,1000,500,10);
INSERT INTO EMP_TEMP SELECT * FROM EMP WHERE JOB = 'SALESMAN'
2.9 UPDATE文(レコードの更新)
- UPDATEの後ろに更新対象のレコードがある表名を記載し、SETの後に
項目名=更新する値
を記載する- 複数の項目を更新する場合はカンマ区切りで
項目名=更新する値
を並べる
- 複数の項目を更新する場合はカンマ区切りで
- UPDATE文ではWHERE条件に合致するレコードすべてが更新される
- WHERE条件を記載しない場合は、すべてのレコードが更新される
- 計算して求めた値を使い、レコードを更新することも可能
例:
UPDATE EMP SET SAL = SAL * 1.5 WHERE EMPNO = 7369
2.10 DELETE文
- DELETE FROMの後ろに削除対象のレコードが格納されている表名を記載
- DELETE文ではWHERE条件に合致するレコードすべてが削除される
- WHERE条件を記載しない場合は、すべてのレコードが削除される
例:
DELETE FROM EMP WHERE EMPNO = 7369;
2.11 複数表の問い合わせ
- 複数表からの問い合わせを行う場合は、FROMの後ろに表名を「,(カンマ)」で区切って記述
- WHERE条件の
EMP.DEPTNO = DEPT.DEPTNO
で、EMP表のDEPTNOとDEPT表のDEPTNOが等しい列を連結するという意味
- WHERE条件の
- SELECTやWHEREで指定する項目で、2つの表のどちらにも含まれている場合は
表明.項目名
のようにして記述する必要がある- どちらかにしか含まれていないなら
項目名
でもOK
- どちらかにしか含まれていないなら
- 表明にエイリアスをつけることも可能
例:
SELECT EMP.ENAME, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL >= 1500;
SELECT E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
2.12 IN句,EXSISTS句
- INを使用すると()に囲まれているものを含むレコードを抽出できる
- EXISTS記述を使って同様のレコードを抽出することもできる
- 基本的にEXISTSの方が速くなるのでEXISTSで書こう
例: ```SQL – 次の2つは全く同じ SELECT * FROM EMP WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE DNAME LIKE ‘%S%’)
SELECT * FROM EMP WHERE EXISTS (SELECT 1 FROM DEPT WHERE DNAME LIKE ‘%S%’) – EXISTSの中のSELECTでは何を指定してもいいので1番目のカラムをとる