初学者がSQLを使ってみる

# はじめに
基礎的なSQLコマンドは就職前に勉強しておいた方が良いと勧められた為、復習用としてまとめました。

# SQLの使用方法
ターミナルでは、**MySQL**という**RDBMS**を使用してSQLを実行できます。
MySQLを使用するには、ターミナルからログインします。

```terminal
# ホームディレクトリへ戻る
% cd

# MySQLに接続
% mysql -u root
```
`-u root`というオプションで、ユーザーは「ルート」でログインするという意味になります。
ここでいうルートとは、MySQLであらかじめ用意されているユーザーのことです。
このユーザーのパスワードは空で設定されているため、ログインにパスワードは必要ありません。

```terminal
# MySQLに接続すると以下のような表示になる
% mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 428
Server version: 5.6.47 Homebrew

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

以上のような画面が表示されたら準備OKです。

SQLは`mysql>`の続きから、入力して実行ができます。
また、SQLはSequel Proでも使用できます。

# SQLによるDB上の操作

### SQL（Structured Query Language）
RDBの操作を行うための言語のこと。

### SQLの主な命令
- データを定義する「**DDL**」
- データを操作する「**DML**」
- データを制御する「**DCL**」

※この記事では、**DDL**についてのみ、まとめております。


### DDL（Data Definition Language）
データを定義するSQLです。以下のような命令文があります。

|    命令     |    機能                |
|:-----------|:---------------------- |
| CREATE     | データベースやテーブルの作成 |
| ALTER      | データベースやテーブルの更新　　|
| DROP       | データベースやテーブルの削除　　|


# 各SQL文を実行してみる

SQLを使って、データベースを作成してみます。ここでの作業はターミナルを使用して行います。

## CREATE文
- データベースやテーブルを作成できるSQLの文
- `CREATE DATABASE`文を実行すると、指定した名前のデータベースが作成できる

実行時には以下のようにデータベース名の指定が必要です。

```terminal
mysql> CREATE DATABASE sqltest;
```
ちなみに、SQL文は小文字でも動作するようです。
ただし、SQL文と他の文字列が混ざると読み辛くなることから、大文字で記述することが一般的になります。

```terminal
mysql> CREATE DATABASE sqltest;
Query OK, 1 row affected (0.00 sec)
```
以上のような表示があれば、正常にデータベースが作成されています。
あと、SQL文の終わりには必ずセミコロンを付ける必要があります。
もしセミコロンを忘れて実行した場合は、SQLがまだ続くものだとみなされ、以下のような矢印マーク`->`が表示されます。

```terminal
mysql> show databases
    -> 
```
 

## SHOW文
- データベースやテーブルを一覧表示できるSQLの文
- `SHOW DATABASES`文を実行すると、作成されているデータベースを一覧で表示できる

```terminal
mysql> SHOW DATABASES;
+------------------------+
| Database               |
+------------------------+
| 省略                    |
| sqltest　　             |
| 省略                    |
+------------------------+
36 rows in set (0.00 sec)
```
コマンドを実行すると、以上のようなテーブルが一覧で表示されます。

## DROP文
- データベースやテーブルを削除できるSQLの文
- `DROP DATABASE`文を実行すると、作成されているデータベースを削除できる

```terminal
mysql> DROP DATABASE sqltest;
Query OK, 0 rows affected (0.02 sec)

# sqltestがないことを確認
mysql> SHOW DATABASES;
```

以上のように表示されていれば、削除は完了です。
念のため、SHOW DATABASES;を使用して削除されているか確認してみてください。

## USE文
- どのデータベースを使用するのかを指定するSQLの文
- `USE 《database名》`と指定することでデータベースを選択する

テーブルを操作する場合は、はじめに「どのデータベースにあるテーブルか」を選択する必要があるため、USEを使います。
まずは、下記のように`CREATE`を実行してデータベースを作成します。

```terminal
mysql> CREATE DATABASE sqltest;
Query OK, 1 row affected (0.00 sec)
```

続いてUSEを実行してデータベースを選択します。

```terminal
mysql> USE sqltest;
Database changed
```

これで、作成したデータベースを使用できます。
次にデータを保存するためのテーブルを作成してみます。

データベースの作成のときと同様に、テーブルを作成する際は`CREATE TABLE`文を使用します。
実行時には以下のようにテーブル名を指定する必要があります。
また、そのテーブルに作成するカラムの名前とそのカラムの型を指定できます。
以下の例をご参考ください。

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

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

また、カラムを作成する場合には型の指定が必要です。
MySQLで数値型や文字列型を定義する際は以下のような型名を使用します。

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

カラムとその型を指定し、テーブルを作成します。

```terminal
mysql> CREATE TABLE items (id INT, name VARCHAR(255));
Query OK, 0 rows affected (0.01 sec)
```
以上のようにコマンドを実行した結果、2段目のような表示であればSQL文が実行されています。

次に作成を確認するために、`SHOW TABLES文`を使用し、テーブルの一覧を確認してみます。

```terminal
mysql> SHOW TABLES;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| items             |
+-------------------+
1 row in set (0.00 sec)
```
上記のように、コマンドを実行し"Tables_in_sqltest"に"items"というテーブルが確認できれば、テーブルが正しく作成されたということになります。

## FROM句
- 対象となるテーブルを指定する際に使用するSQLの句

以下のようにコマンドを実行し2行目以降の表示がでてくれば、正常に実行できています。

```terminal
mysql> SHOW columns FROM items;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
```
これにより、itemsテーブルにはidとnameという2つのカラムがあることが確認できました。

## ALTER文
- データベースやテーブルを編集できるSQLの文
- `ALTER TABLE`文を実行すると、テーブルに対してカラムの追加や削除ができる

```terminal
# ALTERでカラム情報の更新
mysql> ALTER TABLE 《テーブル名》 操作

# カラムを1つだけ追加する場合
mysql> ALTER TABLE テーブル名 ADD カラム名 カラムの型;

# カラムを複数追加する場合
mysql> ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……);
```

ここでは"price"と"zaiko"という2つのカラムを、共に"int"型で作成してみます。

```terminal
mysql>  ALTER TABLE items ADD (price int, zaiko int);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

カラムを追加したので、テーブルの構造がどう変化したか確認してみます。
下記のようにカラムが追加されていれば成功となります。

```terminal
mysql> SHOW columns FROM items;
+-------+--------------+------+-----+---------+-------+
| 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.00 sec)
```

カラムの追加ができたので、カラムの変更も行ってみます。
カラムの変更は、先ほどと同様に`ALTER TABLE`文を使用し、以下のような文法でSQL文を記述します。

先ほど"zaiko"というカラムを追加しましたが、他のカラムに合わせてカラム名を英語表記にするため、
"stock"という名前に変更しておきます。

以下のような表示であれば、正常に実行できています。

```
mysql> ALTER TABLE items CHANGE zaiko stock int;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

このとき、カラムの型は変更しなくても、再度記述をしなくてはなりません。
そのため、カラムの変更をするときはこの型の部分を間違えないように注意する必要があります。

先ほどと同様にカラムが変更されていることを確認します。
下記のように表示されていれば、正常に変更されています。

```terminal
mysql> SHOW columns FROM items;
+-------+--------------+------+-----+---------+-------+
| 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.01 sec)
```

最後はALTER文を使いカラムを削除してみます。

```terminal
mysql> ALTER TABLE items DROP stock;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

次にカラムが削除されていることを確認します。
以下のようにカラムがきちんと削除されていることを確認できれば成功です。

```terminal
mysql> SHOW columns FROM items;
+-------+--------------+------+-----+---------+-------+
| 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.01 sec)
```