SQL-4週間、EXCELより楽


subquery、いくつかの役に立つ文法


学習
  • サブクエリの使用方法
  • 実戦からより多くの有用なSQL文法を学ぶ
  • SQLを使用して実戦と同じデータ分析を行う
  • subquery
    1つのSQLクエリーにもう1つのSQLクエリーがあります
    クエリーを作成し、必要な場所に直接挿入
    ->joinを使わずに同じ機能を実現できる
  • ex)kakaopayで決済したユーザの情報を表示する
  • KACAを使用してユーザー情報を表示(join機能を使用)
  • 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'
  • サブquery,
  • a.まずkakaopayで支払ったすべてのuser id(k)を取得する
    select user_id from orders
    where payment_method = 'kakaopay'
    b.その後、user idはK上のユーザのみを選択する
    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'
    )
    1)whereのsubqueryに入る
    ->条件文はどこですか?Subqueryの結果を条件に使用します.
    whereフィールド名in(subquery)はこのように!
    select * from users u
    where u.user_id in (select o.user_id from orders o 
    					where o.payment_method = 'kakaopay');
    2)selectのsubqueryに入る
    ->結果を出力する部分を選択しましょうか?既存のテーブルに表示する統計を簡単に貼り付けることができます.
    フィールド名、フィールド名、fromを選択...このまま!
    select c.checkin_id, c.user_id, c.likes, 
    	(select avg(likes) from checkins c2
    	where c2.user_id = c.user_id) as avg_like_user
    from checkins c;
    3)Fromのサブクエリ(最も一般的)
    ->Fromはいつ使えばいいですか?私が作ったセレクトと既存のテーブルがジョインしたい時に使うとちょうどいい!
  • with練習して
    withを使用してsubqueryの内容を予め記入すると、
    以下からsubqueryをasにロードし、
  • を使いやすい
    with table1 as (
    	select course_id, count(distinct(user_id)) as cnt_checkins from checkins
    	group by course_id
    ), table2 as (
    	select course_id, count(*) as cnt_total from orders
    	group by course_id
    )
    
    select c.title,
           a.cnt_checkins,
           b.cnt_total,
           (a.cnt_checkins/b.cnt_total) as ratio
    from table1 a inner join table2 b on a.course_id = b.course_id
    inner join courses c on a.course_id = c.course_id
    select c.title,
           a.cnt_checkins,
           b.cnt_total,
           (a.cnt_checkins/b.cnt_total) as ratio
    from
    (
    	select course_id, count(distinct(user_id)) as cnt_checkins from checkins
    	group by course_id
    ) a
    inner join
    (
    	select course_id, count(*) as cnt_total from orders
    	group by course_id 
    ) b on a.course_id = b.course_id
    inner join courses c on a.course_id = c.course_id
  • 実戦で役立つSQL構文(文字列、Case)
  • 1)文字列分割
    substring index(フィールド、「基本文字」、1または-1)
    ->メールアドレスから@前のIDを取得するか、@後のメールドメインを取得したいだけです!
    2)部分文字列のみ出力
    substring(フィールド名、開始位置、終了位置)
    select order_no, created_at, substring(created_at,1,10) as date from orders
    3)CASE:場合によっては必要な値を新しいフィールドに出力しようとする
    ->10,000点以上のポイントがあれば「よくできました!」平均を下回ると「もう少し走れ!どのようにマークしますか?
    select pu.point_user_id, pu.point,
    case 
    when pu.point > 10000 then '잘 하고 있어요!'
    else '조금 더 달려주세요!'
    END as '구분'
    from point_users pu;
    *subqueryで統計できます
    a.いくつかの種類に分ける
    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
    b.subqueryを使用groupbyを使用して統計を作成する
    select level, 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
    c.節用
    with table1 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 level, count(*) as cnt from table1
    group by lv
  • 完了、
  • これは実際の仕事で役に立つ内容を学ぶ良い授業だと思います.
    資料を処理するときは、直接データベースにアクセスし、欲しい資料を整理します.
    これは有意義なデータを抽出する文法を学ぶ良い授業です.
    現在、会社に直接アクセスできるDBはないので、公開されたDBで練習したり、sql問題サイトで問題を解いたりします.
    4周目の宿题は文法整理なので、もっと文章を书いて文法を整理します.