SQL 4週目!


いよいよ4週間!
この授業はいろいろなsubqueryです.
subqueryとは?
これは、クエリー内のクエリーを次のクエリーとして表し、前のクエリーで使用してクエリーを簡単にする方法です.
結論から言えば、やはりすべての授業の中で一番難しいです.
しかしサブクエリをうまく利用すれば、必要なデータを十分に活用できる能力があるので、勉強に励みましょう!
まず、サブクエリを理解する簡単な例を見てみましょう.

サブクエリの例


私が持っているデータから、カリキュラムをカナダで決済するユーザー情報を見たい場合は、usersテーブルとordersテーブルを結合する必要があります.
select u.user_id, u.name, u.email from users u
inner join orders o on u.user_id = o.user_id
where o.payment_method = 'kakaopay'
ただし、上記の内容は、joinを用いず、以下の手順で行うことができる.
  • ordersテーブルには、カナダで支払うuser id
  • のみが表示される.
    select user_id from orders
    where payment_method = 'kakaopay'
  • は、私が抽出する上記データの中のuser id情報と一致するユーザデータ
  • のみをユーザテーブルからインポートする.
    select u.user_id, u.name, u.email from users u
    where u.user_id in (
    	select user_id from orders
    	where payment_method = 'kakaopay'
    )
    これによりjoinを使用する必要がなく、必要なデータを得ることができます.
    このときwhere節に入る括弧の部分はqualの中のもう一つのクエリーで、サブクエリーです!
    サブクエリはwhereセクション、selectセクション、fromセクションの任意の場所にアクセスできます.
    このうちfromセクションが最も多く使用されています.
    上記の例は、whereセクションに入るサブクエリの例です.

    selectセクションサブクエリの例


    所有するデータを使用して、checkinsテーブルのcourse id、userid、like、coursestarylikeを平均的に加算します.
  • まずcheckinsテーブル
  • を読み込む.
    select * from checkins c
  • checkins表の中で、各課程のlikeの平均値
  • を求めます
    select course_id, avg(c2.likes) from checkins c2
    group by course_id 
  • サブクエリ表示するデータのみ抽出
  • select checkin_id, course_id, user_id, likes, 
    (select avg(c2.likes) from checkins c2
    where c.course_id = c2.course_id) 
    from checkins c
    2番目に作成したクエリー文をサブクエリーとして使用すると、selectに挿入して必要なデータセットに抽出できます.
    それぞれのデータにマッチさせるために、思わず条件を与えてしまう.

    fromセクションサブクエリの例


    今回は,所有するデータから受講登録情報(登録名id)の全授業数と受講数を出力した.
  • 川全体の世紀
  • select enrolled_id, count(*) as total_cnt from enrolleds_detail ed 
    group by enrolled_id 
  • 受講者数(don=1)世紀
  • select enrolled_id, COUNT(*) as done_cnt from enrolleds_detail ed 
    where done = '1'
    group by enrolled_id 

    2つのテーブル
  • をinnerjoinにマージ
    select * from (
    	select enrolled_id, COUNT(*) as done_cnt from enrolleds_detail ed 
    	where done = '1'
    	group by enrolled_id 
    ) a inner join (
    	select enrolled_id, count(*) as total_cnt from enrolleds_detail ed 
    	group by enrolled_id 
    ) b on a.enrolled_id = b.enrolled_id

    ここで重要なのは、from節のサーブ品質ごとにalias(別名)を加えることです.上はa,bの!
    aliasを貼っていないときにaliasが必要なエラーが発生しました.
  • 表示したいデータのみ取得
  • select a.enrolled_id, a.done_cnt, b.total_cnt from (
    	select enrolled_id, COUNT(*) as done_cnt from enrolleds_detail ed 
    	where done = '1'
    	group by enrolled_id 
    ) a inner join (
    	select enrolled_id, count(*) as total_cnt from enrolleds_detail ed 
    	group by enrolled_id 
    ) b on a.enrolled_id = b.enrolled_id

    そう聞いて一気に調べた.
    ここではwithセクションを使用するとfromセクションのサブクエリをより簡単にできるというヒントがあります.
    次にwith句を使用して、さっきのfrom句クエリをよりきれいに整理したクエリ文を示します.
    with done_table as (
    	select enrolled_id, COUNT(*) as done_cnt from enrolleds_detail ed 
    	where done = '1'
    	group by enrolled_id 
    ), total_table as (
    	select enrolled_id, count(*) as total_cnt from enrolleds_detail ed 
    	group by enrolled_id 
    )
    
    select a.enrolled_id, a.done_cnt, b.total_cnt from done_table a 
    inner join total_table b on a.enrolled_id = b.enrolled_id
    withセクションを使用する場合、実行するには全体的なドラッグ&ドロップが必要です.
    次の文のみを実行すると、withセクションにdon tableとtotal tableが定義されていないというエラーが発生します.
    このようにサブクエリを学習し,さらにいくつかの有用なクエリを学習した.

    付加1)case構文


    case構文は,特定の条件に基づいてデータを区別整理する方法である.
    ポイントを5000または10000以上に分けて整理したい場合は、case構文を以下に示すように使用します.
    select pu.point_user_id, pu.point,
    case 
    when pu.point > 10000 then '1만 이상'
    when pu.point > 5000 then '5천 이상'
    else '5천 미만'
    END as lv
    from point_users pu

    これらの整理された内容を利用して、以下の統計を行うことができる.
    select lv, count(*) as cnt from (
    	select pu.point_user_id, pu.point,
    	case 
    	when pu.point > 10000 then '1만 이상'
    	when pu.point > 5000 then '5천 이상'
    	else '5천 미만'
    	END as lv
    	from point_users pu
    ) a
    group by lv

    上で使用したwith節を使用すると、以下のように簡潔に表現できます.
    with point_cnt as (
    	select pu.point_user_id, pu.point, 
    		CASE 
    		when pu.point > 10000 then '1만 이상'
    		when pu.point > 5000 then '5천 이상'
    		else '5천 미만'
    		end as lv
    	from point_users pu
    )
    
    select lv, count(*) as cnt from point_cnt 
    group by lv

    追加2)クリップ文字列

  • email@のみで始まる
  • select SUBSTRING_INDEX(email, '@', 1) from users
  • email@のみで始まる(ドメイン)
  • select SUBSTRING_INDEX(email, '@', -1) from users

    1は区切り記号の前の内容-1は区切り記号の後ろの内容です
  • 文字列
  • の一部のみをインポート
    select order_no, created_at, substring(created_at,1,10) as date 
    from orders

    created atでは、1番から10番まで1文字しか持たず、日付で構成されています.
    このようにSQLのすべての課程を完成しました!

    4週間を終えたスパルタエンコーディングクラブの短い後記です!


    明日の学習カードで偶然触れたスパルタコードクラブ.
    Web開発総合クラスを経て、SQLは2回目の授業です.
    スパルタコードクラブは確かに非専門家がコードに近づきやすくするために、できるだけ簡単に分かりやすく授業をしています.あなたのおかげで、いろいろな課題を自分でやってくれてありがとう.(難しすぎると途中で抜けてしまうかも…ううう)
    特に、SQLは最初に触れたときに、自分の手でいろいろなデータに触れたり、いろいろな方法を試したりすることができてよかったです.もちろん、SQLを正しく処理するにはかなり複雑になりますが、今回の講義を通じて、私はやはりやってみることができます!自信を得た.
    この点では、初めてコードに触れて、コードが怖くて、何かしたい文科生におすすめのレッスンです.しかし、残念なことに、講座をさらに深化させることはできなかった.△少なくとも明日習うカードは…?
    Web開発総合クラスのプロジェクトグループのように、SQL教室でもより多くの人ができる課題やプロジェクトがあることを望んでいます.
    将来、私たちは引き続きSQLを勉強して、Pythonを使ってデータの可視化を勉強して、あるいはいっそ他の開発を勉強して、データではありませんが、私たちは引き続きコードを放棄しないように努力します!
    これは私にコードに興味を持たせたので、スパルタコードクラブに感謝しきれません:)
    https://spartacodingclub.kr/?f_name=%EC%9D%B4%EB%8B%A8%EB%B9%84&f_uid=5f712c03affe4f0009c6ebb0