【基礎編】SQLコマンド自己学習

PHPの学習中、SQLコマンドを頻繁に扱うようになったが、アウトプットしないと定着しない気がしたので書きます。
内容は某有名プログラミングスクールが提供している[ページ](https://www.sejuku.net/blog/72964)を参考にしました。

##今回使用するテーブル構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605741/cffc828b-0555-7ed8-7a8e-953cd31ef8d6.png)
今回はゲームのユーザーデータを管理するテーブル`game_character`テーブルを作ったと仮定します。
カラムの数は「id」「name」「job」「level」の4つになります。
現在DBは合計5人のデータを管理しています。
##SELECTの基本構文
SELECTとは`データベースから、データを取得する命令`。
このSELECTを使用することで、データベースからデータを取得することが出来る。

```
SELECT [取得したい要素] FROM [使用テーブル];
```
`[取得したい要素]`は`カラム名`を指定し、`[使用テーブル]`は`テーブル名`を指定する。

##SELECT構文①　特定の要素を取得する
まず全キャラクターの名前を取得してみる。

```
SELECT name FROM game_character;
```
基本構文の公式に当てはめてみると、`name`は`[取得したい要素]`で`game_character`は`[使用テーブル]`に該当する。

```
実行結果
+--------------+
| name         |
+--------------+
| ヤマダ        |
| スズキ        |
| タナカ　　　　　|
| タカハシ     　|
| ワタナベ     　|
+--------------+
```
このように、`game_characterテーブル`から`name`だけを全て表示してくれている。

##SELECT構文②　「,」 で複数指定して要素を取得する
①では`name`カラムから全データを取得しました。
次に`name`だけでなく、複数のカラムからデータを取得してみる。

```
SELECT name,level FROM game_character;
```
`name`だけでなく`「,」`で区切り、`level`も取得する。

```
実行結果
+--------------+-------+
| name         | level |
+--------------+-------+
| ヤマダ　　　　　|    30 |
| スズキ　　　　　|    42 |
| タナカ 　      |    25 |
| タカハシ       |    60 |
| ワタナベ       |    20 |
+--------------+-------+
```
##SELECT構文③　「*」 で全ての要素を取得する
取得したい要素の項目に*を入れることで、全ての要素を取得することが可能。

```
SELECT * FROM game_character
```
先ほどまでは`SELECT`の後に`カラム名`を指定していましたが、`[*]`を付加する事で全てのデータを取得する。

```
実行結果
+------+--------------+--------------+-------+
| id   | name         | job    　　  | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ　　　　　| 勇者         |    30 |
|    2 | スズキ　　　　　| 戦士         |    42 |
|    3 | タナカ　　　　  | 戦士         |    25 |
|    4 | タカハシ　　　  | 魔法使い      |    60 |
|    5 | ワタナベ　　  　| 僧侶         |    20 |
+------+--------------+--------------+-------+
```
これで`geme_characterテーブル`から「id」「name」「job」「level」の全てのデータを取得が可能に。
##WHEREの基本構文
次に`WHERE`を用いた条件設定を行ってみる。
例えば`WHERE`を使用する事で「level30以上のキャラクターだけ取得する」ことが可能になる。

```
SELECT [取得したい要素] FROM [使用テーブル] WHERE [条件文];
```
先ほどの`SELECT`構文の後ろに、`「 WHERE [条件式] 」` が加わっただけです。

```
SELECT * FROM game_character WHERE 30 <= level;
```
例に挙げた、「level30以上のキャラクターだけ取得する」命令をしてみる。

```
実行結果
+------+--------------+--------------+-------+
| id   | name         | job           | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ        | 勇者        　 |    30 |
|    2 | スズキ        | 戦士       　  |    42 |
|    4 | タカハシ　　  　| 魔法使い　 　   |    60 |
+------+--------------+--------------+-------+
```
おさらいになりますが、`[取得したい要素]`に`[*]`で全てを指定。
`[使用テーブル]`に`[game_character]`を選択する。
`WHERE`の後に、`[条件式]`として`[30 <= level]`を指定する事で、level30以上のキャラクターを取得する結果に。
##ORDER BYでデータを並び替える
データの並び替え(以下ソートと略)には`ORDER BY`を使用する。

```
SELECT [取得したい要素] FROM [使用テーブル] ORDER BY [ソートしたい要素] [昇順・降順の指定(省略時昇順)];
```
`[昇順・降順の指定]`部分は、`asc(昇順)`、`desc(降順)`のどちらかを指定する。
※ 省略した場合が昇順となります。

```
SELECT * FROM game_character ORDER BY level desc;
```
`[ソートしたい要素]`に`level`カラムを指定し、`[昇順・降順の指定]`に`desc`を指定する事で`降順`にソートする。

```
実行結果
+------+--------------+--------------+-------+
| id   | name         | job          | level |
+------+--------------+--------------+-------+
|    4 | タカハシ  　　　| 魔法使い    　 |    60 |
|    2 | スズキ　　　　　| 戦士　　　　   |    42 |
|    1 | ヤマダ　　　　　| 勇者　　　　   |    30 |
|    3 | タナカ      　 | 戦士　　　　   |    25 |
|    5 | ワタナベ       | 僧侶　　　　   |    20 |
+------+--------------+--------------+-------+
```
これでレベルの高い順(降順)で全データを表示する事が可能に。
##GROUP BYでデータをグループ化する
グループ分けをしたい場合に使用するのが`GROUP BY`。

```
SELECT [取得したい要素] FROM [使用テーブル] GROUP BY [グループ化したい要素];
```
```
SELECT job, count( * ) FROM game_character GROUP BY job;
```
`count`は数を求める関数で、`GROUP BY`を使用する際は必要。
これで`game_character`テーブルの`job`カラムから、数を求めグループ化する。

```
実行結果
+--------------+----------+
| job          | count(*) |
+--------------+----------+
| 僧侶         |        1 |
| 勇者         |        1 |
| 戦士         |        2 |
| 魔法使い     |        1 |
+--------------+----------+
```
`job`カラムには`「戦士」`が2名いたので、1つのグループにまとめて人数をカウントしてくれている。
##ASで出力時に名前をつける
表示時の各要素に名前をつけることも可能。

```
select [要素名] AS [要素につけたい名前] from [使用テーブル];
```
```
select name AS "名前" from game_character;
```
この場合だと、`game_character`テーブルの`name`カラムを`名前`として扱う事ができる。

```
実行結果
+--------------+
| 名前         |
+--------------+
| ヤマダ       |
| スズキ       |
| タナカ　　    |
| タカハシ    　|
| ワタナベ 　   |
+--------------+
```
通常であればカラム名は`name`として表示されるはずだが、`名前`として表示されている。
##追加・更新・削除について
これまではDBのデータを検索して表示しているだけでした。
では、`追加`、`更新`、`削除`はどうするのか？
##INSERTで新規追加
データの追加はINSERT文で行う。

```
INSERT INTO [データを追加したいテーブル名] (要素名A,要素名B) VALUES(要素Aに入れるデータ,要素Bに入れるデータ);
```
```
INSERT INTO game_character (id, name, job, level) VALUES(6,"カトウ","格闘家",15);
```
少し複雑になってきたので整理してみる。
構文は`INSERT INTO`から始まり、`データを追加したいテーブル名(game_character)を指定する`。
次に`要素名`(カラム)を複数指定し、`VALUE`で実際に入力するデータを指定。

```
実行結果
+------+--------------+--------------+-------+
| id   | name         | job          | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ        | 勇者          |    30  |
|    2 | スズキ        | 戦士          |    42  |
|    3 | タナカ 　 　   | 戦士          |    25  |
|    4 | タカハシ   　  | 魔法使い       |    60  |
|    5 | ワタナベ   　  | 僧侶          |    20  |
|    6 | カトウ     　  | 格闘家　　　　  |    15  |
+------+--------------+--------------+-------+
```
`「id」=6`、`「name」=ｶﾄｳ`、`「job」=格闘家`、`「level」=15`がデータとして入力されています。
##UPDATEで更新
データの更新はUPDATE文で行う。

```
UPDATE [テーブル名] SET [更新処理] WHERE [条件式];
```
```
UPDATE game_character SET job="盗賊" WHERE name="タナカ";
```
`UPDATE`の際には`SET`を使用する必要がある。
`[更新処理]`には`どの要素を何に`更新するかを指定する。
最後に、`WHERE`で`name`を指定する事で`誰のデータ`を更新するかわかりやすくする。

```
実行結果
+------+--------------+--------------+-------+
| id   | name         | job          | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ        | 勇者          |    30  |
|    2 | スズキ        | 戦士          |    42  |
|    3 | タナカ 　 　   | 盗賊          |    25  |
|    4 | タカハシ   　  | 魔法使い       |    60  |
|    5 | ワタナベ   　  | 僧侶          |    20  |
|    6 | カトウ     　  | 格闘家　　　　  |    15  |
+------+--------------+--------------+-------+
```
3行目の`ﾀﾅｶ`の`job`データが`「盗賊」`に更新されている。
##DELETEで更新
データの削除はDELETE文で行う

```
DELETE FROM [テーブル名]　WHERE [条件];
```
```
DELETE FROM game_character WHERE level <= 20;
```
いつも通りテーブル名に`game_character`を指定し、`WHERE`の後に`[条件]`を指定する。
ここでは`[条件]`に`level <= 20`を指定する事で、`levelが20以下`という条件を付加する。

```
実行結果
+------+--------------+--------------+-------+
| id   | name         | job          | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ        | 勇者          |    30  |
|    2 | スズキ        | 戦士          |    42  |
|    3 | タナカ 　 　   | 盗賊          |    25  |
|    4 | タカハシ   　  | 魔法使い       |    60  |
+------+--------------+--------------+-------+
```
一つ前のセッションで紹介したUPDATEの実行結果の際のテーブル構成を見比べる。
`id=5`、`id=6`のデータは`level`が20以下だった為、`DELETE`で削除された。

今回は以上。