TIL_[SQL] 프로그래머스_코딩테스트 회고를 통한 sql 문법 공부6

김희정·2023년 12월 15일

TIL

목록 보기
13/57
post-thumbnail

헤비 유저가 소유한 장소

Q. 이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다.
헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성하시오.

다른 사람들의 풀이를 보던 중 with로 푼 사람이 있어서 with 문에 대해서 찾아봤다.

WITH 문이란?

  1. 이름을 가진 서브쿼리를 정의한 후 사용하는 구문
  2. 쿼리의 전체적인 가독성을 높이고, 재사용할 수 있는 장점이 있음
  3. 대부분의 DBMS에서 지원함
  4. 계층형 쿼리를 구현할 수 있음

문법은 다음과 같다

/* 1개의 임시테이블 */
WITH 임시테이블명 AS (
    SUB QUERY문 (SELECT절)
)
SELECT 컬럼, [컬럼, ...]
   FROM 임시테이블명

/* 2개 이상의 임시테이블 */
WITH
임시테이블명1 AS (
    SUB QUERY문 (SELECT절)
),
임시테이블명2 AS (
    SUB QUERY문 (SELECT절)
)
SELECT 컬럼, [컬럼, ...]
   FROM 임시테이블명1
      , 임시테이블명2

출처


(정답)
with temp as (
SELECT host_id, count(*) cnt from places
group by host_id having cnt >=2
)

select * from places 
where host_id in (select host_id from temp)
order by 1
  1. with 절에서 헤비유저만 추린 임시 테이블을 만든다
  2. 헤비유저가 포함된 행만 가져온다

우유와 요거트가 담긴 장바구니

Q. 데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 
우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 
이때 결과는 장바구니의 아이디 순으로 나와야 합니다.

한 아이디에 여러가지 속성이 있는게 아니라, 한 컬럼에 한가지 데이터로 이루어져 있어서 많이 헤맸다.
찾아보니 서로 다른 결과를 한줄로 합쳐서 보여주는 함수가 있었다.

group_concat( 합칠 컬럼 SEPARETOR '원하는 구분자')

  • select * from test;
typename
fruitapple
fruitbanana
fruitorange
fruitapple
  • select type, group_concat(name) from test group by type;
typename
fruitapple, banana, orange, apple

기본 구분자는 쉼표(,) 이며,
구분자를 변경하고 싶은 경우 SEPARATOR '구분자' 를 쓴다.

  • select type, group_concat(name separator '|') from test group by type;
typename
fruitapple|banana|orange|apple
  • select type, group_concat(distinct name) from test group by type;

중복되는 문자열을 제거 할때는 distinct를 사용한다.

typename
fruitapple, banana, orange
  • select type, group_concat(distinct name order by name) from test group by type;

order by를 이용해 문자열을 정렬 할 수 있다.

typename
fruitapple, banana, orange

출처


(정답)
select cart_id
from (select CART_ID , group_concat(NAME) AS NAME
      from CART_PRODUCTS 
      WHERE NAME IN ('Yogurt' , 'MILK')
      group by CART_ID) a
where name like '%Milk%' and name like '%Yogurt%'
  1. 서브쿼리로 cart_id 별로 name에 'Yogurt' 나 'Milk'가 있는 컬럼을 group_concat으로 데이터를 합친다.
  2. Yogurt와 Milk를 모두 갖고 있는 cart_id를 가져오기.
profile
데이터 애널리스트가 되고 싶은

0개의 댓글