【初心者向け】SQL早見表

# 1.はじめに

最近機械学習の実装をしていて、Pythonとfor文の相性に悩まされる日々をおくっています。

そんな中、Pythonで前処理をするのではなく、
データベースでデータを加工する方法が良いと聞いたため
SQLの勉強を再度はじめました。

備忘録の意味も込めてその内容をまとめます。


# 2.SQL構文早見表
## 2-1.基本構文編

| No | 構文 | 意味 | 備考 |
|---|---|---|---|
| 1 | CREATE DATABASE <データベース名>; | <データベース名>という名前のデータベースを作成する |  |
| 2 | CREATE TABLE <テーブル名>; | データベース内に<テーブル名>という名前のテーブルを作成する |  |
| 3 | DROP <データベース名>; | <データベース名>という名前のデータベースを削除する |  |
| 4 | DROP TABLE <テーブル名>; | データベース内の<テーブル名>という名前のテーブルを削除する |  |
| 5 | ALTER TABLE <テーブル名> ADD COLUMN <列の定義>; | <テーブル名>のテーブルに列(カラム)を追加する |  |
| 6 | SELECT <列名1>, <列名2> , … FROM <テーブル名>; | <テーブル名>の<列名1>,<列名2>,... を出力する | ・全列表示する場合は、* を使用する <br>・列に別名を付ける場合は、「AS」を使用する <br>・重複を除く場合は、SELECT句に 「DISTINCT」を使用する |
| 7 | SELECT <列名1>, <列名2> , … FROM <テーブル名> WHERE <条件式>; | <条件式>に一致する<テーブル名>の<列名1>,<列名2>,... を出力する | 6に同じ |


## 2-2.演算子編

| No | 演算子 | 意味 | 備考 |
|---|---|---|---|
| 1 | + | 足し算 |  |
| 2 | - | 引き算 |  |
| 3 | * | 掛け算 |  |
| 4 | / | 割り算 |  |
| 5 | = | 〜と等しい |  |
| 6 | <> | 〜と等しくない | !=ではない |
| 7 | >= | 〜以上 |  |
| 8 | > | 〜より大きい |  |
| 9 |  <= | 〜以下 |  |
| 10 | < | 〜より小さい |  |
| 11 | NOT | 〜と等しくない | WHERE句の条件式と掛け合わせて使用する |
| 12 | AND | 〜かつ** | 11に同じ |
| 13 | OR | 〜または** | 11に同じ |

※NULLに比較演算子は使用できない。


## 2-3.集約編

| No | 構文 | 意味 | 備考 |
|---|---|---|---|
| 1 | SELECT COUNT(<パラメータ>) FROM <テーブル名>; | <テーブル名>テーブル内の<パラメータ>のレコード数を数える | 全件数える場合、*を<パラメータ>に代入する |
| 2 | SELECT SUM(<パラメータ>) FROM <テーブル名>; | <テーブル名>テーブル内の<パラメータ(数値列)>を合計する | 8に同じ |
| 3 | SELECT AVG(<パラメータ>) FROM <テーブル名>; | <テーブル名>テーブル内の<パラメータ(数値列)>を平均する | 8に同じ |
| 4| SELECT MAX(<パラメータ>) FROM <テーブル名>; | <テーブル名>テーブル内の<パラメータ(数値列)>の最大値を出力する |  |
| 5 | SELECT MIN(<パラメータ>) FROM <テーブル名>; | <テーブル名>テーブル内の<パラメータ(数値列)>の最小値を出力する |  |
| 6 | SELECT <列名1>, <列名2> , … FROM <テーブル名> GROUP BY<列名1>,< 列名2> ...;  | 集約して表示する | GROUP BY を使用するとSELECT句に使用できるものが限られる |
| 7 | SELECT <列名1>, <列名2> , … FROM <テーブル名> GROUP BY<列名1>,< 列名2> … HAVING <グループ値に対する条件式>,...; | 集約値の中から条件式<グループ値に対する条件式>に合致するものを出力する |  |
| 8 | SELECT <列名1>, <列名2> , … FROM <テーブル名> ORDER BY<列名1>,< 列名2> ...; | <列名>を基準に並べ替える | 降順にならべかえる場合は、「DESC」をORDER BY句に追加する |


## 2-4.データ更新編

