【SQLに慣れる】データベース・テーブル・カラムの作成

データベースからテーブル・カラムの作成について、基本コマンドを確認する。

# 使用DBMS

MySQL Version 5.7.22（当記事内では、MySQL特有のコマンドがあるかもしれません。）

# データベース

## 作成

``CREATE DATABASEコマンド``で``sample_dbデータベース``を作成する。

```sql
mysql> CREATE DATABASE sample_db;
Query OK, 1 row affected (0.01 sec)
```

## 使用DBの切り替え

``useコマンド``で使用するデータベースを切り替える。

```sql
mysql> use sample_db
Database changed
```

## DBの一覧を表示

``SHOWコマンド``でデータベースの一覧を表示する。

```sql
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| auth               |
| camp               |
| db1                |
| db2                |
| larabbs            |
| login              |
| mysql              |
| performance_schema |
| phpmyadmin         |
| sample_db          |
| shop               |
| sys                |
| testcake_db        |
| testlara           |
+--------------------+
15 rows in set (0.01 sec)
```

## 現在の使用DBを表示

``SELECT DATABASE();``で、現在使用しているデータベースを表示できる。

```sql
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| sample_db  |
+------------+
1 row in set (0.00 sec)
```

## プロンプトの設定

``SELECT DATABASE();``で毎回確認するのは面倒くさい・・・。こんな時は、``プロンプト``を設定してユーザー名や使用データベースを常時表示させることもできる。（再起動したら設定がもとに戻ってしまったが。）

プロンプトは``promptコマンド``で設定可能だ。

```sql
mysql> prompt \u:\d>
PROMPT set to '\u:\d>'
yuki:(none)>
```

``\u``はユーザー名を、``\d``はデータベース名を意味する。つまり、``\u:\d>``を指定すれば、プロンプトは``ユーザー名:データベース名>``の状態で表示される。（現在はデータベースが選択されていないため、(none)の表示となっている。）

ちなみにMacのターミナルで実行した場合、``\``の部分を``¥``に置き換えると正しく反映されない。

## 削除

``DROP DATABASEコマンド``でデータベースを削除できる。（今回、コマンドの実行はしていない。）

```sql
yuki:sample_db>DROP DATABASE sample_db;
```

# テーブル

## 作成

``CREATE TABLEコマンド``で``memberテーブル``を作成する。

カラムは以下の内容で設定する。

| カラム名 | データ型 | 制約 |
|:-----------|:-----------|:-----------|
| id         | INT        | PRIMARY KEY, AUTO_INCREMENT    |
| namae      | VARCHAR(4) |              |
| job        | VARCHAR(10)|              |

```sql
yuki:sample_db> CREATE TABLE member (
    -> id INT PRIMARY KEY AUTO_INCREMENT,
    -> namae VARCHAR(4),
    -> job VARCHAR(10)
    -> );
Query OK, 0 rows affected (0.01 sec)
```

## テーブルの一覧を表示

``SHOWコマンド``を使用して、データベース内のテーブルの一覧を表示させる。

```sql
yuki:sample_db>SHOW TABLES;
+---------------------+
| Tables_in_sample_db |
+---------------------+
| member              |
| money_check         |
+---------------------+
2 rows in set (0.01 sec)
```

## 削除

``DROP TABLEコマンド``でテーブルを削除できる。（今回、コマンドの実行はしていない。）

``IF EXISTS``を加えると、``memberテーブル``が実在した場合のみ、コマンドが実行される。

```sql
yuki:sample_db>DROP TABLE IF EXISTS member;
```

## カラム構造を表示

``DESCコマンド``でテーブル内のカラム構造が表示できる。

```sql
yuki:sample_db>DESC member;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| namae | varchar(4)  | YES  |     | NULL    |                |
| job   | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
```

## カラムの追加

``ageカラム``を追加する。カラムを追加するときは、``ALTER TABLEコマンド``に``ADD``を加えた構文を使う。

| カラム名 | 型 | 制約 |
|:-----------|:-----------|:-----------|
| age         | INT       |            |

```sql
yuki:sample_db>ALTER TABLE member ADD age INT;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

yuki:sample_db>DESC member;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| namae | varchar(4)  | YES  |     | NULL    |                |
| job   | varchar(10) | YES  |     | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
```

## カラムの編集

### データ型の変更

``namaeカラム``が4文字限定では厳しいので、これを10文字に変更したい。名前が4文字限定と言うと、昔のドラクエが連想される。（濁点も1文字としてカウントされたのは良い思い出だ。）

カラムのデータ型を変更するときは、``ALTER TABLEコマンド``に``MODIFY``を加えた構文を使用する。

```sql
yuki:sample_db>ALTER TABLE member MODIFY namae VARCHAR(10);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

yuki:sample_db>DESC member;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| namae | varchar(10) | YES  |     | NULL    |                |
| job   | varchar(10) | YES  |     | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
```

### カラム名の変更

さらに、``namae``を``name``に修正したい。カラム名の変更には、``ALTER TABLEコマンド``に``CHANGE``を加えた構文を使う。

しかし、この構文では名前の変更だけ行おうとするとエラーが発生してしまう。

```sql
yuki:sample_db>ALTER TABLE member CHANGE namae name;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
```

ここでは、``カラムのデータ型も同時に指定しなければならない``ようだ。先ほどデータ型の変更を行ったが、再度指定してコマンドを実行する。

```sql
yuki:sample_db>ALTER TABLE member CHANGE namae name VARCHAR(10);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

これで変更が反映された。

### カラム位置の変更

``ALTER TABLEコマンド``では、``FIRST``や``AFTER カラム名``を指定してカラムの位置を変更することもできる。

```sql
yuki:sample_db>ALTER TABLE member CHANGE name name VARCHAR(10) AFTER age;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

yuki:sample_db>DESC member;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| job   | varchar(10) | YES  |     | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
| name  | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
```


## カラムの削除

``ageカラム``を削除することにした。カラムの削除には、``ALTER TABLEコマンド``に``DROP``を加えた構文を使用する。

```sql
yuki:sample_db>ALTER TABLE member DROP age;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

yuki:sample_db>DESC member;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
| job   | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
```

今回はここまで。