[SQL]基礎的なこと

# はじめに
本記事は、SQLの基礎的な部分について記述します。
そういえば、SQLってなんだっけ？と恥ずかしながら疑問に思ったため記述します。

# SQLとは
`DBを操作する言語`です。
「Structured Query Language」の略
↑（追記）
コメント欄にて、略語ではないという参考サイトと指摘をいただきましたので、
ここで改めて訂正します。申し訳ありません。

Structured = 構造化
Query　= 問い合わせ
by Google先生

私は、Rubyを使っているので`rails db:createコマンド`や、
Sequel Pro（シークエルプロ）を使用したデータの書き換えは行ってきました。

これらの操作は、
最終的にSQLという言語が`実行されて実現する仕組み`になっており、
SQLを直接使用せずに、
「特定のコマンドの実行」や「GUI操作」を実現できます。

# SQLによるデータベースの操作
データベースやテーブルに対して命令でき、大きく以下の3つに分類されます。
- `データを定義`「DDL（Data Definition Language）」
- `データを操作`「DML（Data Manipulation Language）」
- `データを制御`「DCL（Data Control Language）」



ターミナル上で入力。

```
# MySQLに接続
% mysql -u root
```


### CREATE文
`データベースやテーブルを作成できるSQLの文`

```
mysql> CREATE DATABASE 《データベース名》;
```

今回は、データベース名を`sqlcheck`としておきます。

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

### SHOW文
`データベースやテーブルを一覧表示できるSQLの文`

```sql
mysql> SHOW DATABASES;
```

```sql
mysql> SHOW DATABASES;
+------------------------+
| Database               |
+------------------------+
| 省略                    |
| sqlcheck　　             |
| 省略                    |
+------------------------+
36 rows in set (0.00 sec)
```

### DROP文
`データベースやテーブルを削除できるSQLの文`

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

# sqlcheckがちゃんとなくなっていることを確認
mysql> SHOW DATABASES;
```

### USE文
`どのデータベースを使用するのかを指定するSQLの文`

```sql
# 先ほどsqlcheckを消したので再度作成します
mysql> CREATE DATABASE sqlcheck;
Query OK, 1 row affected (0.00 sec)

# sqlcheckを使うよ！と命令
mysql> USE sqlcheck;
Database changed
```

### CREATE TABLE文
`テーブルを作成するSQL文`

Railsでは、
`rails g model モデル名`してから、`rails db:migrate`していましたが、
この裏では、`CREATE TABLEというSQL文`が動いていたということですね。

MySQLで数値型や文字列型を定義する際は、以下のような型名を使用します。

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

以下なら、最大255文字の文字列が保存できるitemsテーブルを作成できる

```sql
mysql> CREATE TABLE items (id INT, name VARCHAR(255));
Query OK, 0 rows affected (0.01 sec)

# テーブルを見てみよう
mysql> SHOW TABLES;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| goods             |
+-------------------+
1 row in set (0.00 sec)
```

## テーブルの構造確認
### FROM句
`対象となるテーブルを指定する際に使用するSQLの句`

```sql
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)
```

## カラム追加
### ALTER文
`データベースやテーブルを編集できるSQLの文`

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

#　例.カラムを変更する場合
mysql> ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;

#　例.カラムを削除する場合
mysql> ALTER TABLE テーブル名 DROP カラム名;
```

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

# itemsテーブルを確認
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    |       |
| soldout | int(11)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
```

以上です。

# 終わりに
SQLという言葉をよく耳にし、理解できていると思っておりましたが、不安でしたので復習しました。
知ってそうでちゃんと知ってないシリーズですね。

以下参考サイトです。
[SQLの種類(DDL、DML、DCL)](https://morizyun.github.io/database/sql-ddl-dml-dcl.html)

明日も頑張ります！！