SQL操作のまとめ

#目的
SQLについてしっかりと勉強できていなかったので、基本的な操作をまとめました。
同じ様な初心者の方にも分りやすく書いていきたいと思います:boy:

#使用環境
- MySQL 8.0を使用。https://www.mysql.com/jp/
- MySQLWorkbenchを使用して操作しています。
https://www.mysql.com/jp/products/workbench/

SQLの種類は他にもあると思いますが、今回は現場でよく使われているMySQLを使用しています！！
#SQLとは
SQLとは、「Structured Query Language」の略で、直訳すると「構造化問い合わせ言語」。コンピュータ言語のひとつですが、プログラミング言語ではありません。リレーショナルデータベース(RDB)のデータを操作するための言語です。

#SQLでできること
基本的には下記の事ができる認識で良いと思います。

- データの取得・登録・更新・削除
- データの条件検索
- テーブルの作成・削除・変更

#基本的なSQL操作まとめ
SQL操作を行う前に事前に使うDBを`use DB名`で指定しておいてください。また、操作の最後にセミコロン （；）をつけるのを忘れずにしましょう:point_up:


- **selectとfrom**

selectは、データベースからデータを取得するためのコマンドです。
fromは、取得するテーブル名を指定します。

例1： `select 列1, 列2 from テーブル名;`※列を指定して値を取得したい時に使用します。
例2： `select * from テーブル名;`※全ての値を取得したい時は＊を使用します。

- **as**

既に設定されている列の名前を別名で出力させたい時に使用します。

例：itemsテーブルが仮にあるとして、既に入っているカラムがnameとpriceだとします。それをそれぞれ名前と価格というカラム名に変えて出力したい時は下記の様に書きます。
`select name as 名前 , price as 価格 from items;`

- **列の値に対して演算を行う**

列の値に対して計算結果を出力したい時に使います。

例： 上記と同じitemsテーブルで消費税を追加した結果を出力したい時は下記の様に書きます。
`select name as 名前 , price as 価格, price * 1.08 as 税込価格 from items;`

- **where句**

条件を指定してデータを取得する時に使用します。
基本構文：　`select 列1, 列2 from テーブル名 where 条件`
例1：　先程のitemsテーブルでpriceが9,800円以上のものだけを出力したい時は下記の様に書きます。
`select name, price from items where price>= 9800;`

- **like句**

パターンマッチングをする時に使用します。
構文：`select 列１, ・・・, from テーブル名 where 列名 like ワイルドカード文字`

ここで、ワイルドカード文字という意味を補足しておきます。
これは文字列のパターンを指定する事で記載パターンとしては以下の2つになります。
1. '%'(パーセント)・・・0文字以上の任意の文字
2. '_'(アンダースコア)・・・任意の1文字
例）
　1. '中%':中で始まる文字列
　2. '%中':中で終わる文字列
　3. '%中%':中を含む文字列
　4. '__子':何かしらの2文字から始まり、子で終わる文字列※_は２つ記載しています。

それではlikeの使用例にいってみましょう！！

例： usersテーブルがあるとします。カラムはid, name, prefecture としてこのテーブルに入っている「中」という文字が使われているユーザーを出力したいとなった時には以下の様に記載します。
`select * from users where name like '%中%'; `

- **limit句**

取得件数の制限を設ける時に使用します。

基本構文：`select 列名 from テーブル名 where 列名 = 条件 limit 件数`

例： usersテーブルで男性のユーザーを10件出力したい場合は下記の様に記載します。因みに、カラムにはgender = 1が男性の設定になっています。

`select * from users where gender = 1 limit 10`

- **集約関数について**

集約関数とは、SQL操作で値を集計するためぬ使うものです。主な集約関数は以下になります。
 1. sum(expr)：合計値
 2. avg(expr)：平均値
 3. min(expr)：最小値
 4. max(expr)：最大値
 5. count(expr)：行数

exprの部分は引数です。具体的な使い方を以下に記載します。

例1：ordersテーブルがあるとしてそのカラムには、user_id, amount, order_timeが入っていたとします。今回は2017-01-01 00:00:00から2017-02-01 00:00:00までのamountの合計を出力させたいとします。出力させるには下記の様に記載します。
`select sum(amount) from orders where order_time>= '2017-01-01 00:00:00' and order_time< '2017-02-01 00:00:00';`

fromの前にsum(合計値)の集約関数を入力し、引数にはamountを入れています。

例2：userが何人いるか知りたい時は下記の様に記載すると出力されます。
`select count(*) from users;`

#応用的なSQL操作まとめ
- **countの応用**

基本操作でcountを紹介しましたが、その応用版を紹介します。
例：今回はaccess_logsというテーブルにカラムがuser_id, request_monthが入ってたとします。このテーブルから2017-01-01のアクセスしたユーザーの数を出力するには以下の様に記載します。
`select count(distinct user_id) from access_logs where request_month = '2017-01-01';`

ここで、distinctが登場していますが、これはuser_idを重複させないための設定です。


- **group by句**

データをグループ化して出力する時に使用します。
例：都道府県別のユーザーを出力したい時があるとします。まずここで、関わって来るのは、usersテーブルとprefecturesテーブルの2つがある事を認識しておいてください。それぞれusersテーブルのカラムにはid, name, prefecture_idが入っており、prefeturesテーブルのカラムにはid, nameが入っています。
それでは、出力例を下記に記載します。
`select prefecture_id, count(*) from users group by prefecture_id;`

- **having句**

whereやgroup bなどの集約結果をさらに絞り込みたい時に使用します。
例：2017年のアクセスログから月間ユニークユーザー数が630人以上の月の一覧を出力したい時は下記の様に記載します。
`select request_month, count(user_id) from access_logs where request_month >= '2017-01-01' and request_month < '2018-01-01' group by request_month having count(distinct user_id)>= 630;`


応用編になると記述内容が増えてしまいますが各句の意味さえ理解していればあとは調べながらでもできるので、何回も繰り返しやって行けば慣れてくると思います:fist:

#select文の記述手順、実行順
今まで紹介してきた、句では記述順序や実行順が決まっているので記載します。

- 記述順序


1. select：取得カラムの指定
2. from：対象テーブルの指定
3. where：絞りこみ条件の指定
4. group by：グループ化条件の指定
5. having：グループ化した後の条件の指定
6. order by：並び替え条件の指定
7. limit：取得する行数の指定

- 実行順


1. from：対象テーブルの指定
2. where：絞りこみ条件の指定
3. group by：グループ化条件の指定
4. having：グループ化した後の条件の指定
5. select：取得カラムの指定
6. order by：並び替え条件の指定
7. limit：取得する行数の指定

記述順と実行順の違いは**select**の位置が違うところなので、そこを注意してください！！



#まとめ
今回は動画と書籍で勉強したので、下記に参考資料で掲載しておきます。
SQLを実際に操作する時の参考にして頂ければ嬉しいです:relaxed:
また、認識の間違い等あればご指摘頂けると助かります！
まだまだ、操作自体は慣れていないのでこれから慣れていきます:muscle:

また追加事項あれば追記致します！！

#参考資料
- この動画はすごく分りやすかったので、おすすめです。演習問題も実際に手を動かして解けるので、良いですよね:point_up:

   https://www.udemy.com/share/101ZvECEEedlZXRXw=/

- 補助的に参考にしましたが、解説がとても分りやすくて初心者の方におすすめです！

https://www.amazon.co.jp/SQL-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%93%8D%E4%BD%9C-%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B00ESXY9FM