SQLに触れてみよう

### はじめに
今回はSQLについて軽く触れてみようと思います。バックエンドにおける実装はデータベースから何をどのように取ってくるか、ということがメインのため、データベースとそれを操作するSQLを知ることはバックエンドの実装を深めるために必須です。

今回はSQLに馴染みが無い人、これからエンジニアとして学習を初めて行く人のために軽くSQLを一緒に体験してもらうことを目的として書いています。

::: note warn
※今回は外部キーや、主キー、NULLなどの説明はしていません。本来なら基本として抑えておくべきものだと思いますが、あくまでもSQLを体験し、楽しんでもらうことを目的としています。この辺については後々また追記していこうかなと思います。
:::

## 今回の目的
* DB-fiddleでSQLを体験できることを知り、実際に動かしてみる
* SQLの基本的な知識を得る



## 用意するもの
今回は簡単にSQLを体験するこちらのサイトを用意しました
**db-fiddle**
https://www.db-fiddle.com/
特に登録したりログインしたりする必要はありません。こちらを開いて実際にやってみましょう

まずはこちらの設定から

![db-fiddle 152957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/531a9fe9-7105-29e8-b96f-8bb73676a661.png)


1、まずは左上のMySQLを最新版にしておきましょう。バージョンが古いと予期せぬエラーが出たりします

2、つぎにテーブルを作成します。テーブルは私が作っておきました。（すごーく簡単にですが）
これをコピペしてそのまま左に貼り付けてみてください

```
CREATE TABLE student (
  id INT NOT NULL,
  name VARCHAR(50) NOT NULL,
  height INT NOT NULL,
  weight INT NOT NULL,
  sex VARCHAR(10) NOT NULL
);

insert into student values(1,'秋山',158,52,'男');
insert into student values(2,'井上',142,38,'女');
insert into student values(3,'上田',165,60,'男');
insert into student values(4,'江口',150,38,'女');
insert into student values(5,'小野寺',178,70,'男');
insert into student values(6,'加藤',160,45,'女');
insert into student values(7,'君島',151,48,'男');
```

3、次に右側にselect文を使ってどんなデーブルが作成されたのか、検索条件を書いてみましょう
こちらも下をコピペしてください
```
select *
from student ;
```

4、最後は左上にある「RUN」を押してみましょう

5、下に検索結果が取得できましたね

![select 検索結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/02016071-b548-ecb0-8a08-518bc61c85be.png)


これで見てみましょう

## SQLで出来ること（select,insert,delete,update）

まずSQLで出来る事は4つだけです。抑えておきましょう

* **選択（SELECT）**
* **挿入（INSERT）**
* **削除（DELETE）**
* **更新 (UPDATE)**

 ## 選択（SELECT）

まずはここに着目しましょう
```
CREATE TABLE student (
  id INT NOT NULL,
  name VARCHAR(50) NOT NULL,
  height INT NOT NULL,
  weight INT NOT NULL,
  sex VARCHAR(10) NOT NULL
);
```
ここではテーブルを作りましたということだけ説明しておきます。
テーブルを見て分かるとおり、「id」、「name」、「height」、「weight」、「sex」の5つです


 
select文の構文は以下の通りです
```
select カラム名
from テーブル名
```
ちなみにカラムとは列を表します
他にもレコードと呼ばれるものがあります。図にするとこんな感じです
![select 検索結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/04501224-9aa1-dcea-b0a4-4a9f2e31557f.png)

今回の例で見てみましょう

```
select *
from student ;
```
これは**studentテーブルから全てのカラムを取得してください**
ということです。

今回のアスタリスク(*)は全てのカラムから取得してください、という意味になります
なのでstudentテーブルの全てのカラムが取得できましたね

ちなみにカラム名を指定してみましょう

```
select id,name
from student ;
```

名前とidだけが抽出されましたね
![スクリーンショット 2024-06-09 171016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/eecd2051-7beb-09ad-0c5b-cbafeb920904.png)

このようにselect文を使ってデータベースから検索できます。
後ほど、もっと検索条件を指定して選択する方法も一緒にやっていきましょう


### 挿入（INSERT）

ここからは物語？っぽくやっていきましょう。
studentテーブルにあるとおり、ここには7人の生徒がいます。

そしてそれを受け持つ担任の先生がいます

![school_print_kubaru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/96840db9-5581-d1b5-c814-d55a0134c66e.png)

先生がデータベースを覗いてみると、あることに気付きます
「なんや！うち生徒が8人おるはずなのに7人しかおらんやんか！おお！黒田や、黒田がおらへん」

どうやら黒田さんがデータベースにいなかったようです
てなわけで黒田さんのデータを追加してみましょう

```
insert into student values(1,'秋山',158,52,'男');
insert into student values(2,'井上',142,38,'女');
insert into student values(3,'上田',165,60,'男');
insert into student values(4,'江口',150,38,'女');
insert into student values(5,'小野寺',178,70,'男');
insert into student values(6,'加藤',160,45,'女');
insert into student values(7,'君島',151,48,'男');
↓これ
insert into student values(8,'黒田',140,32,'女');
```

そして同じようにselect文でRUNしてみましょう
無事黒田さんが追加されたことを確認します
![スクリーンショット 2024-06-09 174908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/0fd1e97e-8620-e5a8-8187-5bc2054072a7.png)


このinsertを紐解いてみましょう

