SQL-4週間、EXCELより楽
subquery、いくつかの役に立つ文法
学習
1つのSQLクエリーにもう1つのSQLクエリーがあります
クエリーを作成し、必要な場所に直接挿入
->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'
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を使用して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
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周目の宿题は文法整理なので、もっと文章を书いて文法を整理します.
Reference
この問題について(SQL-4週間、EXCELより楽), 我々は、より多くの情報をここで見つけました https://velog.io/@karlrl3108/엑셀보다-쉬운-SQL-4주차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol