Category/빅데이터&파이썬

SQL 코딩테스트 정리

sumin 2023. 1. 29. 16:12
728x90
반응형

 

SQL 코딩테스트를 연습하며 헷갈렸던 부분들을 정리

했다. 이후에 공부한 내용은 지속적으로 추가할 예정이다.

 

1. SQL에서 조건문을 담당하는 쿼리인 HAVING과 WHERE의 차이

 

select는 from 뒤에 위치

having은 group by 뒤에 위치

하지만 where은 모든 필드를 조건에 둘 수 있고, having은 그룹화 되어진 새로운 테이블에 조건을 줄 수 있다.

SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(*)>1 AND NAME IS NOT NULL
ORDER BY NAME

이와 같은 문제에서는 NAME으로 그룹화 한 뒤, HAVING을 사용한 예제이다.

 

2. COUNT와 SUM의 차이

 

SUM > 해당 컬럼의 데이터 수치의 합.
COUNT > 해당컬럼 검색된 조건의 개수

SELECT B.CATEGORY , SUM(BS.SALES) as TOTAL_SALES
FROM BOOK as B , BOOK_SALES as BS
WHERE B.BOOK_ID = BS.BOOK_ID and BS.SALES_DATE LIKE '2022-01%'
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY ASC

해당 문제는 카테고리 별 도서 판매량을 합산하는 문제였다. SALES 컬럼의 데이터 수치의 합을 구하는 것이

SELECT A.PRODUCT_CODE , SUM(A.PRICE*B.SALES_AMOUNT) AS SALES
FROM PRODUCT A 
    join OFFLINE_SALE B
    ON A.PRODUCT_ID = B.PRODUCT_ID
GROUP BY A.PRODUCT_CODE
ORDER BY SALES DESC , PRODUCT_CODE ASC

므로 COUNT가 아닌 SUM을 사용해야 한다.

 

3. GROUP BY에 여러 개의 COLUMN을 적용

 

GROUP BY에는 여러 컬럼을 넣어줄 수 있다. 

예를 들어서, 성별이라는 컬럼이 있고, 지역이라는 컬럼이 있다면 성별과 지역 모두를 사용해 그룹 연산을 할 수 있다.

GROUP BY 성별, 지역 이라고 했을 때에, 경기도 여성 / 경기도 남성 / 서울 여성 / 서울 남성 이런 식으로 성별과 지역을 이용해 만들 수 있는 모든 경우의 수로 그룹을 만들수 있게 된다.

 

4. JOIN의 적용

SELECT A.PRODUCT_CODE , SUM(A.PRICE*B.SALES_AMOUNT) AS SALES
FROM PRODUCT A ,OFFLINE_SALE B
WHERE A.PRODUCT_ID = B.PRODUCT_ID
GROUP BY A.PRODUCT_CODE
ORDER BY SALES DESC , PRODUCT_CODE ASC

이전에는 두 개의 테이블을 사용할 때, WHERE을 이용해 연결시켜줬다.

SELECT A.PRODUCT_CODE , SUM(A.PRICE*B.SALES_AMOUNT) AS SALES
FROM PRODUCT A 
    JOIN OFFLINE_SALE B
    ON A.PRODUCT_ID = B.PRODUCT_ID
GROUP BY A.PRODUCT_CODE
ORDER BY SALES DESC , PRODUCT_CODE ASC

지금은 JOIN을 이용하는 방법을 연습하고 있는데, 아래처럼 종류가 굉장히 다양한 것 같다. 이 부분은 좀 더 공부가 필요하다.

 

4. LEFT JOIN

SELECT O.ANIMAL_ID , O.NAME
FROM ANIMAL_OUTS AS O
     LEFT JOIN ANIMAL_INS AS A
     ON O.ANIMAL_ID = A.ANIMAL_ID
WHERE A.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID

LEFT JOIN을 해당 코드로 설명하면, ANIMAL_OUTS 테이블의 내용은 그대로 있고 ANIMAL_INS 테이블과 겹치는 부분의 내용을 추출하는것이다. 그리고 ANIMAL_OUTS 테이블의 내용과 일치되지 않는 구문은 NULL 값을 반환한다.

 

728x90
반응형