| No | 構文 | 意味 | 備考 |
|---|---|---|---|
| 1 | INSERT INTO <テーブル名>(<列1>, <列2>, ...) VALUES (<値1>, <値2>,... ); | <テーブル名>テーブルにデータを登録する |  |
| 2 | DELETE FROM <テーブル名>; | <テーブル名>テーブルの中身を削除する | WHERE句を追加することで条件式を追加して削除できる |
| 3 | UPDATE <テーブル名> SET <列名> = <値>; | <列名>を<値>に更新する | WHERE句を追加することで条件式を追加して更新できる |


## 2-5. 関数編

| No | 関数 | 意味 | 備考 |
|---|---|---|---|
| 1 | ABS(<数値>) | <数値>を絶対値で出力する |  |
| 2 | MOD(<被除数>, <除数>) | <被除数>を<除数>で割った余りを出力(余剰) |  |
| 3 | ROUND(<対象数>, <丸め桁数>) | <対象数>を<丸め桁数>で四捨五入する |  |
| 4 | <文字列1> &#124;&#124; <文字列2> | <文字列1> と <文字列2>を連結 |  |
| 5 | LENGTH(<文字列>) | <文字列>の長さを出力 |  |
| 6 | LOWER(<文字列>) | <文字列>を小文字化して出力 |  |
| 7 | REPLACE(<対象の文字列>, <置換前の文字列>, <置換後の文字列>) | 文字列の置換 |  |
| 8 | SUBSTRING(<対象の文字列> FROM <切り出し開始位置> FOR <切り出す字数>) | 文字列の切り出し |  |
| 9 | UPPER(<文字列>) | <文字列>を大文字化して出力 |  |
| 10 | CURRENT_DATE | 現在の日付 |  |
| 11 | CURRENT_TIME | 現在の時間 |  |
| 12 | CURRENT_TIMESTAMP | 現在の日時 |  |
| 13 | EXTRACT(<日付要素> FROM <日付>) | 日付要素の切り出し |  |
| 14 | CAST(<変換前の値> AS <変換するデータ型>) | 型変換 |  |
| 15 | COALESCE(<データ1>, <データ2>, ...) | NULL値を変換 |  |
| 16 | CASE WHEN <評価式1> THEN <式1> WHEN <評価式2> THEN <式2> … ELSE <式> END | 条件分岐 |  |
| 17 | UNION | レコードの足し算 |  |
| 18 | EXCEPT | レコードの引き算 |  |
| 19 | INNER JOIN | 内部結合 |  |
| 20 | OUTER JOIN | 外部結合 | 片方のテーブルにしかない値も一緒に出力する |
| 21 | CROSS JOIN | クロス結合 | ほとんど使用しない |

※RDBMSの種類によって書き方が異なる箇所がありますので、詳細は各RDBMSのドキュメントを参考にしてください。


## 2-6.述語編

抽出条件を記載する際に必須となってくるものです。

| No | 演算子 | 意味 | 備考 |
|---|---|---|---|
| 1 | LIKE | 文字列部分一致検索 | 任意の値を入れる箇所に’%’を記載する |
| 2 | BETWEEN <値1> AND <値2> | 範囲検索 |  |
| 3 | IS NULL | NULLであるか | NOTを付けることでNULLでない場合を表示できる |
| 4 | IN | ORの省略形 |  |
| 5 | EXISTS | レコードの存在有無を調べる |  |



## 2-7.ウィンドウ関数

| No | 関数 | 意味 | 備考 |
|---|---|---|---|
| 1 | RANK | レコードのランキングを出力 | 同順位のレコードが存在した場合、後続の順位が飛ぶ |
| 2 | DENSE_RANK | レコードのランキングを出力 | 同順位のレコードが存在した場合、後続の順位が飛ばない |
| 3 | ROW_NUMBER | 一意な連番を付与する |  |
| 4 | PARTITION BY | 範囲指定 | RANK関数内で順位づけの範囲を指定する等で使用 |


# 3.まとめ
SQL文を表形式で簡単にまとめました。
データの加工方法によって「この関数ならすぐ終わる！」ってものもあれば「複雑な加工が必要」という場合もあるかと思います！
適宜組み合わせながら使ってみてください。

具体例は様々な記事がネットにあるので、詳細が気になる方は調べてみてください。

何か間違い、不備等あればご指摘ください。