[SQL] MySQLでSQLを学ぶ~DDL編②~

## はじめに
前回の続きでDDLのSQLをまとめていきたいと思います。
前回はデータベースの操作方法でした。今回はテーブルの操作方法です。

## USE文
USE文はデータベースを指定するSQL文です。
USE 《database名》　でデータベースを指定します。

テーブルを作成する際、どのデータベースで作成するのか分からないのでUSE文で指定する必要があります。

実際に選択します。その前に前回削除したので、もう一度データベースを作成です。

```sql:ターミナル
mysql>  CREATE DATABASE sqltest;
Query OK, 1 row affected (0.01 sec)
```

成功したらUSEで選択します。

```sql:ターミナル
mysql> USE sqltest;
Database changed
```

これで作成したデータベースをいじれます。

## テーブルとカラムを作成する
テーブルとカラムを作成する時はCREATE TABLE文を使用します。

テーブル名やカラム名、カラムの型は下記のように指定し、作成します。

```sql
mysql> CREATE TABLE テーブル名 (カラム名1 カラム名1の型, カラム名2 カラム名2の型, …);
```

Railsでrails db:migrateが実行されると、実はCREATE TABLEが動いていたのです。
実際にSQLでテーブルを作ってみます。

今回は、商品の情報を保存することを想定し、goodsという名前のテーブルを作ります。
このテーブルのカラムには商品idを数値で保存するidカラムと商品名を文字列で保存するnameカラムを作成したいです。

Railsでカラムを設定する場合は、数字であればinteger型、文字であればstring型と指定していました。
SQLでも指定は必要ですが、表し方が違います。

| 型名 | 保存できる値 |
| ---- | --------- |
| INT | 数字 |
| VARCHAR(M) | 最大M文字の文字列 |

今回はidは数字なのでINT型
nameは文字なのでVARCHAR(255)型としてgoodsテーブルを作成します。


CREATE TABLEでテーブルgoodsを作成します。

```sql:ターミナル
mysql> CREATE TABLE goods (id INT, name VARCHAR(255));
Query OK, 0 rows affected (0.09 sec)
```

2行目が表示されれば成功です。

作成したテーブルもSHOW文で確認できます。

```sql:ターミナル
mysql> SHOW TABLES;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| goods             |
+-------------------+
1 row in set (0.00 sec)
```

このように表示されれば正しく作成できています。

## FROM句
ただ単にSHOWを先ほどのように使うとデータベースにあるテーブル名しか確認できません。
追加したカラムを確認するような、テーブルの構造を確認するにはFROM句というのを使います。

FROM句は対象となるテーブルを指定するときに使います。

```sql:ターミナル
mysql> SHOW columns FROM goods;
```

goodsテーブルのカラムを見してくれ！みたいな意味の命令文です。

```sql:ターミナル
mysql> SHOW columns FROM goods;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
```

これで先ほど作ったカラムもしっかり作成されていることが確認できますね。

## ALTER文
後からカラムを追加したいと思った時、ALTER（オルター）文を使うとデータベースやテーブルの編集できます。

例えば、カラムを一つだけ追加しようとするなら、下記のように記述します

```sql
mysql> ALTER TABLE テーブル名 ADD カラム名 カラムの型;
```

複数追加したい場合

```sql
mysql> ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……);
```

今回はpriceとzaikoというカラムを追加します。

```sql:ターミナル
mysql> ALTER TABLE goods ADD (price int, zaiko int);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

これで追加完了したはずです、確認してみましょう

```sql:ターミナル
mysql> SHOW columns FROM goods;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
| price | int(11)      | YES  |     | NULL    |       |
| zaiko | int(11)      | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
```

追加したカラムが表示されていたら成功です。

ALTER文は編集ができるので、カラムを変更することもできます。
zaikoというカラム名を英語表記のstockにしましょう。

変更する時は下記のように記述します。

```sql
mysql> ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
```
この場合カラムの型を変更しないとしても、もう一度カラムの型を記述する必要があります。
上記の記述に変更したい内容を当てはめて実際に実行します。

```sql:ターミナル
mysql> ALTER TABLE goods CHANGE zaiko stock int;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

これでzaikoカラムが変更されているはずです。
確認してみましょう

```sql:ターミナル
mysql> SHOW columns FROM goods;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
| price | int(11)      | YES  |     | NULL    |       |
| stock | int(11)      | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
```

次が最後です。
ALTER文を使ってカラムを削除します。

```sql
mysql> ALTER TABLE テーブル名 DROP カラム名;
```
これに当てはめて、カラムの削除を実際に行います。

```sql:ターミナル
mysql> ALTER TABLE goods DROP stock;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

削除されているか確認しましょう。

```sql:ターミナル
mysql> SHOW columns FROM goods;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
| price | int(11)      | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
```

stockがしっかり削除していますね。

##　最後に
二回にわたってSQLのDDLの主な命令文を学びました。これでもSQLのほんの一部だと思いますが、だんだんとデータベース学習が少し楽しくなってきました。
これからもっとデータベースの理解を深めていきたいです。