【これだけ覚えてたらOK！】SQL構文まとめ


SQL入門者へ！
これだけ構文知っておいたら大丈夫！
少し多いですが、一つ覚えるとあとは応用するだけのものが多いので
ガチャガチャ使っていきましょう！！

##基本
###【取得】

```sql:基本
SELECT * 
FROM テーブル名
```
「*」(アスタリスク)は「すべてのカラム」と言う意味。


###【追加】

```sql:基本
INSERT INTO テーブル名
   VALUES ('1', 'タカシ', '初ツイート！', '2017/07/05' ,'2017/07/05')
```
VALUES後の値は設定しているカラムの左から順番に入れたい値を入れていく。


###【更新】

```sql:基本
UPDATE テーブル名
   SET カラム名 = 値, カラム名 = 値 
 WHERE id = 1
```
WHERE以降は更新したいレコードの条件をつける。

###【削除】

```sql:基本
DELETE FROM テーブル名
    WHERE 条件
```

##検索の絞込
###【ANDとOR】
・ANDの場合

```sql:絞込
SELECT *
  FROM テーブル名
WHERE 条件 AND　条件
```

・ORの場合

```sql:絞込
SELECT *
  FROM テーブル名
WHERE 条件 OR　条件
```

###【比較演算子】

|比較演算子|意味|
|:--|:--|
|=|左右の値が等しい|
|<|左辺は右辺より小さい|
|>|左辺は右辺より大きい|
|<=|左辺は右辺の値以下|
|>=|左辺は右辺の値以上|
|<>|左右の値が等しくない|


```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE 値段 >= 1000
```
###【NULL判定】
・指定のカラムの値がNULLの所の指定

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE カラム名 IS NULL
```

・指定のカラムの値がNULLではない所の指定

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE カラム名 IS NOT NULL
```

###【LIKE文】

|パターン文字|意味|
|:--|:--|
|%|任意の0文字以上の文字列|
|_(アンダースコア)|任意の１文字|


・メモカラムの値に「1月」の前後に任意の０文字以上の文字列がついているレコードの指定

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE メモ LIKE '%1月%'
```

・メモカラムの値に「1月」で始まり、その後ろに1文字存在するレコード

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE メモ LIKE '1月_'
```



###【BETWEEN演算子】

・ある範囲内に値が収まっているかの判定

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE 出金額 BETWEEN 1000 AND 30000
```

###【IN/NOT IN演算子】

・指定のカラムの値が指定の値のいずれかと合致する所を抽出する。

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE カラム名 IN (値1,値2,値3,・・・)
```

・指定のカラムの値が指定の値のいずれとも合致しない所を抽出する。

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE カラム名 NOT IN (値1,値2,値3,・・・)
```

###【ANY/ALL演算子】

・値リストのそれぞれと比較して、いずれかが真なら真

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE カラム名 =< ANY (値1,値2,値3,・・・)
```


・値リストのそれぞれと比較して、すべてが真なら真

```sql:絞込（例）
SELECT *
  FROM テーブル名
WHERE カラム名 =< ALL (値1,値2,値3,・・・)
```

##検索結果の加工
###【DISITINCT】
・重複行を除外する

```sql:結果加工（例）
SELECT DISTINCT　ユーザー名
  FROM テーブル名
```
###【ORDER　BY】
・結果を並べ替える

```sql:結果加工（例）
SELECT *
  FROM テーブル名
ORDER BY 金額 DESC
```

昇順→ASC、　降順→DESC

###【LIMIT】
・先頭から数行だけ取得する

```sql:結果加工（例）
SELECT *
  FROM テーブル名
ORDER BY 金額 DESC　LIMIT　３　OFFSET　２
```

OFFSETをつけると（指定の数字+1）番目のデータを取得してくれる。

###【UNION】
・和集合：２つの検索結果を足し合わせたもの

```sql:結果加工（例）
SELECT ユーザー名, 年齢, 住所　FROM　ユーザー１
 UNION
SELECT ユーザー名, 年齢, 住所　FROM　ユーザー2
```


###【EXCEPT】
・差集合：最初の検索結果から次の検索結果と重複する部分を取り除いたもの

```sql:結果加工（例）
SELECT ユーザー名, 年齢, 住所　FROM　ユーザー１
EXCEPT
SELECT ユーザー名, 年齢, 住所　FROM　ユーザー2
```

###【INTERSECT】
・積集合：２つの検索結果で重複するもの

```sql:結果加工（例）
SELECT ユーザー名, 年齢, 住所　FROM　ユーザー１
INTERSECT
SELECT ユーザー名, 年齢, 住所　FROM　ユーザー2
```

##演算子と関数
###【代表的な演算子】
<table>
<tr>
  <th>演算子</th>
  <th>使い方</th>
  <th>説明</th>
</tr>
<tr>
  <td rowspan="2">+</td>
  <td>数値 + 数値</td>
  <td>数値同士で足し算をする</td>
</tr>
<tr>
  <td>日付 + 日付</td>
  <td>日付を指定日数だけ進める</td>
</tr>
<tr>
  <td rowspan="3">-</td>
  <td>数値 - 数値</td>
  <td>数値同士で引き算する</td>
</tr>
<tr>
  <td>日付 - 数値</td>
  <td>日付を指定日数だけ戻す</td>
