ブラウザでSQLを気軽に学ぼう！

## はじめに

設計・開発・テスト……どの工程でもDB（データベース）を参照したり実際にデータを挿入したりといった業務が出てきます。
私も現在はデータ抽出業務を行っているのですが、過去に開発・テスト業務でもSQLは触ってきました。

その際に、実際に業務で用いているDBや開発環境に対してSQLを実行していたのですが最初は正直めちゃくちゃ怖かったです。ビビり散らかしてました。

「こんなたくさんテーブルやらデータがあるところ触るの怖い！　何かあったらどうしよう！　けどテーブル作ったりデータ更新したり削除してみたりはしてみたい！ けど怖いからそんな色々試せない！！！」

そんな気持ちを抱いていた過去の私……
これを読んでいて「わかる～！」となっていただいている方……

 - 環境構築不要でサクッとブラウザ上でSQLが試せたらいいなぁ～
 - SQLちょっと興味あるからまずは手を動かしてイメージ掴みたいな～
 - 自分が見てみたいデータとかやってみたい処理だけ書きたいなぁ～

などと思いませんか？
そんなあなたに紹介したいのが、[**<font color = "red">SQL Fiddle</font>**](http://sqlfiddle.com/)**<font color = "red">！！</font>**
`※SSL化されていないサイトのため、セキュリティ警告が出る場合があります。気になる方はご注意ください。`

SQL Fiddleの基本的な使い方、SQL実行の参考コードを紹介させていただきます！

## SQLとは？

SQLとは、DBに対する様々な指示を行う言語です。

>SQLはデータベース言語の中で、最も普及している言語の一つです。DBMS（データベース管理システム）上でデータやデータベースを制御するための言語であり、ユーザーやシステムからの命令を受けてRDB（リレーショナルデータベース）にクエリ（問い合わせ）を行い、結果を返します。返ってきた結果はモニターなどに表示されます。

引用：SQLとは？データベース言語の基礎知識をわかりやすく解説！


書き方自体も複雑ではないので、初心者の方でも覚えやすいかと思います。

https://qiita.com/tatsuya4150/items/69c2c9d318e5b93e6ccd

https://qiita.com/n_oshiumi/items/9424ca773b6c0a809e94

`SELECT`でデータを参照する上で、`WHERE`を用いて条件の指定を行いますがここだけでもかなり奥が深いですよね。ただ文章で読むだけでは実際にどういう結果が返ってくるのかわかりにくいかと思います。

## SQL Fiddle基本操作

[SQL Fiddle](http://sqlfiddle.com/)はブラウザ上からSQLを実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100940/336011f7-8d28-e636-a4f6-d7a2fd89d4e2.png)

::: note info
**実行手順**
1. 画像オレンジ枠箇所の【**MySQL5.6**】を選択
2. テーブルとデータの作成を行うため、CREATE・INSERTを記載して【**Build Schema**】押下
3. 赤枠箇所にSELECT文を書いて【**Run SQL**】押下してデータを取得
4. 下に取得したデータが表示される
:::
※1. Oracleでは作動しないのでMySQLを使用。
※2.【**Build Schema**】に対してカーソルを文字がない場所に合わせた方が押しやすいです。真ん中に当てると押せない事象が発生しました……


## 参考コード

実行手順に合わせて、動かす上で試してみたSQLと内容をまとめます。
`WHERE`を用いて、様々な条件でデータを取得してみると面白いかと思います。

#### 実行手順2.

user、address、phoneという名称のテーブルを作成し、データ挿入を行います。各テーブルのカラムとデータは表に記載の通りです。

<details><summary>CREATE・INSERT</summary><div>

```SQL
CREATE TABLE user(
 id int NOT NULL,
 name varchar(20),
 gender int,
 age int,
CONSTRAINT pk1 PRIMARY KEY(id));

INSERT INTO user (id,name,gender,age) VALUES (1,'テスト太郎',1,20);
INSERT INTO user (id,name,gender,age) VALUES (2,'テスト花子',2,25);
INSERT INTO user (id,name,gender,age) VALUES (3,'テスト次郎',1,25);
INSERT INTO user (id,name,gender,age) VALUES (4,'テスト文子',2,30);
INSERT INTO user (id,name,gender,age) VALUES (5,'テスト三郎',1,32);
INSERT INTO user (id,name,gender,age) VALUES (6,'テスト彩子',2,35);

CREATE TABLE address(
 id int NOT NULL,
 user_address varchar(50),
CONSTRAINT pk1 PRIMARY KEY(id));

INSERT INTO address (id,user_address) VALUES (1,'東京都港区');
INSERT INTO address (id,user_address) VALUES (2,'東京都練馬区');
INSERT INTO address (id,user_address) VALUES (3,'東京都中野区');
INSERT INTO address (id,user_address) VALUES (4,'埼玉県さいたま市');
INSERT INTO address (id,user_address) VALUES (5,'神奈川県横浜市');
INSERT INTO address (id,user_address) VALUES (6,'神奈川県横須賀市');

CREATE TABLE phone(
 id int NOT NULL,
 phone_number varchar(11),
 phone_type varchar(10),
CONSTRAINT pk1 PRIMARY KEY(id));

INSERT INTO phone (id,phone_number,phone_type) VALUES (1,'09011112222','FOMA');
INSERT INTO phone (id,phone_number,phone_type) VALUES (2,'09012345678','ahamo');
INSERT INTO phone (id,phone_number,phone_type) VALUES (3,'08022223333','5G');
INSERT INTO phone (id,phone_number,phone_type) VALUES (4,'08087654321','ahamo');
INSERT INTO phone (id,phone_number,phone_type) VALUES (5,'07099998888','FOMA');
INSERT INTO phone (id,phone_number,phone_type) VALUES (6,'09055667788','5G');

```

</div></details>

**user**　(※gender（性別）カラムは1が男性、2が女性)
|id |name |gender |age |
|---|---|---|---|
|1 |テスト太郎 |1 |20 |
|2 |テスト花子 |2 |25 |
|3 |テスト次郎 |1 |25 |
|4 |テスト文子 |2 |30 |
|5 |テスト三郎 |1 |32 |
|6 |テスト彩子 |2 |35 |

**address**
|id |user_address|
|---|---|
|1 |東京都港区 |
|2 |東京都千代田区 |
|3 |東京都新宿区　|
|4 |埼玉県さいたま市 |
|5 |神奈川県横浜市 |
|6 |神奈川県横須賀市 |

**phone**
|id |phone_number  |phone_type  |
|---|---|---|
|1 |09011112222 |FOMA |
|2 |09012345678 |ahamo |
|3 |08022223333 |5G |
|4 |08087654321 |ahamo |
|5 |07099998888 |FOMA |
|6 |09055667788 |5G |

#### 実行手順3.

2.で作成したデータを以下の条件で参照してみます。

- 30代ユーザーの氏名を取得
```SQL
SELECT name
FROM user
WHERE age BETWEEN 30 AND 39;
```
- 20代かつ男性であるユーザーの氏名とIDを取得
```SQL
SELECT id,name
FROM user
WHERE gender =  1  AND age BETWEEN 20 AND 29;
```
- 機種がFOMAもしくはahomoである電話番号を取得
 ```SQL
--ORでの指定
SELECT phone_number
FROM phone
WHERE phone_type = 'FOMA' OR phone_type = 'ahamo';

--IN句での指定
SELECT phone_number
FROM phone
WHERE phone_type IN ('FOMA','ahamo');
```
- 東京都在住かつ女性であるユーザーの氏名を取得
```sql
SELECT u.name
FROM user u INNER JOIN address a ON u.id = a.id
WHERE u.gender = 2 AND a.user_address like '東京都%';
```
- 神奈川県在住で機種が5Gである電話番号を取得
```sql
SELECT p.phone_number
FROM phone p INNER JOIN address a ON p.id = a.id
WHERE a.user_address like '神奈川%' AND p.phone_type = '5G';
```

- 東京都在住20代で機種ahamoを使用しているユーザーの氏名とIDを取得
```sql
SELECT u.id, u.name
FROM user u INNER JOIN phone p ON u.id = p.id
 INNER JOIN address a ON p.id = a.id
WHERE a.user_address like '東京%'
 AND u.age BETWEEN 20 and 29
 AND p.phone_type = 'ahamo' ;
```
- 男性であるユーザーの人数を取得
```sql
SELECT COUNT(*) AS maleuser_count
FROM user
WHERE gender = 1;
```

## 参考
[SQLとは？データベース言語の基礎知識をわかりやすく解説！](https://hnavi.co.jp/knowledge/blog/sql/)
[初心者向けの解説書でSQLとリレーショナルデータベースの基本を押さえよう](https://codezine.jp/article/detail/12216)
[Web上で【SQL】が実行できるサイト【SQL Fiddle】とは？](https://osakanav.com/sql-fiddle)