基礎的なSQL の書き方メモ


> SQLは大文字と小文字を区別しないため、小文字で記述しても問題ありません。
> 

> 「ここまでがクエリです」ということを伝えるためのセミコロン（；）を加える
> 


### 実行手順
上 → 先
下 → 後

| 〜句             | 内容             | 
| ---------------- | ---------------- | 
| FROM             | テーブル指定     | 
| JOIN             | テーブルの結合   | 
| WHERE            | 条件指定         | 
| GROUP BY         | グループ化       | 
| SUM, AVGなど      | 関数             | 
| HAVING           | 集計後の絞り込み | 
| SELECT, DISRINCT | 検索             | 
| ORDER BY         | 並べ替え         | 
| LIMIT            | 取得件数の指定   | 


- コメントアウト
    
    ```sql
    -- 
    
    /* contents */
    ```
    
- column（列）のデータを取得
    
    ```sql
    SELECT columnname
    ```
    
- tableの指定
    
    ```sql
    FROM　tablename;
    ```
    

- columnを選択する時に先にcolumn名を指定し、次はtable名を指定する


    ```sql
    SELECT columnname
    FROM　tablename;
     ```

- 複数のcolumnを選択する
    
    ```sql
    SELECT columnname1,columnname2,columnname3
    FROM　tablename;
    
    すべてのcolumnを選択する
    SELECT *
    FROM　tablename;
    ```
    
- record（行）を取得する
    
    ```sql
    WHERE columnname = "recordname"
    ```
    
- ある文字を含むデータを取得する
    
    ```sql
    SELECT columnname
    FROM　tablename
    
    特定のcontentsのデータ
    WHERE columnname LIKE "contents"
    contentsを含むすべてのデータ
    WHERE columnname LIKE "%contents%"
    contents前方一致のデータ
    WHERE columnname LIKE "contents%"
    contents後方一致のデータ
    WHERE columnname LIKE "%contents"
    ```
    
- 条件に満たさないデータ
    
    ```sql
    SELECT columnname
    FROM　tablename
    WHERE NOT columnname >= "contents"
    WHERE NOT columnname LIKE "contents"
    ```
    
- 何のデータも保存されていない場合
    
    ```sql
    NULL
    NULLのデータやNULLでないデータを取得する場合は
    
    SELECT columnname
    FROM　tablename
    
    WHERE columnname IS NULL
    WHERE columnname IS NOT NULL
    
    使用できない　WHERE columnname LIKE NULL
    使用できない　WHERE columnname = NULL
    
    ```
    
- WHEREに複数の条件を指定する
    
    ```sql
    SELECT columnname
    FROM　tablename
    
    WHERE columnname1 = "contents"
    AND columnname2 = "contents"
    ```
    
- WHERE 条件１ OR 条件２
    
    ```sql
    SELECT columnname
    FROM　tablename
    
    WHERE columnname1 = "contents"
    OR columnname2 = "contents"
    ```
    
- データを並び替える
    
    ```sql
    SELECT *
    FROM　tablename
    
    「昇順」は「ASC」、「降順」は「DESC」
    ORDER BY （基準となる）並べ替えたいcolumn名　並べ方
    
    ```
    
- 「最大で何件取得するか」を指定する
    
    ```sql
    SELECT *
    FROM tablename
    LIMIT number
    ```
    
- 検索結果から指定したcolumnの重複するデータを除く
    
    ```sql
    SELECT distinct(columnname)
    FROM tablename
    ```
    
- 各種の計算
    
    nullは計算されない
    
    ```sql
    +
    -
    *
    /
    合計を求めるSUM(columnname)
    平均を求めるAVG(columnname)
    サンプルサイズを計算するCOUNT(columnname)
    最小のデータMAX(columnname)
    最大のデータMAX(columnname)
    
    ```
    
- データをグループ化する
    
    ```sql
    SELECT columnname1, columnname2
    FROM tablename
    GROUP BY columnname1/columnname2
    ```
    
- 条件を満たすグループを取得する。HAVINGはGROUP BYによってグループ化されたデータを検索対象としする。
    
    ```sql
    SELECT columnname1, columnname2
    FROM tablename
    GROUP BY columnname1/columnname2
    HAVING 条件
    ```
    
- サブクエリとは2つ以上のクエリを1つにまとめることができるので、より複雑なデータを取得する際に使われます。
    
    ```sql
    SELECT columnname1
    FROM tablename
    WHERE columnname1 比較符 (
    	SELECT columnname1
    	FROM tablename
    	WHERE columnname1 
    );
    ```
    
- 取得したカラム名の表示を変更することができる
    
    ```sql
    SELECT columnname1 AS "newname"
    ```
    
- 複数のテーブルを1つに結合する
    
    ```sql
    SELECT *
    FROM tablename1
    JOIN tablename2
    ON　結合条件(table名1.外部column名 = table名2.主キーcolumn名)(主に二つのtableの重なっている部分)
    ```
    
- FROMで指定したテーブルのレコードを全て取得する
    
    ```sql
    SELECT columnname1
    FROM tablename1
    
    LEFT JOIN tablename2
    /* LEFT JOIN はFROMの後ろに書くテーブルを基準テーブルとして参照する*/
    /* RIGHT JOIN の後ろに書くテーブルは基準テーブルとして参照する*/
    /* INNER JOIN　はFROMとINNER　JOINの後ろに書くテーブル両方を参照する*/
    ON　結合条件(tablename1.外部column名 = tablename2.主キーcolumn名)
    ```

- CASE式で条件分岐
    ```sql
        --単純CASE式
        CASE gender
            WHEN '男' THEN 1
            WHEN '女' THEN 2
            ELSE 99
        END

        --検索CASE式
        CASE
            WHEN gender = '男' THEN 1
            WHEN gender = '女' THEN 2
            ELSE 99
        END
    ```

- テーブルにレコードを挿入する
    
    > 多くの場合、idカラムにはAUTO INCREMENTという機能が使われます。AUTO INCREMENTとは「自動で増加する」といった意味で、データが作成されるときに自動で値が割り当てられます。
    > 
    
    ```sql
    INSERT INTO tablename (columnname1, columnname2) VALUES ('contents', 'contents');
    ```
    
- データを更新する
    
    ```sql
    UPDATE tablenem
    SET columnname1 = "contents", columnname2 = "contents"
    WHERE record = contents;
    ```
    
- レコードを削除する
    
    ```sql
    DELETE FROM tablename
    WHERE record;
    ```


### 参考記事
- https://qiita.com/yurina0402/items/78ae1f536b6755d6221a
- https://qiita.com/sfp_waterwalker/items/acc7f95f6ab5aa5412f3