
이번 포스팅에서는 SQL에서 자주 사용되지만 헷갈리기 쉬운 HAVING, JOIN, 서브쿼리(Subquery) 에 대해 정리해보겠습니다 🚀
HAVING은 GROUP BY와 함께 쓰여 그룹 집계 결과에 조건을 거는 역할을 합니다.
📌
WHERE은 개별 행(row)에,HAVING은 그룹(group) 전체에 조건을 겁니다!
SELECT 컬럼명, AGG_FUNC(컬럼)
FROM 테이블명
GROUP BY 컬럼명
HAVING 조건;
orders| order_id | item_name | price | order_date |
|---|---|---|---|
| 201 | Desk Lamp | 350 | 2025-06-01 |
| 202 | Mouse | 45 | 2025-06-02 |
| 203 | Desk Lamp | 360 | 2025-06-03 |
| 204 | Chair | 700 | 2025-06-04 |
| 205 | Monitor | 550 | 2025-06-05 |
| 206 | Chair | 720 | 2025-06-05 |
| 207 | Mouse | 60 | 2025-06-06 |
| 208 | Keyboard | 200 | 2025-06-07 |
각 상품별 총 판매 금액이 500 이상인 경우만 보고 싶어요
SELECT item_name, SUM(price) AS total_sales
FROM orders
GROUP BY item_name
HAVING SUM(price) >= 500;
결과:
| item_name | total_sales |
|---|---|
| Chair | 1420 |
| Desk Lamp | 710 |
| Monitor | 550 |
SQL에서 JOIN은 여러 테이블을 연결해 하나의 결과로 합치는 기능입니다.
서로 관련 있는 데이터를 합칠 때 필수죠!
SELECT ...
FROM A
[INNER | LEFT | RIGHT] JOIN B
ON A.컬럼 = B.컬럼;
| 종류 | 설명 |
|---|---|
INNER JOIN | 양쪽 테이블에 모두 있는 경우만 연결 |
LEFT JOIN | 왼쪽 테이블은 전부, 오른쪽은 일치하는 것만 |
RIGHT JOIN | 오른쪽 테이블은 전부, 왼쪽은 일치하는 것만 |
employees
| emp_id | name | dept_id |
|---|---|---|
| 1 | Alice | 10 |
| 2 | Bob | 20 |
| 3 | Charlie | 30 |
| 4 | Diana | NULL |
departments
| dept_id | dept_name |
|---|---|
| 10 | HR |
| 20 | Sales |
| 40 | IT |
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d
ON e.dept_id = d.dept_id;
| name | dept_name |
|---|---|
| Alice | HR |
| Bob | Sales |
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d
ON e.dept_id = d.dept_id;
| name | dept_name |
|---|---|
| Alice | HR |
| Bob | Sales |
| Charlie | NULL |
| Diana | NULL |
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d
ON e.dept_id = d.dept_id;
| name | dept_name |
|---|---|
| Alice | HR |
| Bob | Sales |
| NULL | IT |
**서브쿼리(Subquery)**는 쿼리 내부에서 또 다른 쿼리를 실행해 결과를 값처럼 사용하는 것입니다.
📌 SELECT절, WHERE절, FROM절 어디에든 들어갈 수 있어요!
SELECT절 안
SELECT 컬럼1, (SELECT 서브쿼리) AS 별칭
FROM 테이블명;
WHERE절 안
SELECT 컬럼
FROM 테이블명
WHERE 컬럼 IN (SELECT 서브쿼리);
FROM절 안 (인라인 뷰)
SELECT *
FROM (
SELECT ... FROM ...
) AS 별칭;
SELECT name,
(SELECT dept_name
FROM departments d
WHERE d.dept_id = e.dept_id) AS department
FROM employees e;
→ 직원별로 부서명을 함께 출력
SELECT name
FROM employees
WHERE dept_id IN (
SELECT dept_id
FROM departments
WHERE dept_name = 'HR'
);
→ 부서가 HR인 직원만 출력
SELECT department, avg_salary
FROM (
SELECT dept_id AS department, AVG(salary) AS avg_salary
FROM employee_salaries
GROUP BY dept_id
) AS dept_avg
WHERE avg_salary > 5000;
→ 평균 월급이 5000 이상인 부서만 출력
| 개념 | 사용 목적 |
|---|---|
| HAVING | 그룹 집계 결과에 조건 걸기 |
| JOIN | 여러 테이블을 하나로 연결 |
| Subquery | 쿼리 안에 쿼리를 넣어 조건/값 처리 |
SQL은 이렇게 조합하는 순간 진가를 발휘합니다!
그럼 다음 포스팅에서 만나요! 👋