0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

こんにちは。今日は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つに合わせて表示します。

-- 構文
SQL1 UNION [ALL] SQL2

-- 例
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句などを用いて、副問合せを使用して記述する必要があります。

まとめ

いかがでしたか?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?