MySQL 중급 문법: HAVING, INNER/OUTER JOIN, 서브쿼리

하하호호훈이·2025년 5월 18일

SQL(MySQL) MUST KNOW

목록 보기
9/23
post-thumbnail

이번 포스팅에서는 SQL에서 자주 사용되지만 헷갈리기 쉬운 HAVING, JOIN, 서브쿼리(Subquery) 에 대해 정리해보겠습니다 🚀


1. HAVING – 그룹 조건을 거는 법

HAVINGGROUP BY와 함께 쓰여 그룹 집계 결과에 조건을 거는 역할을 합니다.

📌 WHERE은 개별 행(row)에, HAVING은 그룹(group) 전체에 조건을 겁니다!

1. 기본 문법

SELECT 컬럼명, AGG_FUNC(컬럼)
FROM 테이블명
GROUP BY 컬럼명
HAVING 조건;

2. 예시

✅ 예시 테이블: orders

order_iditem_namepriceorder_date
201Desk Lamp3502025-06-01
202Mouse452025-06-02
203Desk Lamp3602025-06-03
204Chair7002025-06-04
205Monitor5502025-06-05
206Chair7202025-06-05
207Mouse602025-06-06
208Keyboard2002025-06-07

💡 문제

각 상품별 총 판매 금액이 500 이상인 경우만 보고 싶어요

SELECT item_name, SUM(price) AS total_sales
FROM orders
GROUP BY item_name
HAVING SUM(price) >= 500;

결과:

item_nametotal_sales
Chair1420
Desk Lamp710
Monitor550

2. JOIN – 테이블을 연결하는 법

SQL에서 JOIN여러 테이블을 연결해 하나의 결과로 합치는 기능입니다.
서로 관련 있는 데이터를 합칠 때 필수죠!

🔧 기본 문법

SELECT ...
FROM A
[INNER | LEFT | RIGHT] JOIN B
ON A.컬럼 = B.컬럼;

💡 예시

🔧 종류 요약

종류설명
INNER JOIN양쪽 테이블에 모두 있는 경우만 연결
LEFT JOIN왼쪽 테이블은 전부, 오른쪽은 일치하는 것만
RIGHT JOIN오른쪽 테이블은 전부, 왼쪽은 일치하는 것만

✅ 예시 테이블

employees

emp_idnamedept_id
1Alice10
2Bob20
3Charlie30
4DianaNULL

departments

dept_iddept_name
10HR
20Sales
40IT

💡 1) INNER JOIN: 공통된 값만 연결

SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d
ON e.dept_id = d.dept_id;
namedept_name
AliceHR
BobSales

💡 2) LEFT JOIN: 왼쪽 기준, 오른쪽은 NULL 가능

SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d
ON e.dept_id = d.dept_id;
namedept_name
AliceHR
BobSales
CharlieNULL
DianaNULL

💡 3) RIGHT JOIN: 오른쪽 기준, 왼쪽이 NULL 가능

SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d
ON e.dept_id = d.dept_id;
namedept_name
AliceHR
BobSales
NULLIT

3. 서브쿼리 – 쿼리 안의 쿼리

**서브쿼리(Subquery)**는 쿼리 내부에서 또 다른 쿼리를 실행해 결과를 값처럼 사용하는 것입니다.

📌 SELECT절, WHERE절, FROM절 어디에든 들어갈 수 있어요!

🔧 기본 문법

  • SELECT절 안

    SELECT 컬럼1, (SELECT 서브쿼리) AS 별칭
    FROM 테이블명;
  • WHERE절 안

    SELECT 컬럼
    FROM 테이블명
    WHERE 컬럼 IN (SELECT 서브쿼리);
  • FROM절 안 (인라인 뷰)

    SELECT *
    FROM (
      SELECT ... FROM ...
    ) AS 별칭;

💡 예시

💡 1) SELECT 안에 서브쿼리

SELECT name,
  (SELECT dept_name
   FROM departments d
   WHERE d.dept_id = e.dept_id) AS department
FROM employees e;

→ 직원별로 부서명을 함께 출력


💡 2) WHERE 안에 서브쿼리

SELECT name
FROM employees
WHERE dept_id IN (
  SELECT dept_id
  FROM departments
  WHERE dept_name = 'HR'
);

→ 부서가 HR인 직원만 출력


💡 3) FROM 안에 서브쿼리 (인라인 뷰)

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은 이렇게 조합하는 순간 진가를 발휘합니다!

그럼 다음 포스팅에서 만나요! 👋

profile
AI, Data Science/Analysis 리뷰용가리지용 😆

0개의 댓글