【SQL】RDB操作をMySQL環境で実践

# はじめに
今回は、SQLによるデータベース操作について、まとめます。
最後に無料でSQLが学べるサイトを紹介しています。

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

# この記事の目的
以下内容についてアウトプット
-  SQLの基礎知識
-  SQLの書き方

# この記事の内容
1. SQLとRDBについて
2. 基礎文法
3. 実践的な文法

# 1. SQLとRDBについて
### SQLとは
Structured Query Language（ストラクチャード クエリ ランゲージ)
の略。（クエリは、問い合わせなどの意味を持ちます。）

**RDBを操作するための言語** であり、データベースに与える命令は以下3つの目的に分類できます。

- データ定義言語 - DDL（Data Definition Language）
    - データの作成・削除・変更
     
- データ操作言語 - DML（Data Manipulation Language）
    - データの検索・取得・登録・更新・削除
    
- データ制御言語 - DCL (Data Control Language)
    - データベースに対して行なった変更の確定・取消
    - 操作の権限を設定

### RDBとは
リレーショナルデータベース（関係データベース）の略。

**複数のテーブルによって構成されたデータベースの管理方式** のこと。
データを複数の表（テーブル）で管理し、それぞれの関係を定義することにより、複雑なデータを処理することができる。

# 2. 基礎文法

**■ CREATE文** 
データベースやテーブルを作成する。

`rails db:migrate`の裏側では、CREATE TABLE文によってテーブルとカラムが作成されている。

```SQL
/* データベースを作成 */
mysql> CREATE DATABASE データベース名;

/* テーブルを作成 */
mysql> CREATE TABLE テーブル名 (カラム名1 カラム名1の型, カラム名2 カラム名2の型, …);

/* 例 */
mysql> CREATE TABLE items (id INT, name VARCHAR(255));
```

**■ DROP文**
データベースやテーブルを削除する。

```SQL
/* データベースを削除 */
mysql> DROP DATABASE データベース名;
```

**■ ALTER文**
データベースやテーブルを編集する。

```SQL
/* カラムを追加 */
mysql> ALTER TABLE テーブル名 ADD (カラム名1 カラム名1の型, カラム名2 カラム名2の型...);

/* カラムを変更 */
mysql> ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;

/* カラムを削除 */
mysql> ALTER TABLE テーブル名 DROP 削除したいカラム名, DROP 削除したいカラム名...;
```

**■ USE文**
どのデータベースを使用するか指定する。
テーブルを操作する場合、「どのデータベースにあるテーブル」を選択する必要がある。
指定しなかった場合・・・`ERROR 1046 (3D000): No database selected`
```SQL
/* データベースを選択 */
mysql> USE データベース名;
```

**■ SHOW文**
データベースやテーブルを一覧表示する。
`FROM句` は、対象となるテーブルを指定する際に使用する。
```SQL
/* データベースを表示 */
mysql> SHOW DATABASES;

/* テーブルを表示 */
mysql> SHOW TABLES;

/* テーブルの構造を表示 */
mysql> SHOW columns FROM テーブル名;
```

**■ INSERT文**
テーブルにデータを登録する。
`INTO句, VALUES句` と組み合わせて使用する。

```SQL
/* 全てのカラムにデータを登録 */
mysql> INSERT INTO VALUES(値1, 値2, 値3);

/* 指定のカラムのみデータを登録する */
mysql> INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
```

**■ UPDATE文**
データを更新する。
`SET句, WHERE句` と組み合わせて使用する。

```SQL
mysql> UPDATE テーブル名 SET 変更内容 WHERE 条件;
```

**■ DELETE文**
データを削除する。
`FROM句, WHERE句` と組み合わせて使用する。
```SQL
mysql> DELETE FROM テーブル名 WHERE 条件;
```

**■　SELECT文**
データを取得する。
`*（ワイルドカード）` は、「全てのパターンにマッチするもの」を意味する。
```SQL
/* テーブルから全てのカラムを取得 */	
mysql> SELECT * FROM テーブル名;

/* テーブルから指定のカラムを取得 */
mysql> SELECT カラム名 FROM テーブル名;
```

# 3. 実践的な文法
### データ検索について
- **WHERE句**
条件にによって制限したデータを取得する。

- **LIKE句**     
`WHERE句+LIKE句` で文字列検索を行う。

- **AND演算子** 
複数条件に合ったデータを取得する。

- **OR演算子** 
複数の条件のうち、1つ以上を満たしたデータを取得する。

- **NOT演算子** 
条件以外のデータを取得する。

- **BETWEEN句**
`BETWEEN句+AND演算子` で上限と下限を設定し、範囲に含まれているデータを取得する。

- **IN演算子** 
1つのカラムに対しリストを指定し、特定の条件が含まれるデータを取得する。

```SQL
/* LIKE句 */
mysql> SELECT * FROM テーブル名　 WHERE カラム名 LIKE '検索文字';　

/* AND演算子 */
mysql> SELECT * FROM テーブル名　 WHERE 条件1 AND　条件2;

/* OR演算子 */
mysql> SELECT * FROM テーブル名　 WHERE 条件1 OR　条件2;

/* NOT演算子 */
mysql> SELECT * FROM テーブル名　 WHERE NOT 条件1;

/* BETWEEN演算子 */
mysql> SELECT * FROM テーブル名　 WHERE カラム名 BETWEEN 下限 AND 上限;

/* IN演算子 */
mysql> SELECT * FROM テーブル名　 WHERE カラム名 IN(値1, 値2...):
```

### データ検索の応用
- **JOIN句**
指定したテーブルのカラムの値が一致するデータを元に、各テーブルのレコードを結合する。
書き方：`FROM テーブル名　JOIN テーブル名　ON 値1 = 値2;`

- **CONCAT関数**
複数の文字列を連結する。
書き方：`CONCAT(文字列1, 文字列2...)`

- **GROUP BY句**
特定のデータをグループ化する。
書き方：`GROUP BY カラム名`

- **COUNT関数**
データの総量をカウントする。
書き方：`COUNT(カラム名)`

- **サブクエリ**
ある検索結果を利用し、別のSQL文を発行する仕組みのこと。

```SQL
/* テーブルを結合しデータを取得 */
mysql> SELECT *FROM shifts s JOIN users u ON s.user_id = u.id;

/* 文字列を連結 */
CONCAT(文字列1, 文字列2, ……)

/* 特定の日に誰がどのくらいシフトに入ったか？ */
mysql> SELECT
          CONCAT(last_name, first_name) "名前",
          COUNT(*) "コマ数"
       FROM shifts s
       JOIN users u ON s.user_id = u.id
       WHERE date = "2015-07-01"
       GROUP BY user_id;

=>  +-----------------+-----------+
    | 名前            | コマ数      |
    +-----------------+-----------+
    | 白坂拓実         |         1 |
    | 松田里帆         |         2 |
    | 舘林丈二         |         1 |
    +-----------------+-----------+

/* 特定の日にシフトに入ってなかった人は？ */
mysql> SELECT *
       FROM users
       WHERE id NOT IN (
         SELECT user_id
        　　FROM shifts
        　　WHERE date = "2015-07-01"
       );
```
　
# 参考
SQLの学習サイト（無料）です。

https://tech.pjin.jp/blog/tag/sql%e7%b7%b4%e7%bf%92%e5%95%8f%e9%a1%8c/

http://sql.main.jp/