はじめに
こんにちは。今日はSQLのDMLについてまとめます。
本文
SQL-DML
SQL-DMLは、データを操作するための言語です。SELECT文(表示)、INSERT(挿入)、UPDATE(更新)、DELETE文(削除)の4種類あります。SELECT文は複雑で、様々な問い合わせを行うことができます。
SELECT
1つまたは複数の表から、行、列や導出した値を取り出すために使用します。
様々な条件を指定できますが、基本的な構文は下記です。
-- 構文
SELECT [ALL | DISTINCT] 表示する列リスト
FROM 表名1 [,...表名n]
[JOIN 結合条件]
[WHERE 選択条件]
[GROUP BY 集計のキーとなる列リスト]
[HAVING グループ化後の選択条件]
[ORDER BY 整列のキーとなる列リスト [ASC | DESC]]
表名は繰り返し、表の数nだけ記述し、列リストでは1つ以上の列を記述します。
1. SELECT句
データベースから取り出したい情報の項目を指定します。通常は、表の列を1つ以上指定し、","(カンマ)で区切った列リストで列挙します。また、表の全ての列を指定する場合には、"*"(アスタリスク)を指定できます。*を指定すると、CREATE TABLE文で定義した列名を全て指定した順に表示します。
また、ALLまたはDISTINCTを設定し、同じ内容の列が重複した場合の挙動を設定します。DISTINCTを指定すると、複数の行で全く同じ内容となった場合に、その行を1つにまとめます。デフォルトはALLです。
複数の表を使用する問い合わせでは、基本的に表名、列名というように列を記述する必要があります。ただし、複数の表に同じ列名が存在しない場合には、省略することも可能です。
SELECT文では、通常の列名の他に、集約関数(集計関数)名をつけることができます。列名に別名を指定する場合には、列名 AS 別名または、列名 別名というようにします。
2. FROM句
データベースでの検索対象となる表やビューを列挙します。表明には別名をつけることができ、表名に別名を指定する場合には、表名 AS 別名 または 表名 別名とします。
3. JOIN句
結合の条件を指定します。結合は、FROM句とWHERE句で表現することも可能ですが、標準SQL2以降では、結合はJOIN句の問い合わせで行うことが基本です。
-- 構文
FROM 元の表名 [結合条件] JOIN 結合する表名
ON 元の表名.列名 ON 結合する表名.列名
結合条件は結合するときの条件で、θは比較演算子(=, <, >, <=, >=, <>)になります。例えば、A表とB表を共通の列名で結合する場合は次のようになります。
FROM A JOIN B ON A.X=B.X
結合条件は、ANDやORなどの論理演算子で接続することで複数設定できます。
-
内部結合 [INNER] JOIN, 自然結合 NATURAL JOIN
- 内部結合のINNERは省略可能で、デフォルトのJOINになります。
-
左外部結合 [LEFT][OUTER]JOIN
- 外部結合のデフォルトは左であり、左と付くのは外部結合なので、LEFTまたはOUTERのどちらかは省略可能です
-
右外部結合 RIGHT [OUTER]JOIN
-
完全外部結合 FULL [OUTER]JOIN
-
直積 CROSS JOIN
またJOIN句では、ONで結合条件を演算子で指定する方法以外に、USINGを使用する方法があります。USINGは、両方の表に同じ名前の列が存在しており、その列を使って等結合を行う場合にのみ使用できます。
FROM 元の表名 [結合条件] JOIN 結合する表名
USING (列名1, ...列名n)
列名は、1つ以上の複数の列を指定可能です。なお、元の表名は指定しません。先ほどのA表とB表を共通の列名Xで結合する場合には、次のようになります。
FROM A JOIN B USING(X)
4. WHERE句
データベースから取り出したい情報の検索条件を指定します。複数の検索条件を設定する場合には、ANDやORなどの論理演算子で接続します。このとき、ORの優先順位はANDより低くなるので、ORを優先させる場合には括弧()で囲みます。
[例:WHERE句で使われる検索条件一覧]
単純な条件判定
NULL検査
結合検査
LIKE検査
BETWEEN範囲検査
EXISTS検査
IN範囲検査
SOME | ALL検査
5. GROUP BY句
集約関数(集計関数)を使って問合せを行うときに指定します。GROUP BY句では、集約(集計)を行うときにキーとなる列または、列の組みを指定し、キーの値ごとにグループ化し、集計します。
6. HAVING句
GROUP BY句の結果に検索条件を追加します。
WHERE句と検索条件は同じですが、グループ化した後の条件について判定します。そのため、HAVING句で使用できる列は、グループ化に使用した列と集計関数のみです。
7. ORDER BY句
取り出した結果を整列するときに指定します。ORDER BY句では、整列を行うときにキーとなる列または列番号(SELECT句で指定される列の左からの順番)を、優先度の高い順に、列リストとして指定します。
昇順:ASC
降順:DESC
INSERT
表またはビューに行を追加するために使用するのがINSERT文です。
-- 構文
INSERT [INTO] 表名またはビュー名 [(列リスト)]
VALUES (値1 [, ...値n]) | SELECT文
表に値を指定して1行ずつデータを追加する場合には、VALUES句を使用します。別の表からSELECT文を実行して取り出した結果を直接挿入することも可能です。
UPDATE
表またはビューのデータを変更するために使用するのが、INSERT文です。
-- 構文
UPDATE 表名またはビュー名
SET 列名1 = 値1 [, ...列名n=値n]
[WHERE 選択条件]
WHERE句を指定しないと全ての列を更新するので、ほとんどの場合は必須です。
値を変更する列をSET句で指定して更新します。複数の列を更新する場合には、","(カンマ)で区切って連続して記述します。
DELETE
表またはビューのデータを削除するために使用します
-- 構文
DELETE [FROM] 表名またはビュー名
[WHERE 選択条件]
WHERE句を指定しないと全ての列を削除するので、ほとんどの場合は必須です。
SQL-DMLで使用される関数や演算
1. 集約関数
SQL文で集約(集計)を行うための関数です。
[例:集約関数]
AVG (列名)
COUNT (列名)
COUNT (*)
MAX (列名)
MIN (列名)
SUM (列名)
2. 集合演算
関係演算で行う和、差などの集合演算は、SQLで表現することができます。
UNION(和演算)
UNIONは、和演算を行うためのSQLです。問合せの結果出力された2つの表を1つに合わせて表示します。
-- 構文
SQL文1 UNION [ALL] SQL文2
-- 例
SELECT a1, a2 FROM A UNION SELECT b1, b2 FROM B
2つの表では、列の数を揃える必要があります。
UNIONは普通の和演算ですが、UNION ALL では、2つの表で共通の行があった場合、それを1つにまとめず、別々に表示させます。
INTERSECT(共通演算)
INTERSECTは、共通(積)演算を行うためのSQLです。
問合せの結果出力された2つの表から共通の行を表示します。
``sql
-- 構文
SQL文1 INTERSECT [ALL] SQL文2
##### EXCEPT(差演算)
EXCEPTは、差演算を行うためのSQLです。
問い合わせの結果出力された最初の表から、2番目の表と共通の行を削除します。
```sql
-- 構文
SQL文1 EXCEPT [ALL] SQL文2
直積など、結合に関する集合演算は、JOIN句を用いて行います。射影、選択、結合などの演算は、SELECT文内で行います。商演算は、単純なSQL文では表現できないので、NOT EXISTS句などを用いて、副問合せを使用して記述する必要があります。
まとめ
いかがでしたか?