티스토리 뷰

SQL

SQL 4주차 개발일지

김기지 2022. 9. 3. 20:11

◎ Subquery : 쿼리 안의 쿼리. 코드를 편하고 간단하게 하기 위해서 사용한다.

 

● WHERE절에 들어가는 서브쿼리

 : where 필드명 in (서브쿼리)

● SELECT절에 들어가는 서브쿼리

 : select 필드명, 필드명(서브쿼리) from 필드

● FROM절에 들어가는 서브쿼리

 : inner join (서브쿼리) a on 

 

<연습해보기>

● where절

카카오페이로 결제한 유저정보 출력하기

- ① orders테이블과 users테이블을 묶어줌

  : select * from users u

   inner join orders o on u.user_id = o.user_id

  ② 결제수단이 카카오페이인 경우만 나오게하기

  : where payment_method = 'kakaopay'

합치면

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'

 

이걸 서브쿼리를 이용한다면

 ① 카카오페이로 결제한 user_id만 출력하기

: select user_id from orders

 where payment_method = 'kakaopay'

② 위에서 구한 필드 안에서 유저정보 출력하기

 : select u.user_id , u.name  ,u.email  from users u

  where user_id in ( 

    select user_id from orders

    where payment_method = 'kakaopay'

 )

 

● select절

ckeckins테이블에 course_id별 평균 likes수 붙이기

① 먼저 checkins테이블을 실행하여 원하는 필드명을 뽑아낸다.

② 평균 likes수를 구하기 위해 새로운 checkins테이블을 실행한다.

   여기서 먼저 특정 course_id의 평균likes수를 출력해본다.

 : select avg(likes)  from checkins

   where course_id = '5f0ae408765dae0006002817'

③ 위 서브쿼리를 select절에 붙여주는데, 모든 course_id별 평균값을 구해야하기 때문에

    ①에서 출력하고자하는 c.course_id로 바꿔준다.

   select avg(likes)  from checkins

   where course_id = 'c.course_id'

 

= SELECT c.checkin_id ,
   c.course_id ,
   c.user_id ,
   c.likes ,
   (
    SELECT AVG(likes) from checkins
    WHERE course_id = c.course_id 
   )
  FROM checkins c 

 

● from절

course_id별 유저의 checkin갯수 구하기 ( 중복은 제외하기)

① checkins테이블을 실행 후 course_id로 묶어준다.

② count(user_id)로 실행시 중복된 경우도 함께 계산되기 때문에

   distinct로 중복을 없앤다.

 : select course_id, count(distinct(user_id)) from checkins

   group by course_id

 

◎ With절 

: 서브쿼리문을 좀 더 깔끔하게 정리. 쿼리문을 ( )안에 넣어 테이블로 정리한다.

맨 윗줄에 

with table1 as (  ) , table2 as (  )

 

 

○ 실전에서 유용한 sql문법

1. 문자열 

 1) 문자열 쪼개기 - substring_index

   ex) 이메일에서 아이디만 가져오기

    ① users테이블을 실행한다. 

        이메일은 '아이디 @ 도메인' 으로 이루어져있으므로 @를 기준으로 분리한다.

    : substring_index(email,'@',1) → email을 @ 기준으로 나눈 앞부분 (뒤는 -1)

 2) 문자열 일부만 출력하기

   ex) orders테이블에서 created_at 날짜만 출력하기

    : substring_index(created_at,1,10) → created_at의 앞에서 10번째 문자까지 출력

 

2. CASE

 : 경우에 따라 원하는 값을 새 필드에 출력한다.

  ex) 포인트 보유액에 따라 다르게 표시하기

   point > 10000일때 '잘 하고 있어요!' 그 외엔 '조금만 더 화이팅!' 으로 표시

select pu.user_id, pu.point ,

( case when pu.point > 10000 then '잘 하고 있어요!'

          else '조금만 더 화이팅!' end)

 from point_users

 

728x90

'SQL' 카테고리의 다른 글

SQL 3주차 개발일지  (0) 2022.09.03
SQL 2주차 개발일지  (0) 2022.08.30
SQL 1주차 개발일지  (0) 2022.08.18