【基礎】SQLについて

データベースからデータを取得するには、「データを取得してください」といった、データベースに送る命令（クエリ）が必要。
SQLとはクエリを書くための言語。

##テーブル（説明用）
イメージしやすいように、例として以下のテーブルを作成してあるものとします。
（テーブル名：users）

|  id  |   name    |   age  |      hoby      |    create_at    |
|:----:|:---------:|:------:|:--------------:|:---------------:|
| 0    |  yamamoto |   40   | "剣道"          | "2018-04-23"    |
| 1    |  kawamura |   33   | "スキー"         | "2018-05-09"    |
| 2    |      tani |   36   | "卓球"          | "2018-07-11"    |
| 3    |   okajima |   38   | "ギャンブル"      | "2018-07-15"    |
| 4    |     ogura |   37   | 　　　　　       | "2018-09-09"    |
| 5    |    uetani |   39   | "野球"          | "2019-10-05"    |

##SELECT

**SELECT** ＝ データを取得するために用いる。どのカラムからデータを取得するか決める。
カラム名が「name」の場合↓↓

```sql
SELECT name
```
複数のカラムからデータを取得する場合はカンマ（,）で区切る↓↓

```sql
SELECT name,age,birthday
```
全てのカラムを取得する場合はアスタリスク（*）をつける↓↓

```sql
SELECT *
```

##FROM

**FROM** ＝　SELECTで選んだカラムがどのテーブルのカラムか指定する。
テーブル名が「users」の場合↓↓

```sql
FROM users
```

クエリの終了をセミコロン（;）で次のように示す。

```sql
SELECT *
FROM users;
```


##【特定のデータを取得する】
##WHERE
**WHERE** ＝ どこのレコード（横の列）を取得するか。
「age」カラム（縦列）が「33」であるレコード（横列）を取得する場合↓↓

```sql
WHERE age = 33;

/* ちなみに、データ型がテキストの場合はダブルorシングルクォーテーションで囲む必要がある。 */
WHERE hoby = "映画鑑賞";
/* データ型が日付データの場合も同様。 */
WHERE users_at = "2019-10-05";
```

##比較演算子を使用する
```sql
SELECT *
FROM users
/* 39歳以上の人のデータを取得する。 */
WHERE age >= 39;
```

下のように日付データにも使用できる。

```sql
/* 2018-07-11以前のデータを取得 */
WHERE create_at <= "2018-07-11";
```
##LIKE演算子を使用する
○○を含むデータを取得する。
基本形↓↓

```sql
SELECT *
FROM users
/* どこのカラムの、〇〇を含むデータを取得する。 */
WHERE カラム LIKE 文字列;
```
###（補足）ワイルドカードについて
> 引用元：[Wikipedia](https://ja.wikipedia.org/wiki/ワイルドカード_(情報処理))<details>
コンピュータなどの関連において、ワイルドカードは、検索などグロブの際に指定するパターンに使用する特殊文字の種類で、どんな対象文字、ないし文字列にもマッチするもののことである。カードゲームのワイルドカードに由来する呼称。
SQLの WHERE 句における LIKE predicate 中のパターンでは、長さ0文字以上の任意の文字列が「%」、任意の一文字が「_」である。
正規表現におけるクリーネ閉包とは似て非なるものであり混同してはいけない。</details>

LIKE演算子では、%を使用するとどんな文字列にも一致するようになる。
LIKE演算子の具体例↓↓

```sql
SELECT *
FROM users
/* hobyで「球」を含むデータを取得する。 */
WHERE hoby LIKE "%球%";
```
##LIKE演算子の「前方一致」と「後方一致」
`前方`一致の例↓↓

```sql
SELECT *
FROM users
/* 「球」が前にある文字列に一致する。「球技」は取得。「卓球」は取得しない。 */
WHERE hoby LIKE "球%";
```

`後方`一致の例↓↓

```sql
SELECT *
FROM users
/* 「球」が後にある文字列に一致する。「卓球」は取得。「球技」は取得しない。 */
WHERE hoby LIKE "%球";
```
##NOT演算子
否定を意味する`NOT`でデータを取得する。

```sql
SELECT *
FROM users
/* 「球」を含まないデータを取得する。 */
WHERE NOT hoby LIKE "%球%";
```
```sql
SELECT *
FROM users
/* 「ギャンブル」ではないデータを取得する。 */
WHERE NOT hoby = "ギャンブル";
/* ワイルドカードは使用していないことに注目。 */
```

##空データの取り扱い。「IS　NULL」  「IS　NOT　NULL」

###「IS　NULL」で空データを`指定して取得`する。
```sql
SELECT *
FROM users
/* 指定したhobyカラムがNULLであるデータを取得。 */
WHERE hoby IS NULL ;
/* この場合、id:4のデータを取得。 */
```

###「IS　NOT　NULL」空データを`除外して取得`する。
```sql
SELECT *
FROM users
/* 指定したhobyカラムがNULLではないデータを取得。 */
WHERE hoby IS NOT NULL ;
/* この場合、id:4以外のデータを取得。 */
```

##AND演算子
複数の条件を満たすデータを指定する。

```sql
SELECT *
FROM users
WHERE name = "okajima"
AND hoby = "ギャンブル";
/* 名前がokajimaで、趣味がギャンブルのデータを取得。
```

##OR演算子
複数の条件を取り扱う意味では、AND演算子と同じ。
「〇〇または〇〇」の条件を満たすデータを指定する。

```sql
SELECT *
FROM users
WHERE name = "okajima"
OR hoby = "ギャンブル";
/* 名前がokajimaもしくは、趣味がギャンブルのデータを取得。
```

##ORDER BY
データを並び替える。
並び替える順番の決め方には、「ASC」と「DESC」がある。

###ASC  、 DESC
ASCは「昇順」・・・小 → → → 大
DESCは「降順」・・・大 → → → 小

```sql
SELECT *
FROM users
ORDER BY age ASC;
/* 年齢が小さい方から大きい方へ並べ替える。
```

###WHEREとの組み合わせ

```sql
SELECT *
FROM users
WHERE hoby = "ギャンブル"
ORDER BY age DESC;
/* 趣味がギャンブルであるレコードを指定し、年齢が大きい方から小さい方へ並べ替える。
```