</tr>
<tr>
  <td>日付 - 日付</td>
  <td>日付の差の日数を得る</td>
</tr>
<tr>
  <td>*</td>
  <td>数値 * 数値</td>
  <td>数値同士で掛け算する</td>
</tr>
<tr>
  <td>/</td>
  <td>数値 / 数値</td>
  <td>数値同士で割り算する</td>
</tr>
<tr>
  <td>||</td>
  <td>文字列 || 文字列</td>
  <td>文字列を連結する</td>
</tr>
</table>

###【CASE演算子】
・データの抽出時に使える条件分岐演算子

```sql:演算子（例）
SELECT ユーザー名, 
       CASE 年齢 WHEN　年齢 < 20　THEN　'未成年'
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　WHEN　年齢　=>　20 AND　年齢　<=　65　THEN　'成年'
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　ELSE　'高齢者'
       END AS 分類
　FROM　ユーザー
```

###【LENGTH】
・文字列の長さを数値で出してくれる

```sql:関数（例）
SELECT ユーザー名, LENGTH(ユーザー名) AS 名前の文字数
  FROM ユーザー
```

###【TRIM】
・指定の文字列から空白を除去してくれる

```sql:関数（例）
SELECT ユーザー名, TRIM(ユーザー名) AS 空白を取り除いたユーザー名
  FROM ユーザー
```

###【REPLACE】
・指定の文字列の一部を置換する

```sql:関数（例）
UPDATE ユーザー
   SET ユーザー名　= REPLACE(ユーザー名,'チンパンジー','ゴリラ')
```
上記はユーザー名が「チンパンジー」の所を「ゴリラ」にアップデートした処理

###【SUBSTRING】
・文字列の一部を抽出する関数

```sql:関数（例）
SELECT * FROM ユーザー
 WHERE SUBSTRING(ユーザー名, 1, 3) LIKE '%チン%'
```
ユーザー名列の１〜３文字目に「チン」があるものだけを抽出

###【ROUND】
・指定桁で四捨五入

```sql:関数（例）
SELECT 出金額, ROUND(出金額, -2) AS 百円単位の出金額 
FROM 家計簿
```

###【TRUNC】
・小数点以下の指定桁で切り捨てる

```sql:関数（例）
SELECT 出金額, TRUNC(出金額, 1) AS 小数点以下1桁目以降を切り捨てた出金額 
FROM 家計簿
```

###【POWER】
・べき乗を計算する

```sql:関数（例）
SELECT 出金額, POWER(出金額, 2) AS 出金額を２乗した額 
FROM 家計簿
```

###【CURRENT_DATE】
・現在の日付を得る

```sql:関数（例）
INSERT INTO 家計簿
     VALUES (CURRENT_DATE, '食費', 'ドーナツ買った', 260)
```

###【CAST】
・データ型を置換する

```sql:関数（例）
SELECT CAST(出金額 AS VARCHAR(20)) + '円' AS 出金額（円）
FROM 家計簿
```

##集計とグループ化
###【集計】
<table>
<tr>
  <th>分類</th>
  <th>関数名</th>
  <th>説明</th>
</tr>
<tr>
  <td rowspan="4">集計</td>
  <td>SUM</td>
  <td>各行の値の合計を求める</td>
</tr>
<tr>
  <td>MAX</td>
  <td>各行の値の最大値を求める</td>
</tr>
<tr>
  <td>MIN</td>
  <td>各行の値の最小値を求める</td>
</tr>
<tr>
  <td>AVG</td>
  <td>各行の値の平均値を求める</td>
</tr>
<tr>
  <td>計数</td>
  <td>COUNT</td>
  <td>行数をカウントする</td>
</tr>
</table>


```sql:集計（例）
SELECT SUM(出金額) AS 合計出金額
  FROM 家計簿
```

```sql:計数（例）
SELECT COUNT(*) AS 合計取引数
  FROM 家計簿
```
COUNT(*)はNULL行も含めてカウント。
COUNT(カラム)はNULL行は含まずカウント。

【グループ化】
・指定のカラムの同様の値ごとにグループ分けをしてくれる。

```sql:グループ化（例）
SELECT 費目, SUM(出金額) AS 費目別の出金合計額
  FROM 家計簿
GROUP BY 費目
```

##副問合せ
条件の指定のときなどの値もselect文で持ち出すことができる。
色んな所で副問合せを使った値をとりだすことができる。

```sql:副問合せ（例）
SELECT 費目, SUM(出金額) AS 費目別の出金合計額
  FROM 家計簿
GROUP BY 費目
```

##テーブルの結合

```sql:テーブルの結合（例）
SELECT 日付, 名前 AS 費目, メモ
  FROM 家計簿
  JOIN 費目
    ON 家計簿.費目ID = 費目.ID
```
ON句には相互に等しいデータが所属しているカラムを左辺右辺に設定する。

#参考本
[スッキリわかるSQL入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-SQL-%E5%85%A5%E9%96%80-%E3%83%89%E3%83%AA%E3%83%AB215%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4844333933/ref=sr_1_1?ie=UTF8&qid=1499257314&sr=8-1&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80+%E3%83%89%E3%83%AA%E3%83%AB215%E5%95%8F%E4%BB%98%E3%81%8D)