[스파르타코딩클럽] 엑셀보다 쉬운 SQL - 4주차 개발일지

최경미·2023년 3월 29일
0

엑셀보다 쉬운 SQL

목록 보기
4/5

1. Subquery

: 큰 쿼리문 안에 들어가는 작은 쿼리문 (하위 쿼리)

  • 실행 순서 : 안에 있는 쿼리-> 밖의 쿼리
  • 중요한 점 : 줄 잘 맞추기

1) 자주 쓰이는 Subquery 유형

  • ⭐From에 들어가는 Subquery⭐
    • 사용 시점 : 내가 만든 Select와 이미 있는 테이블을 Join하고 싶을 때
    • 실행 순서
      1) 먼저 Subquery의 select가 실행
      2) 이것을 테이블처럼 여기고 밖의 select가 실행
  • 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');
      1) from 실행: users 데이터를 가져와줌
      2) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌
      3) where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해줌
      4) 조건에 맞는 결과 출력
  • Select에 들어가는 Subquery
    - 사용 시점 : 기존 테이블과 함께 보고싶은 통계 데이터를 손쉽게 붙이고 싶을때
    - 방식 : 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;
      ```
      1) 밖의 select * from 문에서 데이터를 한줄한줄 출력하는 과정에서
      2) select 안의 subquery가 매 데이터 한줄마다 실행되는데
      3) 그 데이터 한 줄의 user_id를 갖는 데이터의 평균 좋아요 값을 subquery에서 계산해서
      4) 함께 출력해준다!

2. with절

: 서브쿼리의 별칭을 만들어, 복잡한 코드를 가독성있게 만들어줌

  • 예시 코드 : table1과 table2로 분류
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

3. 실전에서 유용한 SQL 문법 (문자열, Case)

1) 문자열 데이터

  • SUBSTRING_INDEX : 문자열 쪼개보기
    • 사용 방식
      : 가져올 조각 순서에서 1은 첫번째 조각, -1은 마지막 조각을 뜻함
      SUBSTRING_INDEX(문자열, '기준 문자', 가져올 조각 순서)
    • 예시 코드
      : @를 기준으로 텍스트를 쪼개고, 그 중 첫 번째 조각을 가져오라는 뜻
      SUBSTRING_INDEX(email, '@', 1)

  • SUBSTRING : 문자열 중 일부만 출력하기
    • 사용 방식
      substring(문자열,출력하고 싶은 첫 글자의 위치,출력할 글자 개수)

  • Case : 경우에 따라 원하는 값을 새 필드에 출력하기

    • 사용 방식
      case
      when 문자열 조건 then 출력하려는 값
      else 출력하려는 값
      END
    • 예시 코드
      : point가 5,000점 이상일 시 '잘했어요'문구 출력하고 미만일 시 '노력합시다'문구 출력
      case
          when point >= 5000 then '잘했어요'
          else '노력합시다'
          END
  • distinct : 중복없이 세기

    distinct(항목)
profile
개발 지식 있는 서비스 기획자로 거듭나기!

0개의 댓글