프로그래머스_SQL_JOIN에서 ON, WHERE, HAVING 정리.

HEE·2025년 3월 11일
0

프로그래머스 SQL

목록 보기
4/13
post-thumbnail

프로그래머스 SQL 고득점 KIT 내 IS NULL 문제

Level 2. ROOT 아이템 구하기.

ROOT 아이템을 찾아 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME)을 출력하는 SQL문을 작성해 주세요. 이때, 결과는 아이템 ID를 기준으로 오름차순 정렬해 주세요.

MY SQL

SELECT I.ITEM_ID, I.ITEM_NAME
FROM ITEM_INFO I
INNER JOIN ITEM_TREE T ON I.ITEM_ID = T.ITEM_ID
WHERE T.PARENT_ITEM_ID IS NULL
ORDER BY I.ITEM_ID ASC;

JOIN에서 ON 의 사용

JOIN에서 ON은 두 테이블간의 관계를 나타내야한다.

다른 JOIN 조건들은 WHERE절에서 필터링해야함.

JOIN에서 WHERE과 HAVING의 차이

  1. WHERE
  • 개별행 필터링. (개별 행에 대한 조건을 평가)
  • GROUP BY 전에 실행.
  • GROUP BY 없이 사용 가능.
  • 서브쿼리 없이 WHERE절 집계함수 (SUM AVG MAX 등) 사용 못함 - 그룹 내 데이터를 하나의 결과로 축약하는 것이기 때문에!
  • JOIN이 없어도 WHERE절에서는 집계함수 사용 못함.

오류.

SELECT * 
FROM employees 
WHERE salary = MAX(salary);
  1. 서브쿼리 사용하기.
SELECT * 
FROM employees 
WHERE salary = (SELECT MAX(salary) FROM employees);
  1. HAVING절 사용하기.
SELECT department, MAX(salary) 
FROM employees 
GROUP BY department 
HAVING MAX(salary) > 5000;
  • WHERE + 단순조건 [= > <] 가능
  • WHERE + 단일행 서브쿼리 [집계함수 = > <] 가능

  • WHERE + 다중행 서브쿼리 [집계함수 = > <] 오류
SELECT * FROM products WHERE price = (SELECT price FROM products WHERE category = 'Electronics');

오류 - price = (SELECT ~) 구문이 다중행 반환할 가능성이 있는데 =를 사용함.


  • WHERE + 다중행 서브쿼리 IN 사용시 [집계함수 = > <] 가능
SELECT * FROM products WHERE price IN (SELECT price FROM products WHERE category = 'Electronics');

가능 - IN 연산자는 = 와 같은 단일행 연산자가 아니라 다중값을 비교 가능한 연산자라서 다중행 서브쿼리와 사용 가능.


  1. HAVING
  • 그룹 필터링.
  • GROUP BY 이후 실행.
  • GROUP BY 가 꼭 필요함.
  • 집계함수 (AVG SUM MAX 등) 사용 가능.
  • 단일행 연산자 (= < > 등) 사용 가능.

단일행 필터링 - WHERE
그룹별 필터링 - HAVING

profile
ALL IS WELL

0개의 댓글