스파르타 SQL 4주차 개발일지다.
4주차에는 SQL에 어려움을 많이 느꼈다 새로운 문법 사용방식이나 복잡한 문법사용이 많이 나왔던것 같다.
SubQuery
subquery란 쿼리안의 쿼리로 원하는 세분화된 결과를 더욱 쉽게 얻어보기 위해 쓸 수 있다.
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'
)
위와같이 where 필드명 in()를 이용해 내부에 원하는 쿼리를 작성해 더 세부적으로 찾아볼 수 있다.
where, select, from
서브쿼리는 세가지 절에서 모두 사용될 수 있다.
where
===============================================================
위 사용한 방법과 같은 서브쿼리로
select * from users u
where u.user_id in (select o.user_id from orders o
where o.payment_method = 'kakaopay');
카카오페이로 결제한 주문건 유저들만, 유저 테이블에서 출력해주고 싶을 때 이런식으로 이용할 수 있다.
===============================================================
select
===============================================================
결과를 출력해 줄때 원하는 서브쿼리 결과를 편하게 붙여줄 때 사용합니다.
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;
위 쿼리와 같이 출력 부분에서 값을 찾아서 붙일 수 있다.
===============================================================
from
===============================================================
from에 subquery가 사용되는 유형(이 유형이 실무에서 가장 많이 사용되는 유형이라고 한다.)
select pu.user_id, a.avg_like, pu.point from point_users pu
inner join (
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id
) a on pu.user_id = a.user_id
===============================================================
With
다음은 with절의 사용이다.
일종의 Alios라고 보면 되는데, 지정해둔 서브쿼리에 이름을 붙여서 그 이름을 하나의 테이블 처럼 생각하고 사용하는 방식이다.
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
위 코드처럼 table1과 table2로 이름을 지정해두고 아래 쿼리에서 쓴걸 볼 수 있다. 한눈에 볼 수 있어서 더 편하다.
내가 처음 C를 배웠을 때 함수를 배웠을 때 느낌같다.
문자열
다음은 문자열을 쪼개거나 일부만 출력하는 등 문자열에 관한 문법이다.
Substring_Index:
이메일의 아이디만 가져오기↓↓↓↓↓
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
이메일의 도메인만 가져오기↓↓↓↓↓
select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users
위와같이 문자열을 쪼개서 필요한 부분만 조절해서 가져오고 싶을 땐 Substring_Index를 이용한다.
Substring:
날짜 출력해보기↓↓↓↓↓
select order_no, created_at, substring(created_at,1,10) as date from orders
SUBSTRING(문자열, 출력을 하고싶은 첫 글자의 위치, 몇개의 글자를 출력하고 싶은지)로 Substring을 이용해 필요한 일부만 출력할 수 있다.
CASE
case는 다른언어에서 사용되는 문법과 크게 다르지 않았다.
다른 언어에서는 switch case문 또는 case문이라고 많이 불렸는데
case들 마다 다른 결과를 출력할 수 있게 해준다.
select pu.point_user_id, pu.point,
case
when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!'
END as '구분'
from point_users pu;
위와같이 포인트가 10000이상인 경우와 그렇지 않은 경우로 나누었다.
4주차 SQL은 생각보다 복잡하고 어려웠다... 나에겐 3주차에서 갑자기 난이도가 확 올라간 느낌이 들었다...
어려웠지만 차근차근 따라하면 따라할 수는 있었다.. 하지만 아직 솔직히 잘 모르는 부분도 분명히 많다.
시간이 날때 다시 영상을 복습해 봐야겠다.
일단 지금은 웹개발 해적단 수업으로...