7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【初心者SQL】JOINと友達になりたい!

Last updated at Posted at 2021-12-21

こんにちは。
最近業務でSQLをめっちゃかきはじめました。初心者SQLerです。
だいたい構文は理解してますが、joinを使うことが苦手すぎてこれまで避けてきた私が、ついにJOINと友達になることができましたw

結果、JOINを使うときにここには注意したいという点が見えたので、記事にしたいと思います。
※この記事は、JOINの考え方は知っている人向けです。JOINを使うときに気を付けたほうがいいことをサンプル付きでまとめています。

JOINができると解決できるケース

  • 1回のSQLではデータが出ないとき。
  • 1回のSQLでデータを出すときに、別々のTBを結合しないと検索できないとき。

私はこれまで、
SQL書いて抽出→スプレッドシート→値をカンマにして in()…の繰り返し
という不毛なことをしていました。。。
それに疲れ切った私は、JOINと友達にならないとまずい!と重い腰を上げたのであった。

JOINとは?(当たり前のおさらい)

複数のTBを1つにリレーションしたいときに使えばいい。ただそれだけ。

TB1 join TB2 on TB1.col1 = Tb2.col2

↑Fin!イッツJOIN!(超初心者の書き方で失礼します。)

JOINがなんか使いにくい(面倒)と思っていた理由

  • 記述が長くなるのエラーが多くなりそう →面倒
  • 考え方の整理が難しい →面倒
  • 複数TBのイメージがしづらい →面倒

これらの面倒により避けてきていました。
今回私なりのJOINを書くときの自分のルールを作る、ことでJOINは簡単だと思えるようになりました。

自分なりのJOINを使うときのルールを決めた

SQL初心者の私はselect→from→…と上から順に構文を作る傾向があります。
結果、JOINをする!と決めたタイミングで、あれ?selectには何を入れるといいんだっけ…となりがちでした。
以下のようなルールを個人的に設けると考えが整理できました。

  • JOINの構文を作るときは、先にfromから作る
  • fromにあるJOINしたいTB同士で検索したいものをイメージしてから、selectにあとから書いていく
  • JOIN対象のTB.col1を上記で記述したselectに漏れがないかを確認する。
  • (なんなら、With句は全部必要なTBを作ってから、最後に付ける)
    image.png

With句もセットで覚えると良い!

JOINでSQLを書くときは、ほぼ複数のTBでデータを一時作成するケースがほとんどかと思います。

そのため、With句 もセットで覚えるととても便利!

  • Withは文頭の1レコードのみ記載する。
  • それ以外のTBはas(),のみでよい。
  • 1つのSQLでTB作成のas(),は何個も使ってよい
  • 最後にまとめるときのTBはas()(カンマを付けない!)

JOINしたTBを1つのSQLに複数作ってもよいか?

作って大丈夫です!!

例えば、
リレーションを複数行う過程でJOINが複数回必要になった場合

with TB_1 as(
select * from TB_a where hoge 
)
,
TB_2 as(
select * from TB_b where hoge
)
,
TB_3 as(
select * from TB_a join TB_b on TB_a.col1 = TB_b.col1
)
--↑カンマは最後のasには不要です!

-- 別のTBで再度joinしたい
select * from TB_3 join TB_4 on TB_3.col1 = TB_4.col1

##クロージングのために縦結合のunion allも使ってみる
JOINを複数回使った一時TB同士で結果のレイアウトが合えば、
union all で結合するととてもきれいな集計結果を作れました。

with TB1_1 as(
select * from TB_a where hoge 
)
,
TB1_2 as(
select * from TB_b where hoge
)
,
-- 1回目のjoin
TB1_3 as(
select * from TB_a join TB_b on TB_a.col1 = TB_b.col1
)
,

TB2_1 as(
select * from TB_c where hoge 
)
,
TB2_2 as(
select * from TB_d where hoge
)
,
-- 2回目のjoin
TB2_3 as(
select * from TB_c join TB_d on TB_c.col1 = TB_d.col1
)
-- 2つを結合
select * from TB1_3
union all
select * from TB2_3

JOIN便利。心の友…

1回覚えてしまえば、もう怖くなかった。
集計を複数回やるときに毎回スプレッドシートに貼るアクションが不要になりました。
最高!

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?