見出し画像

【初心者向け】SQL入門!!④使用シーンの多い構文紹介!

ステップ①では、SQLはいったいどのようなものなのか?何ができるのか?
ステップ②では、最速でマスターするには型で覚えてしまおう。
ステップ③では、WHERE/GROUP BY句を駆使しようといった内容でした。
ステップ④では、今まで登場してない覚えると便利な構文を、
テンポよく簡潔にご紹介させていただきます!
では早速やっていきましょう!!

CASE

条件分岐を行うための命令を行える句となります!
見てニュアンスをつかんでください(笑)

select 
area,count(*)
from
`sqltest-000.t_sqltest.test_sql`  
GROUP BY 1;

試しに上記をCASE式を使用すると↓

select 
case
when area = "shimane" then "島根"
when area = "fukuoka" then "福岡"
when area = "saitama" then "埼玉"
when area = "tokyo" then "東京"
else "それ以外の県" 
end as area,
count(*) as count
from
`sqltest-000.t_sqltest.test_sql`  
group by 1;


上記のようにレコード内を変更することができます!
さらに↓

select 
case
when area = "shimane" then "島根"
when area = "fukuoka" then "福岡"
when area = "saitama" then "埼玉"
when area = "tokyo" then "東京"
else "それ以外の県" 
end as area,
case
when unit_price <=1000 then "1000円以下"
when unit_price >=1000 then "1000円以上"
end as unit_price,
count(*) as count
from
`sqltest-000.t_sqltest.test_sql`  
group by 1,2

単価1000以上か以下かで分岐することもできます!

FORMAT DATE

指定したフォーマットに、日付の形式を変更する日付関数になります。
下記をご覧ください!

SELECT
date
from
`sqltest-000.t_sqltest.test_sql`  
order by 1;

上記のレコードを変換することができます!

SELECT
format_date("%Y年%m月%d日",date) as date
from
`sqltest-000.t_sqltest.test_sql`  
order by 1;

こんな感じでyyyy-mmでまとめることも可能です!

SELECT
format_date('%Y-%m',date)
from
`sqltest-000.t_sqltest.test_sql` 
group by 1 
order by 1;

CURRENT_DATE

何日前から抽出したいかを指定できます!

SELECT
date,name_2
from
`sqltest-000.t_sqltest.test_sql` 
WHERE
date > CURRENT_DATE() -4000
--  CURRENT_DATE() = 今日の日付(2023/01/06) -~~  → 何日前から抽出したいか
order by 1;

INNER JOIN(内部結合)

テーブル結合についてですね!
~~JOINと呼ばれる複数のテーブルを結合させ、その中から条件に合ったもののみを抽出するといったことができるといった内容です。
種類としては下記になります。

  • INNER JOIN(内部結合)

  • LEFT OUTER JOIN(左外部結合)

  • RIGHT OUTER JOIN(右外部結合)

  • FULL OUTER JOIN(完全外部結合)

上記のオレンジ、青2つのテーブルから、どこの部分を抜き取りたいか(緑)によって異なる関数を用います!
今回はわたくしが思う使用シーンの多い構文紹介ですので、内部結合に関してQuery書いてみました。

会員データ
受注データ

上記のような会員情報が入ったデータと、受注情報が入ったデータがあるとします。
この2つのテーブルは、会員登録した際のデータと、購入があった際のデータとなり、それぞれ情報が異なります。
この2つのテーブルを合わせ、性別毎の受注点数を見たいとなった際は、下記のQueryになります!

SELECT tb1.sex, count(tb2.quantity) as quantity
FROM `sqltest-000.t_sqltest.test_sql_member` AS tb1
INNER JOIN
`sqltest-000.t_sqltest.test_sql_order` AS tb2
ON
tb1.no = tb2.no
GROUP BY 1;

Queryの書き方としては、
SELECT
FROM
INNER JOIN
ON
テーブル名 カラム=テーブル名 カラム
となります!
~~idのような会員それぞれに付与される主キー(ユニークな値)で結合するのがルールです!(tb1.no = tb2.noの部分ですね!)

また、SERECT句やWHERE句に入れる値は、
「どのテーブルのなんなのか」を記載する必要がございます!
迷子になってしまいますからね!

また下記のように3つ以上のテーブル結合をする場合、下記のようにつなげていきます!

SELECT * FROM テーブル1.*,テーブル2.* ,テーブル3.年齢
JOIN テーブル2 ON テーブル1.user_id = テーブル2.id
JOIN テーブル3 ON テーブル1.user_id = テーブル3.id

CREATE TABLE

最後はCREATE TABLEです!
新しいテーブルを作成する際、使用する構文です!
order table を使用します。

受注データ
create table`sqltest-000.t_sqltest.test_sql_new`
as
SELECT
product_no,product,unit_price
FROM
`sqltest-000.t_sqltest.test_sql_order`;

そうすると

SERECT句で選んだ項目のみのテーブルが出来上がります!
もちろんWHERE句等も一緒に使用し、条件付けしたうえで作成も可能です!
わたくしが一番使用したシーンが多かったのが、INNER JOINとの組み合わせ!

create table`sqltest-000.t_sqltest.test_sql_new`
as
SELECT
tb2.area,tb2.sex,count(tb1.no)as id, sum(tb1.total_price)as total_price
FROM
`sqltest-000.t_sqltest.test_sql_order` as tb1
inner join
`sqltest-000.t_sqltest.test_sql_member` as tb2
ON
tb1.no = tb2.no
where
tb1.unit_price >=1000
group by
tb2.area,tb2.sex
having
total_price >=4000
order by 4,3;

性別かつ地域別の
商品単価¥1,000以上かつ合計金額¥4,000以上を
昇順に並べろ!!!

って書きました(無理やり笑)

このような感じで色々好きな形でデータを組み合わせて作成をすることができるのでチャレンジしてみてください!

ちなみにテーブルを作ったが消したいときは↓

DROP TABLE

DROP TABLE`sqltest-000.t_sqltest.test_sql_new`;

これで消えます!
消したくないテーブルも簡単に消えてしまうので、クエリをたたく前にチェックを忘れずに!!!

さいごに…

っという感じなのですが、いかがだったでしょうか….
正直なところ振り返るとだいぶ雑なご説明になってしまった箇所多く存在すると反省しております….
ブログ書くの初めてですので大目に見てください(土下座)

本4ステップはSQLがどのようなものなのか、触れたことのない人でも簡単にQueryをたたくことができることを意識し、記載したつもりです!
とにかくQueryが回る快感を味わってほしいと思い(笑)
今回の4ステップでは、説明が不十分、また分野によっては全く異なる構文が必要になると思われます(バックエンド領域とかだと全然違うかと…)

今後もこのように気楽に発信できる場として、利用させていただければと思っております!
またSQL以外にも、BIツールの活用方法やブランディング、クリエイティブ、ビジュアル作成等も発信できればなぁ…なんて考えております!

こんなわたくしですが、皆様今後ともどうぞよろしくお願いいたします!

いいなと思ったら応援しよう!

この記事が参加している募集