SQLをGoogleスプレッドシート、Excelでイメージする

# はじめに
私は普段業務でSQL以外にも、GoogleスプレッドシートやExcelをよく使います。
そして、SQLでコードを書く際、GoogleスプレッドシートやExcelをイメージしてコードを書いていることに気づきました。
上記を踏まえコードの説明などをすると、わかりやすいと言ってもらうことが多かったので、今回自身がどのようなイメージを持ってSQLを書いているかをまとめてみました。
普段GoogleスプレッドシートやExcelを使っている方がSQLを学習する際など親和性が高いと思います。
※SQLと言ってもやれることが幅広いので、業務でもメインとなる抽出部分について記載していきます。

# 目次
1.SQLのコードを書く際、どのようにイメージしているか
2.対応表
3.デモデータの説明
4.selectのイメージ
5.fromのイメージ
6.whereのイメージ
7.joinのイメージ
8.order byのイメージ
9.おわりに

# 1.SQLのコードを書く際、どのようにイメージしているか
私はSQLでコードを書く際、タイトルにもある通り、GoogleスプレッドシートやExcelをイメージしています。
なぜかというと、SQLを使用するデータの多くは複数のテーブルに行と列で構成されたデータが格納された形をとっており(リレーショナルデータベース)、
GoogleスプレッドシートやExcelの作りと同じと考えられるからです。
具体的には、データベース=GoogleスプレッドシートやExcelの「ファイル」、
複数のテーブル=GoogleスプレッドシートやExcel内の各「シート」と考えるとイメージしやすいと思います。

また、SQLの各構文についても、上記の「ファイル」や「シート」のように対応する機能や関数などが存在します。
以降では、実際に「SQLのどの構文」に「GoogleスプレッドシートやExcelのどの機能や関数」が対応するかを記載します。

# 2.対応表
SQLの構文とGoogleスプレッドシートやExcelの機能や関数の対応表は下記の通りです。
|  SQLの構文  |  GoogleスプレッドシートやExcelの<br>機能や関数  |
| --------- | --------- |
|  select  | 列指定  |
|  from  |  シートの指定  |
|  where  |  フィルター  |
|  join  |  vlookup  |
|  order by  |  昇順、降順  |

※SQLの構文は他にも存在しますが、量が多いため今回は上記のみ扱います。

# 3.デモデータの説明
イメージを理解してもらうために、データを用意しました。
以下2つのシートそれぞれがSQLのテーブルと想定してください。
![xxx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/0fdfe725-c419-3c54-7f99-6b6d55133ba4.png)

※説明についてはGoogleスプレッドシートのデータを使用していますが、今回説明している範囲ではExcelとの機能の差はほぼありません。

また、各シートの項目の意味は下記のようになっております。
◆シート1:purchase=テーブル名:purchase
no:連番
total:合計購入金額
price:製品価格
quantity:購入個数
products_code:製品番号
time:購入時間

◆シート2:products=テーブル名:products
products_code:製品番号
products_name:製品名

以降、上記データを用いてイメージを説明していきます

# 4.selectのイメージ
まずは、selectのイメージです。
ここでやりたいことは、シート1:purchaseのno,totalを抽出です。
アウトプットイメージは以下の通りです。
![スクリーンショット 2022-03-26 21.17.24（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/b58f5532-c077-02fd-0310-d29b99bc51e4.png)

selectは抽出したい列を選択するというイメージです。
※列とは縦方向のことです。
GoogleスプレッドシートやExcelでは、以下の赤い枠の箇所を選択して抽出しているとイメージしてください。
![スクリーンショット 2022-03-26 0.08.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/17e6ea1b-84df-4d3a-a593-39d132592583.png)
また、SQLでは下記のように記載します。
```sql
select no,
       total
from purchase ;
```
※fromは次節で説明します。

# 5.fromのイメージ
fromのイメージについて説明します。
ここでやりたいことは、4.selectのイメージと同様です。

fromはどこのテーブルからデータを参照するかを指定すると言うイメージです。
GoogleスプレッドシートやExcelに当てはめると、シートの選択が該当します。
各ファイルを大きなデータベースと考えると、テーブルがシートとなります。
そのため、以下の赤い枠のシートを選択しているとイメージしてください。
![スクリーンショット 2022-03-26 0.32.53（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/35d12567-781a-4bc8-5628-0ba70aec02b0.png)

SQLの内容は上記4.selectのイメージの「from ~」の部分です。

# 6.whereのイメージ
whereのイメージについて説明します。
ここでやりたいことは、シート1:purchaseでproducts_codeが1のものを抽出です。
アウトプットイメージは以下の通りです。
![スクリーンショット 2022-03-26 21.23.10（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/04ec5010-27af-9bb1-2851-f3c1a7a5c569.png)

