これだけは抑えておく！　SQL【基本】

## SQLとは？
「SQL（エスキューエル）」は、データベース内のデータを操作するプログラム言語です。
データベースへのデータ挿入や参照の際は、SQLを介して行うのが一般的です。

Railsでは、SQLを意識することなく、データベースにデータを挿入したり参照できるように設計されています。
代わりにRails内部では、SQLを用いてデータベースへのデータ挿入や検索、削除などの操作を行っています。

## クエリとは？
データベースに送る命令（クエリ）
* USE

      取得するために使うデータベース名を記述する

    `USE データベース名`

* SELECT

      データベースから、データを取得するためには「SELECT」を用います。このSELECTを用いて、「どのカラムのデータを取得するか」を選びます。

    `SELECT name ;(カラム名)`

      ,で複数カラムを指定できる

    `SELECT name, price;`

      ＊で全てのカラムからデータを取得する
    `SELECT ＊;`

* FROM

      データベースには複数のテーブルが存在する場合があります。
      そのため、「FROM」を用いて、SELECTで選んだカラムが「どのテーブルのカラムか」を指定する必要があります。

    ```
    USE データベース名 (どのデータベースを使うのか)
    SELECT name (どのカラムのデータの？)
    FROM purchases;(どのテーブルの？)
    ```
   ＊SQLは大文字と小文字を区別しないため、小文字で記述しても問題ありません。

# 絶対に覚えるべきSQL（暗記してでも覚える！）

## 1.WHERE

特定のデータを`取得`するためには、「どこの」という意味を持つ「`WHERE`」を用います。「SELECT」と「FROM」で「どのテーブルのどのカラムのデータを`取得`するか」までは決まっていますので、「WHERE」が意味するのは、「`どこのレコード（横の行）を取得するか`」になります。

  ```
  SELECT name (どのカラムのデータの？)
  FROM purchases;(どのテーブルの？)
  WHERE category = "食費";(例「カテゴリーカラムが食費であるレコード」)
  ```



  ```
  SELECT 項目名
  FROM テーブル名
  WHERE　条件;
  ```

>WHERE句で条件を設定する際に利用できる代表的な演算子の種類
```
・「＝」　等しい
・「＞」　より大きい
・「＞＝」　以上
・「＜」　より小さい
・「＜＝」　以下
・「＜＞」、「！＝」　等しくない
・「in」　ある値が値のセット内に含まれているかどうか
・「not in」　値が値セット内に含まれていないかどうか
・「is null」　値がnullでない
・「is not null」　値がnullでない
・「like」　パターンマッチング（あいまい検索）
・「between...and...」　値が値の範囲内に含まれているかどうか
```

#### パターンマッチング

```
構文

select 項目名
FROM テーブル名
WHERE 列名
LIKE ワイルドカード文
```
>ワイルドカード文字について
・ワイルドカード文字で文字列のパターンを指定します

```
    1.'%'(パーセント)・・・０文字以上の任意の文字列
    2.'_'(アンダースコア)・・・任意の文字
```
・例）

```
    1.'中％'・・・'中'で始まる文字列
    2.'%中%'・・・'中'を含む文字列
    3.'%子'・・・'子'で終わる文字列
    4.'__子'・・・何かしらの2文字から始まり、'子'で終わる文字列
```

#### 取得件数を制限する`LIMIT`句

```
構文

SELECT 項目名
FROM テーブル名
LIMIT[オフセット,]最大取得件数;

＊オフセットは省略可能
```

例）

```
select * from products limit 10;
商品テーブルの全てのカラムから10件取得

select * from products limit 0,10;
商品テーブルの全てのカラムから1から10件取得

select * from products limit 10,10;
商品テーブルの全てのカラムから10から10件取得
```

#### データを並び替える`ORDER BY`
データを並び替えるためには、「〜順に並べる」という意味の`「ORDER BY」`を用います。またデータを並び替えるためには、「（基準となる）並べ替えたいカラム名」と「並べ方」を指定します。

```
ORDER BY 並び替えたいカラム　並べ方;
```
「ORDER BY」の並べ方は、「昇順」か「降順」を指定します。
昇順」は「小さい数から大きい数へ向かう順序」、「降順」は「大きい数から小さい数へ向かう順序」です。SQLでは「昇順」は「ASC」、「降順」は「DESC」と指定します。

```
ASC(昇順)：123.....100

DESC(降順)：100....321
```
```
例）
select 項目名
from テーブル名
where 条件
order by price desc;
```
## 2.INSERT

テーブルにレコードを`挿入`したいときはINSERTを使います。
INSERTとは「`挿入する`」という意味です。

```
INSERT INTO students(id,name,couurse)
VALUES(4,'Kate','Jsva'); ⤴︎ 順番通りに挿入される
```
＊多くの場合、`id`カラムには`AUTO INCREMENT`という機能が使われます。
`AUTOINCREMENT`とは「自動で増加する」といった意味で、データが作成されるときに自動で値が割り当てられます。


## 3.UPDATE

データを`更新`したいときには`UPDATE`を使います。
複数変更したいカラムがある場合、コンマ(,)で区切ります。

```
UPDATE students
SET name='jordan',course='HTML'
→ 指定カラムを新しい値にする
WHERE id＝６;
→ 更新するレコードをWHEREで指定する
```

＊注意点
WHEREで更新するレコードを指定しないとカラム内の全データが更新されてしまいます。
UPDATE実行後はデータを戻すことができません。実行前に一度SELECTを実行して、操作するデータを確認する習慣をつけましょう。


## 4.DELETE

レコードを削除するときは`DELETE`を使います。
UPDATEと同様にクエリ実行後はレコードを元に戻すことができないので、SELECTでレコードを確認してから削除を行いましょう。

```
DELETE FROM students
WHERE id=7;
→ 削除するレコードをWHEREで指定する
```

＊注意点
WHEREで削除するレコードを指定しないとテーブル内の全レコードが削除されてしまいます。



# まとめ

* 取得

        SELECT カラムA,カラムB
        FROM テーブル名;

* 挿入

        INSERT INTO テーブル名(カラムA,カラムB)
        VALUES(値１,値２);

* 更新

        UPDATE テーブル名
        SET カラムA＝値１,カラムB＝値２
        WHERE 条件; ← 必ず指定する

* 削除

        DELETE FROM テーブル名