ちゅらデータ菱沼さんから学ぶSQLの基本

こんにちは！
本日はいつもお世話になっているサポーターズさんが行っている技育CAMPの勉強会に参加してきました。
今回の勉強会のテーマは【初心者向け】基礎から分析までのSQLです。
講師は日本で一番データベースに詳しいちゅらデータの菱沼さんです。（すごい）
自分自身SQLは全くの初心者というわけではありませんが復習という意味では大変ためになる勉強会だったと感じています。
今回はそのまとめをしようと思います。
長かったり、Qiitaの記述に慣れてなくレイアウトが崩れてお見苦しい場面もあると思いますがご了承していただけると幸いです。
# 目次
+ SQLとは
+ SQLの種類
+ なぜSQLを使うのか
+ テーブル、行、列
+ 実際にデータを取り出してみよう
+ 比較演算子について
+ 菱沼さんのおすすめの書籍
+ まとめ
## SQLとは

:::note
 データベースにおいて、データを操作するための言語
・呼び方：えすきゅーえる、しーくえる
:::
### 歴史

　　　・1974年にIBMの研究所で、SEQUEL(A Structured English Query Language)という名前で誕生したが、商標の関係でSEQUELが使えなかった
　　　・そのためSQLになった。Structured Query Languageの略
　　　・各DBごとに方言があったため、ANSIという団体による標準化が行われました
　　　・SQL-86,89,92,1999,2003,2006,2008,2011,2016,2019
・プログラミング言語のカテゴリ
　　　・集合指向言語、宣言型言語（手続き型言語）と言われている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/cf1f6b33-29fc-0cff-7868-8db4c664f56e.png)

pythonやほかのプログラム言語と違いfor文,while文を用いない。
# SQLの種類

SQLには大きくの3つのカテゴリが存在している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/665fd696-f60a-611e-9518-ca7c70b9be68.png)

・DDL　データベース内の表、ビューやインデックスなどの各種オブジェクトの作成や変更をするために用いられる。

・DML　データベースにおいてデータの検索・新規登録・更新・削除を行うために用いられる。

・DCL　権限管理にかかわる。

## なぜSQLを使う必要があるのか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/52fce66f-b4ac-62b3-5389-d4b6d56bb90b.png)

でかいデータを扱いたいのに容量が足りない！
最新のMacM2でもメモリ32GB。
そんな時にSQLは大変役に立つ。
分散コンピューティング(BigQueryなら2000台で処理される)でデカいサイズのデータを扱う＝1台のPCでは動かないもの。
分散処理を行うときのインターフェースとして**SQL**が用いられる。そのためSQLは広く使われている。そのためSQLを学ぶと大きなデータを扱う職業に就きやすい。pythonでもデータ処理はできることはできる。しかしpythonで書くよりスパーク(分散コンピューティングエンジンの一種)でSQLに起こす方が効率がいい。１TBなど小規模なデータなら検討する価値がありそう。

## テーブル、行、列
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/ff0f5627-740d-a91c-fa00-e712fb278cb8.png)

### 実際にデータを取り出してみよう
スノープレークというエディタを使用。
**下はシンプルな例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/b825cd43-7246-2a3b-9225-80089dfb718a.png)

SELECT （抽出しなさい）
＊　   （すべての列を）
FROM    (下のテーブルから）
 "customers"  (customerテーブル)
;     (コードの終了をあらわす)

一般的なRDB,MySQLやPostgreSQL呼ばれるデータベースがインデックススキャンや統計量などのテクニックを使って列を指定することで処理速度が向上する場合があるが近頃の開発状況をみるとasterとprimary keyのカウントは同じ速度で出せる。もしIDと指定しているがprimary keyに指定されていないカラムを叩いた場合には差が出ることになる。

**例その２↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/5068a2ff-a7dc-72a7-b1e4-8cfffe69a796.png)
SELECT （抽出しなさい）
"customer_name"　(customer_nameと呼ばれるデータだけを)
FROM    (下のテーブルから）
 "customers"  (customerテーブル)
;     (コードの終了をあらわす)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/c1c46beb-6b9b-51f8-0944-d8c3cb4e8c47.png)

**例その3**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/937a234e-7ef7-7b9f-e58e-8e7944f92f41.png)
SELECT （抽出しなさい）
"customer_name"　AS "名前"(変数の名前変更のようなもの）
FROM    (下のテーブルから）
 "customers"  (customerテーブル)
WHERE    (条件付け)
     "customer_age">=20  (この条件のみ)
;     (コードの終了をあらわす)

## 比較演算子について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/f28babd2-0bb4-3f6f-91e8-8b332fd4a616.png)
#### もともと「＜＞」は「＞＝＜」だった。
※SQL標準の演算子を使わないと移植性が下がってしまう。
一回使ったものをずっと使う特性がある。

## SQLでデータ分析してみよう

### 第一問

年ごとの注文数はいくつですか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/145b4b5c-3c42-1559-d826-2d419565d5d5.png)
DATE_PART    式から日付部分の値を抽出する
GROUP BY　　 要素をグループ化する
ORDER BY     SELECT文において特定の列の値に応じて行の並べ替えを行う

補足:大文字でも小文字で入力されてもどちらでもよい

### 第二問
年ごと、男女ごとの注文数はいくつですか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/704a5119-ff2b-723d-28b9-ffaa597523d1.png)

補足:ダブルクォーテーションは識別子を扱う。シングルクォーテーションは値を扱う。
SELECT文をWITHで囲む書き方が変化した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/0f36df51-1f71-5046-a56f-60c57e48bc3a.png)
ORDER BYをMySQLで使うと**激重**

下の図はSQLのアビス(深淵)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192644/4989fe56-0c9f-7c81-7dd1-61d3936c3396.png)

まずはSQLと会話できるようにする。
## 菱沼さんのおすすめの書籍
webエンジニア志望は「ポスグレで学ぶ～」などwebアプリと一緒に学べる本がおすすめ！

https://amzn.asia/d/fg4F538

データエンジニアとして成長したい人におすすめの書籍

https://amzn.asia/d/3tPhfdI
## まとめ
スクリーンショットは本人様に許可をもらっているので大丈夫(なはず)
これからもSQLを学習して実務レベルまでもっていきたいと思います！