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>,... を出力する | ・全列表示する場合は、* を使用する ・列に別名を付ける場合は、「AS」を使用する ・重複を除く場合は、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> || <文字列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文を表形式で簡単にまとめました。
データの加工方法によって「この関数ならすぐ終わる!」ってものもあれば「複雑な加工が必要」という場合もあるかと思います!
適宜組み合わせながら使ってみてください。
具体例は様々な記事がネットにあるので、詳細が気になる方は調べてみてください。
何か間違い、不備等あればご指摘ください。