SQL逆引きリファレンス

#はじめに
この記事は、よくSQLを書いてる時に
「あれどうやるんだっけ？」
となるものを個人的にまとめたものです。

また、出来るだけ横文字を使わないようにしています。

書籍や、公式ドキュメントを参考にしていますが、
DBMSなどの違いによってエラーになることもありますので
あらかじめご了承ください。

また記述ミス等ありましたら、教えていただけるとありがたいです。

#SQLとは
ざっくり言うと、データベースを操作する言語です。
SQLは大きく3つの種類に別れます。

###テーブルの中のデータを操作するDML　
例）検索、更新、削除、挿入など

###テーブル自体を操作するDDL
例）テーブル作成、テーブル削除など

###DMLやDDLの使用許可などを割り振ったりするDCL
例）権限の付与など

この記事では特に**DML**について記述していきます。

#逆引きリファレンス
##SQLの基本ルール
```SQL:基本ルール
--　ハイフンを二つ入力したらコメントになる
     --　行の先頭や　　　　行の途中に空白を入れることができる

/*
「/*　〜〜　*/」この範囲が
コメントになる
*/

SELECT * FROM XXX --　１行で書くこともできるし、

SELECT *
FROM XXX --　改行を入れて書くこともできる

--　SQLの予約語は、
select --　小文字でも書けるし
SeLeCt --　大文字と混ぜても書ける
SELECT --　一般的には全てを大文字にすることが多い

SELECT (SELECT列)   --　列名やテーブル名に、
FROM (SELECTテーブル) --　予約語を利用することはできない
```

##四大命令

###データを検索したい（SELECT）
```SQL:SELECT文
SELECT （列名1, 列名2, ・・・） --　「＊」を使うと全ての列を取得できる
FROM （テーブル名）
```

###データを更新したい（UPDATE)
```SQL:UPDATE文
UPDATE （テーブル名）
SET （列名） = （更新したいデータ）
--　更新したい情報がVARCHAR型、DATE型などの場合　''　で囲む
--　INTEGERなどの基本データ型はそのままでOK
```

###データを削除したい（DELETE）
```SQL:DELETE文
DELETE FROM （テーブル名）
WHERE （削除したいデータ）
--　WHEREのないDELETE文は、　「全データ削除」　になるので注意
```

###データを追加したい（INSERT)
```SQL:INSERT文
INSERT INTO (テーブル名)
VALUES (列名1, 列名2, ・・・)
--　VARCHAR型、DATE型などは　''　で囲む
--　INTEGERなどの基本データ型はそのままでOK
```

##行の絞り込み

###データを絞り込みたい
```SQL:
WHERE (条件式)
-- 条件式は、「YES」か「NO」で答えられるもの
-- つまり「真」か「偽」で判断出来なくてはならない
```

| 比較演算子 | 意味 |
|:-:|:-:|
| = | 左右の値が等しいか |
|<> | 左右の値が等しくないか |
|!= | <>の別の書き方で、これも左右の値が等しくないかを判断 |
| < | 左辺の値は右辺の値より小さいか |
| > | 左辺の値は右辺の値より大きか |
|<= | 左辺の値は右辺の値以下か |
|>= | 左辺の値は右辺の値以上か |


###NULLの判定をしたい
NULLは比較演算子を使うことが出来ません。
そのため、NULL専用の演算子が存在します。

```SQL:IS　NULL文
(式) IS NULL     -- NULLであることを判定する
(式） IS NOT NULL -- NULLでないことを判定する

例） WHERE 備考 IS NULL -- 備考がNULLのものを絞り込める
```

###文字列をざっくりと比較したい

```SQL:LIKE文
LIKE '税'   -- データの　中身　が「税」となっているものを絞り込める
LIKE '%税'  -- データの　末尾　が「税」となっているものを絞り込める
LIKE '税%'  -- データの　先頭　が「税」となっているものを絞り込める
LIKE '%税%' -- データに　「税」　と入っているものを絞り込める

例） WHERE 出費 LIKE '%税'
```

###範囲内に値が収まっているかを判定したい

```SQL:BETWEEN文
BETWEEN (値１) AND (値２)

例） WHERE 値段 BETWEEN 3000 AND 5000
-- 値段が3000円以上5000円以下のものを絞り込める
```

ANDだけでも同じようなことが書けます。

```SQL:AND文
値段 >= 3000 AND 値段 <= 5000
```

###複数の値で比較したい
比較演算子での比較は、一つの値しか比較出来ません。
ANDやORを使えば複数の値を比較出来ますが、
若干読みにくくなります。

IN/ANY/ALL演算子を使うと綺麗に見えます。

```SQL:IN文
式 IN (値1, 値2, 値3 ・・・)     -- 値に合致する行を検索
式 NOT IN (値1, 値2, 値3 ・・・) -- 値と合致しない行を検索

例) 出費 IN ('住民税', '交際費', '家賃') -- 出費列が'住民税', '交際費', '家賃'のもを検索
```

###複数の条件式を組み合わせたい
```SQL:AND/OR文
(条件式1) AND (条件式2) -- 条件式1と条件式２が　両方　真ならば真
(条件式1) OR (条件式2)  -- 条件式1と条件式２の　どちらか　が真ならば真

例) WHERE 出費 LIKE '%税' AND 値段 >= 5000 -- 出費列の末尾に'税'がついていて、かつ、値段が5000円以上か
```

