SQL基本文法

#始めに
こちらは、筆者がSQLを学習中に必要となった知識をまとめたものです。
間違いなどがあるかもしれません。その時は、コメントで教えていただけると幸いです。

#行・列の操作
## SELECT, FROM, LIMIT
**SELECT カラム名 FROM テーブル名 LIMIT 表示レコード数;**

<details><summary>説明・パラメータ</summary><div>

- SELECT * ：'*'を指定することでテーブルにあるすべてのカラムを取得する
- **AS** : 取得したカラムやテーブルに別名をつけられる
- 列は指定した順番で表示される。

</div></details>

#絞り込み・検索
- **WHERE 条件**
- **WHERE カラム LIKE 条件**

<details><summary>説明・パラメータ</summary><div>

- AND, ORを使うと複数の条件を組み合わせられる
- LIKE '単語'：部分一致するものを取得する
- 単語に'%'をつけることでそれ以降の文字については考慮しない
- 正規表現を使う時はLIKEの代わりに'~'をつける
- SQLの正規表現について(https://www.postgresql.jp/document/9.4/html/functions-matching.html)

</div></details>

# ソート・ランク付け
- **ORDER BY カラム ASC/DESC**：ASC（昇順）、DESC（降順）
- **RANK() OVER(ORDER BY カラム)**:

<details><summary>説明・パラメータ</summary><div>

- **RANK**：同率があった場合順位は同じになり、その次の順位を飛ばす
- **DENS_RANK** : 同率があった場合順位は同じになり、その次の順位は飛ばさない
- **ROW_NUMBER** : 同率があっても同じ順位にはならず、順位をその場合のみランダムでカウント
</div></details>

## OVER
**[集計関数] OVER([PARTITION BY 式] [ORDER BY][{ROWS 範囲}] [RANGE 範囲])**

<details><summary>説明・パラメータ</summary><div>

**説明**
通常、集計関数はGROUP BYで指定された範囲ごとにしか値を返せないが、OVER関数を使用することで、任意の範囲で集計関数を利用できる。

**パラメータ**
- [集計関数]：COUNT, SUM, AVRなど
- [PARTITION BY 式]：グループごとにまとめて集計する場合に使用
- [ORDER BY]：集計関数に対してじゅにを指定する際に使用
- [ROWS 範囲]：集計する範囲の行を指定する際に使用
- [RANGE 範囲]：集計する範囲を指定する際に使用

</div></details>

# 集計
## COUNT
- **COUNT(カラム)**：カラムの行数を返す（NULLを含まない）
- **COUNT(1) or COUNT(*)**：NULLを含む、テーブルの全用件数を返す

<details><summary>説明・パラメータ</summary><div>

- (DISTINCT カラム)：値の重複を除外して計算する
</div></details>

##GROUP BY
**集計関数 FROM テーブル GROPU BY (カラム)**

<details><summary>説明・パラメータ</summary><div>

- GROUP BY：指定された行でグループ化
- 集計関数の例
- SUM：合計
- MAX:最大値
- MIN：最小値
- AVG：平均値
</div></details>

##HAVING
GROUP BY カラム
HAVING 条件

<details><summary>説明・パラメータ</summary><div>

- かならずGROUP BYとセットで使う
- グループ化されたものに対してWHEREのように絞り込みを行う
</div></details>

#統計量
## PERCENTILE_CONT：パーセンタイル
**PERCENTILE_CONT(値) WITHIN GROUP(ORDER BY カラム)**

- PERCENTILE_CONT(値)：指定したパーセントタイルの値を引数にとり、該当のデータを返す。
- OVER句ではなく、WITHIN GROPU(ORDER BY カラム)でソート順を指定する必要がある。

## MODE：最頻値
**MODE() WITHIN GROUP(ORDER BY カラム)**

<details><summary>説明・パラメータ</summary><div>

- MODE：指定した行の最頻値を返す。
- PERCENTITlE_CONTと同様にWITHIN GROUPでソートする。
</div></details>

## 分散
**VAR_SAMP(カラム)**

<details><summary>説明・パラメータ</summary><div>

- VAR_POP, VARIANCE：標本分散を返す
- VAR_SAMP:不偏分散を返す
- 分散、標準偏差関数の詳細(https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_std)
</div></details>

## 標準分散
**STDDEV_SAMP(カラム)**
<details><summary>説明・パラメータ</summary><div>

- STDDEV, STDDEV_POP：標本標準偏差を返す
- STDDEV_SMAP：不偏標準偏差を返す
</div></details>

## LEAST
**LEAST(値1,値2,...)**
- 引数の最小値を返す

# WITH
**WITH サブクエリ名 AS(slectなど)**

<details><summary>説明・パラメータ</summary><div>

</div></details>

# 結合
## (INNER, RIGHT, LEFT ,FULL)JOIN
- **FROM テーブル1 JOIN テーブル2 ON テーブル1.カラム1 = テーブル2.カラム2**
- **FROM テーブル1 {LEFT/RIGHT/FULL} JOIN テーブル2 ON テーブル1.カラム1 = テーブル2.カラム2**

<details><summary>説明・パラメータ</summary><div>

- JOIN : 内部結合
- LEFT JOIN : 左外部結合
- RIGHT JOIN : 右外部結合
- FULL JOIN : 完全外部結合
- 外部都合にて対応データが存在しない方のテーブルの列の内容は、すべてNULLとなる。
- ONの代わりに**USING 共通のカラム名**とすることもできる。
</div></details>

##CROSS JOIN
**FROM テーブル CROSS JOIN カラム**

<details><summary>説明・パラメータ</summary><div>

- CROSS JOIN：テーブル同士の交差結合を行う
- 全てのテーブルの列と全てのテーブルの列を持ち、全ての組み合わせを持つテーブルが生成される
</div></details>

## LAG
**LAG(カラム, 値)**

<details><summary>説明・パラメータ</summary><div>

- 指定されたカラムを値分だけ下にずらす。
- 元のデータと結合することで過去のデータと同じレコードで比較できる
</div></details>

#WHEN
**CASE 
WHEN 条件式1 THEN 返り値1 
[WHEN 条件式2 THEN 返り値2] [ELSE 返り値]
END**

<details><summary>説明・パラメータ</summary><div>

- 条件分岐を行う。何個に分岐してもWHENで条件節を書き始める
</div></details>

# データ変換
## CAST, TO_CHAR, TO_DATE, TO_TIMESTAMP,
- **CAST(値 AS 書式)：値を指定された型に変換**
- **TO_CHAR(値, 書式)：文字列型の値を指定された書式の日付型に変換**
- **TO_DATE(値、書式)：数値型の値を指定された書式の日付型に変換**
- **TO_TIMESTAMP(値)：数値型のUNIX秒のデータをTIMESTAMP型に変換**

<details><summary>説明・パラメータ</summary><div>

**CHAR型**：固定長の文字列

**VARCHAR型**：可変調の文字列

**INTEGER型**：整数

**DATE型** : 日付を文字列として入力する場合の型

|Format|Sample|
|:---:|:---:|
|'YYYY-MM-DD'|'2020-01-12'|
|'YY-MM-DD'|'20-01-12'|
|'YYYYMMDD'|'20200112'|
|'YYMMDD'|'200112'|

(区切り文字は'-'のほかに'.'や'/','@'でも代用できる)

**TIME型** : 時刻を文字列として入力する場合の型

|Format|Sample|
|:---:|:---:|
|'HH:MM:SS'|'21-03-12'|
|'YY:MM'|'21-03'|
|'HHMMSS'|'210312'|
|'D HH:MM:SS'|'2 21:03:12'|

その他にも'MMSS','SS','D HH:MM','D HH'などがある。

**DATETIME型** : 日付と時刻を一緒人文字列として入力する場合の型

|Format|Sample|
|:---:|:---:|
|'YYYY-MM-DD HH:MM:SS'|'2020-01-12 21:03:12'|
|'YY-MM-DD HH:MM:SS'|'20-01-12 21:03:12'|
|'YYYYMMDDHHMMSS'|'20200112210312'|
|'YYMMDDHHMMSS'|'200112210312'|

**TIMESTAMP型** : 日付と時刻を一緒に文字列として表示する型。実態は整数なので計算ができる。DATETIMEが64bitに対してこちらは32bitそのため、2038年には使えなくなる。

</div></details>

## SUBSTR : 文字の切り取り
**SUBSTR(文字列, 開始位置, 切り取り文字数)**

- 文字列を切り取る（開始位置は1から始める）


# ファイル入出力
**COPY テーブル名 TO/FROM ファイルPath [options...]**

- TO：ファイルのエクスポート
- FROM：ファイルのインポート

<details><summary>説明・パラメータ</summary><div>

オプション
- **WITH CSV**：CSVファイル時に必須
- **HEADER**：ヘッダーの有無（出力では、各列名が追加され、入力では各列名が省かれる）
- **DELIMITERS**：区切り文字の指定(テキスト書式でのデフォルトはタブ文字、CSV書式ではカンマ)(CSVファイルで E'\t' を追加するとTSVファイルになる) 
- **ENCODING**：文字コードの指定（'UTF-8'もしくは'SJIS'）
</div></details>