```
insert into テーブル名 values(値1,値2,...)
```
今回値の部分は左から「id」、「name」、「height」、「weight」、「sex」という順番で登録されます。

insertを使うことによってデータベースに新たなレコードを追加することが出来ます

## 削除（DELETE）

今度はまた先生新たなことに気付きます

「そうや！君島ったら、こいつ留年したんや！3年生になってないんやからいるわけないわな！」

どうやら留年した君島君を誤ってデータベースに登録してしまったようです
というわけで君島君をデータベースから削除しましょう

以下の文を新たに付け加えてRUNしてみてください
```
delete from student
where id= 7;
```
![スクリーンショット 2024-06-09 180325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/08c10788-672c-a8d0-54e4-3c85a0f86ffb.png)

delete文を紐解いてみましょう

```
delete from テーブル名
where 条件
```
where句を使うことで、条件に合致するデータを絞り出すことが出来ます
今回id=7としているのでidが7の君島君を削除する、ということです

## 更新 (UPDATE)

さて、君島君のレコードが削除されましたが
6から8へと飛んでしまったので気持ちが悪いですよね

なので新たに追加した黒田さんのidを8から7へと更新しましょう

```
update student
set id = 7
where name ='黒田';
```

![スクリーンショット 2024-06-09 181506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/15c76908-b225-18f9-b429-29bd1dd6981c.png)


updateを紐解いてみましょう

```
update テーブル名
set 条件
where 条件2;
```
setではカラム名と条件を記述します。ここではidを7とします
where句でnameが"黒田"という条件に一致する人を記述します
これでidが連番となりスッキリしましたね


## いろんな条件のSELECTを試してみよう

### order by

「あ！今後朝礼の時生徒を並ばせな！出来れば身長順に並べたいなー」
なので生徒を身長の高い順に抽出しましょう

```
select name, height
from student order by height desc;
```

![スクリーンショット 2024-06-10 060649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/9fe8c0af-c452-91e7-4210-ad54f036bbf9.png)


身長の高い順に並びました

```
select カラム名
from テーブル名 order by  条件;
```

order byを使えば指定のカラムを昇順、降順に入れ替えできます
ASCは昇順、DESCは降順に入れ替えできます
```
ASC => 昇順
DESC => 降順
```

## limit

「そうや！身長の高い生徒3名をバレーボール部に見学薦めるよう顧問の先生に言われたんや！上位三名はと・・」

今度は身長の高い生徒を3人だけ抽出しましょう

```
select name, height
from student order by height desc limit 3;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/5826140d-c517-01a6-aefb-6533b6802b48.png)

上位3名だけが抽出されました

```
select name, カラム名
from テーブル名 order by height desc limit 数字;
```

limitに数字を入れることによって抽出する数を指定できます
今回はdescで降順としているので身長の上位3名ですね


## SUM
「そういや、全生徒の合計の体重を足すとどんなもんなのかな？車よりも重いんかな？」
よく分からん考えが浮かんできました

ともかく生徒の体重の合計を足してみましょう

```
select sum(weight) as '合計体重'
from student ;
```

![スクリーンショット 2024-06-10 064147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/5e3d32ac-cce0-7d4b-f3d7-93ac6bb863bc.png)

合計は335となりました。全然足りませんね（笑）

```
select sum(カラム名) as '抽出する名称'
from テーブル名 ;
```

sum(カラム名)とすることでそのカラムの数字の合計値を抽出することが出来ます
ちなみにasは抽出した値の名前を設定することが出来ます

## AVG

「後は保健省に平均身長と平均体重を送らなあかん！」
というわけで平均値を抽出してみましょう

```
select avg(height) as '平均身長',avg(weight) as '平均体重'
from student ;
```

![スクリーンショット 2024-06-10 065434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/73c15390-5d68-ab7b-3611-ab59095b774d.png)

平均身長と平均体重が割り出されました
avgの使い方はsumと同じです

他にも件数を割り出すCOUNT、最大値を出すMAXなどがあります
調べて使ってみましょう

## LIKE

「何！うちの学校の生徒がテスト中不正行為やと！なんでもその生徒は「上」っちゅう漢字が付くらしいな・・うちの生徒にいたっけ？」

というわけで「上」のつく生徒を探してみましょう

```
select name
from student where name like '%上%'
```

![スクリーンショット 2024-06-10 070222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3451993/e9d89c60-4b34-ba49-6afb-ded586c8e9a5.png)

```
select カラム名
from テーブル名 where カラム名 like '検索文字'
```

今回使った%はワイルドカードと言い
0文字以上の任意の文字列を指定して検索することが出来ます

0文字以上の任意の文字列？？と思うかもしれませんね
要は%が指定したところに文字が入っているかもしれないし、入っているかもしれない
そこに何文字が入っているか分からないということです

例えば今回を'上%'とした場合、「上」の後に文字が入っていないかもしれないので
「上」という名前の人かもしれないし、「上山」とも「上野ヶ原」という名前かも知れないということです

'%上%'とすれば問答無用で前にも後にも上が付く人を検索してくれるというわけです


## おわりに
いかがだったでしょうか？
今回は簡単なSQLの構文だけを見ましたが、まだまだたくさんの使い方があります
このDB-Fiddleを使いながら調べて実践すると、SQLの知識がどんどん深まると思いますので是非参考にしてみてください