No.
2023-10-23
  • Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

SQL

SQLとはリレーショナルデータベースを操作するために規格化されたデータベース言語で、大きく分けて三つの機能を持っている。

  1. データ定義(DDL)
  2. データ操作(DML)
  3. データ制御(DCL)

SQLでの操作はDMLによるものがほとんどである。

1. データ定義

2. データ操作

SQLにおけるデータ操作は主に次の4つのコマンドによって行われる。

  1. SELECT文・・・テーブルからデータを抽出する。
  2. INSERT文・・・テーブルにレコードを追加する。
  3. UPDATE文・・・テーブル中にあるレコードのデータの内容を更新する。
  4. 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が等しい列を連結するという意味
  • 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番目のカラムをとる