whereは条件の絞り込みです。
シート1:purchaseでproducts_codeは1と2の値が存在しますがそのうち1のみに絞り込むイメージです。
GoogleスプレッドシートやExcelに当てはめると、フィルターの機能が該当します。
※下記はGoogleスプレッドシートシートでExcelとは少し見た目が異なりますが使い方はほぼ同様です。
![スクリーンショット 2022-03-26 21.05.04（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/0a53d15c-5065-3027-461d-228ff0585e6a.png)

また、SQLでは下記のように記載します。
```sql
select *
from purchase
where products_code = 1;
```

# 7.joinのイメージ
joinのイメージについて説明します。
ここでやりたいことは、シート1:purchaseにシート2:productsのproducts_nameの製品名を表示させるです。
なぜそのようなことをするかというと、シート1:purchaseでproducts_codeだと数値だけでどの製品を購入したかわからないためです。
※joinはinner join ,left outer join,right outer joinなど複数タイプがありますが今回はleft outer joinについて扱います。
　使っているデータの関係でinner joinと同じ挙動になっていますがご了承ください。
アウトプットイメージは以下の通りです。
![スクリーンショット 2022-03-26 21.33.34（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/cc82851c-2b27-d6e9-1db2-b195483dfe6e.png)

joinは結合です。
left outer join(以降left join)では、左にシート1:purchase、右にシート2:productsがあるとして、
共通の項目(key：今回はproducts_code)を参照しシート1:purchaseのproducts_codeに合致するデータをシート2:productsから抽出し結合します。
左のシート1のkeyのみに存在し、右のシート2のkeyに存在しない場合は左のシート1のkeyのみ残り、右のシート2の部分はブランクになります。
逆に左のシート1のkeyに存在せず、右のシート2のkeyのみに存在するものは結合されません。
ベン図で説明すると、以下①③に該当する箇所がleft joinとイメージしてください。
![スクリーンショット 2022-03-26 21.52.25（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/04e95273-ea03-333b-f9df-cc05b377a96f.png)
GoogleスプレッドシートやExcelに当てはめると、vlookup関数が該当します。
join=結合とlookup=検索は意味としては異なりますが、今回はイメージなので同じものと解釈して問題ないです。
※vlookup関数では、1列しか持ってくることが出来ませんが、繰り返せばjoinと同様の動作となります。
※仮にシート1:purchaseのproducts_codeに5といったシート2:productsのproducts_codeに存在しない値がある場合は
　SQLではnull,GoogleスプレッドシートやExcelでは#N/Aと表示されます。
![スクリーンショット 2022-03-26 22.05.26（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/6503c1b7-e5f3-6765-0004-d45a6348e27c.png)

また、SQLでは下記のように記載します。
```sql
select s1.no,
       s1.total,
       s1.price,
       s1.quantity,
       s1.products_code,
       s2.products_name
from purchase　as s1
left join products as s2
 on s1.products_code = s2.products_code ;
```
as　~は「~と読み替える」と考えてください。たとえば、fromの部分は、「purchaseをs1と読み替える」と考えます。
select文のs1、s2は上記asで読み替えたテーブルを指します。s1・s2を設定する意味は、同じ名前のカラムが両方のテーブルに存在する場合
どちらのカラムを使うかをシステムが判別できないためです。

また、補足として「上記left joinでシート1:purchaseのproducts_codeに5といったシート2:productsに存在しないものがある場合は
SQLではnull,GoogleスプレッドシートやExcelでは#N/Aと表示」と説明しましたが、そのnullや#N/Aが存在する列をwhere(フィルター)で
除いたものがinner joinとなります。つまり両方のテーブルに存在するデータのみを表示させます。
上記ベン図で③の部分に該当します。

# 8.order byのイメージ
order byのイメージについて説明します。
ここでやりたいことは、シート1:purchaseでtotalが小さい順に並べ替えるです。
アウトプットイメージは以下の通りです。
![スクリーンショット 2022-03-26 22.37.19（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/aa2f7c3d-3fc9-3d8d-f1b2-aa9696f6edc5.png)

order byは昇順(降順)です。これはGoogleスプレッドシートやExcelでも同様です。
![スクリーンショット 2022-03-26 22.41.46（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/2dc98a31-e141-97df-fdfb-0ab237440b4f.png)

また、SQLでは下記のように記載します。
```sql
select no,
       total
from purchase
order by total asc;
```
ascは昇順(ascending)を意味します。デフォルトが昇順なので記載しない場合、昇順となります。
また、descは降順(descending)を意味します。

# 10.おわりに
以上が私のSQL記載の際のイメージです。
SQL単体ではわかりづらくとも、GoogleスプレッドシートやExcelの機能と対応させるとイメージがつきやすくなるかと思います。
今回は、基礎の構文のみ扱いましたが、別の機会で今回扱わなかった対応機能や関数についても記載したいと考えております。

最近では、エンジニア職に限らずSQLを利用する(しなければいけない)機会が多くみられます。
その際に、本記事が参考になれば幸いです。