##検索結果の加工

###検索結果から重複した行を除外する
```SQL:DISTINCT文
SELECT DISTINCT (列名)
FROM （テーブル名）

例） SELECT DISTINCT 出費 -- 内容が重複している行を取り除く
```

###検索結果を並び替える
```SQL:ORDER_BY文
SELECT (列名1, 列名2, 列名3・・・) FROM テーブル名
ORDER BY 列名 並び順
-- 並び順は、ASCまたはDESCの2つ
-- ASCは昇順、DESC降順
-- 何も書かなかった場合ASCになる

例) ORDER BY 値段 DESC -- 値段が降順、つまり高い順に並ぶ
例） ORDER BY 1, 2, 3 DESC -- 列１と２は昇順、３は降順で並び替えする
```

###検索結果から件数を限定して取得
```SQL:LIMIT文
LIMIT (取得行数)                     -- 入力した数値分の行を取得
LIMIT (取得行数) （OFFSET 除外する行数）  -- OFFSETで入力した数値分除外した行を取得

例) LIMIT 5 -- 先頭5行を取得
例) ORDER BY 値段 DESC
    LIMIT 5 OFFSET 5 -- 値段TOP６から１０を表示
```

###2つ以上の検索結果を繋げる
```SQL:UNION文
SELECT (列名1) FROM (テーブル名1)
UNION (ALL) -- ALLをつけると重複行も表示される
SELECT (列名1と同じ型の列) FROM (テーブル名2)

例) SELECT 商品名, 値段 FROM A商店
    UNION
    SELECT 商品名, 値段 FROM B商店
-- 2つの検索結果の表を合体させて表示する
-- UNIONする時は、列のデータ型と順番を一致させなければならない
```

###2つ以上の重複する検索結果を取り除く

OracleDBやMySQLでは
「EXCEPT」の代わりに「MINUS」を使う

```SQL:EXCEPT文
SELECT (列名1) FROM (テーブル名1)
EXCEPT (ALL)
SELECT (列名1と同じ型の列) FROM (テーブル名2)
-- UNIONが足し算だとしたら、EXCEPTは引き算
-- 条件が重なったものを除外する

例） SELECT 商品名, 値段 FROM A商店
    EXCEPT
    SELECT 商品名, 値段 FROM B商店
-- 2つ検索結果から重複行を除く
-- 同じ商品名でも値段が違えば重複と見られず、それぞれ表示される
```
###2つ以上の重複する検索結果のみを取り出す

EXCEPTで取り除かれるもの”のみ”取り出すと考えると分かりやすいかもしれません。

```SQL:INTERSECT文
SELECT (列名1) FROM (テーブル名1)
INTERSECT
SELECT (列名1と同じ型の列) FROM (テーブル名2)

例） SELECT 商品名, 値段 FROM A商店
    INTERSECT
    SELECT 商品名, 値段 FROM B商店
-- A商店とB商店に存在する「商品名」も「値段」も同じもののみ取り出す
```
###列名の名前を変更したい

```SQL:AS文
（列名） AS (変更したい名前) -- 「列名」が「変更したい名前」に置き換わる

例) SELECT 値段 AS A商店の商品の値段
-- 検索結果の列名が「値段」から「A商店の商品の値段」に変更される
```

###取得した列データに、数値や文字列追加などの加工したい

```SQL:計算式文
例）
SELECT 値段 + 1000 FROM 商品 -- 値段列の結果に１０００円足す
SELECT 取引日 + 5 FROM 取引  -- 取引日を5日進める

SELECT 値段 - 1000 FROM 商品 -- 値段列の結果から１０００円引く
SELECT 取引日 - 5 FROM 取引  -- 取引日を５戻す
SELECT '2018-12-10' - '2018-12-1' FROM 取引 
-- 取引日の差をを求める　この場合9が返ってくる
-- ただ、西暦や月が一致していない場合、返す数値がおかしくなるので、
-- その場合は、DATE型を計算する関数を呼び出す

SELECT 値段 * 1.08 FROM 商品 -- 商品の値段を1.08倍、つまり消費税込みで表示する
SELECT 値段 / 2 FROM 商品    -- 商品の値段を半分にする

-- 文字列同士は「+」で結合できない
SELECT 商品名 || '(税込)'    -- 商品名の横に(税込)文字列を追加する
```

##条件分岐

###条件を評価して、結果に応じた処理をしたい
```SQL:CASE文
SELECT 
CASE (評価する列、式) 
    WHEN （値1） THEN (値1の時に返す値)
    WHEN （値2） THEN (値2の時に返す値)
    ELSE (デフォルトの値)
END

例） SELECT 値段,
    CASE
        WHEN 値段 <= 5000 THEN '安い'
        WHEN 値段 <= 30000 THEN '普通'
        WHEN 値段　> 30000 THEN '高い'
    END AS 値段評価
-- 値段が5000円以下のものを安い
-- 値段が5000円以上、30000円以下のものを普通
-- 値段が30000円より上のものを高いと評価するCASE文
-- CASE文は上から評価していくので、「安い」と「普通」を入れ替えると
-- 「安い」と表示されていたものが全て「普通」になる
```

##関数

##集計関数

#最後までお読みいただきありがとうございます
関数と集計関数はのちに追加します。
ありがとうございました。