웹개발/SQL(mySQL)

MySQL SubQuery 활용

bergerac 2025. 6. 18. 09:11

서브쿼리란?

**서브쿼리(subquery)**는 "쿼리 안에 또 다른 쿼리"가 포함된 구조를 말한다. 흔히 **중첩 쿼리(nested query)**라고도 부르며, **메인 쿼리(main query)**의 실행을 위해 필요한 데이터를 동적으로 제공해준다.

쉽게 말해, 내가 원하는 데이터를 뽑아내기 위해 먼저 어떤 값을 계산하고 그걸 바탕으로 다음 조건을 판단하는 방식이다.

 

서브쿼리의 특징

  1. SELECT, FROM, WHERE, HAVING 등 거의 모든 구문에 삽입할 수 있다.
  2. 서브쿼리는 단일 값, 하나의 행, 또는 여러 행을 반환할 수 있다.
  3. 반드시 괄호 ()로 감싸야 하며, **별칭(alias)**이 필요한 경우 AS 별칭을 붙인다.
  4. 독립 실행은 가능하지만, 메인 쿼리와 의미상 연결되어야 한다.

기본 구조와 사용 위치

-- WHERE 절에서 사용
SELECT * FROM table
WHERE column = (SELECT ...);

-- FROM 절에서 사용 (인라인 뷰)
SELECT * FROM (SELECT ... ) AS sub;

-- SELECT 절에서 사용
SELECT (SELECT MAX(column) FROM table) AS max_value;

 

서브쿼리 실전 예제

1. Where절에서 조건 비교로 활용

ex. 가장 많은 포인트를 보유한 회원의 이름과 포인트는?

SELECT name, points
FROM members
WHERE points = (SELECT MAX(points) FROM members);

 

  • 서브쿼리: SELECT MAX(points) FROM members → 최고 포인트 값(예: 600)을 반환
  • 메인쿼리: 해당 포인트와 일치하는 회원을 검색

2. NOT IN 또는 IN 구문에 사용

ex. 'Bronze' 등급이 아닌 회원의 이름과 등급을 조회

(1) 일반 WHERE 조건

SELECT name, grade
FROM members
WHERE grade != 'bronze';

 

(2) 서브쿼리 활용

SELECT name, grade
FROM members
WHERE grade NOT IN (
	SELECT grade
	FROM members
	WHERE grade = 'bronze'
);

장점: 나중에 bronze 외의 등급이 여러 개로 복잡해져도 유연하게 대처 가능

 

3. FROM 절에서 인라인 뷰로 활용 가능

ex. 포인트가 존재하는 회원들을 기준으로 등급별 평균 포인트를 구하자

SELECT grade, AVG(points) AS avg_points
FROM (
	SELECT grade, points
	FROM members
	WHERE points IS NOT NULL
) AS member_points
GROUP BY grade;

 

  • FROM 절에 들어가는 서브쿼리를 인라인 뷰라고 부른다.
  • 서브쿼리에 별칭(AS member_points)은 필수!

4. SELECT 절 안에서 집계 계산

ex. 전체 회원수와 'Gold'등급인 회원수를 함께 출력

SELECT 
	(SELECT COUNT(*) FROM members) AS total_members,
	(SELECT COUNT(*) FROM members WHERE grade = 'gold') AS gold_members;

 

SELECT 절에서 두 개의 서브쿼리를 병렬적으로 사용해 동시에 여러 계산 결과를 조회

 

5. 서브쿼리와 그룹함수(having)의 조합

ex. 평균 포인트가 200이상인 지역만 조회

SELECT area_code, AVG(points) AS avg_points
FROM members
GROUP BY area_code
HAVING AVG(points) > 200;

HAVING 절에서는 서브쿼리가 직접 쓰이지 않았지만, 집계 결과를 기반으로 필터링한다는 점에서 논리 흐름이 유사하다.

 

서브쿼리 vs 조인(Join)

같은 데이터를 추출할 때 서브쿼리와 조인 중 어느 쪽을 써야 할까?

  • 서브쿼리: 읽기 쉽고, 특정 조건에 따라 독립적으로 계산된 값을 사용할 때 유리
  • 조인: 여러 테이블의 데이터를 연결하여 사용할 때 더 효율적
-- 예: 특정 테이블의 다른 조건을 기준으로 데이터를 가져와야 하는 경우
SELECT a.name, b.grade
FROM users a
JOIN user_grades b ON a.id = b.user_id;

 

-- 서브쿼리 , 언제 어떻게 써야 할까?

 

  • 단일 값이 필요한 경우: =, !=, >, < 등 비교 연산자와 함께 사용
  • 다중 행 비교: IN, NOT IN, ANY, ALL 키워드와 함께 사용
  • 집계 계산이 필요한 경우: MAX(), AVG() 등과 함께 서브쿼리로 전처리
  • 조건 분리와 가독성 확보: 복잡한 조건을 논리적으로 나눌 때 유용

 

'웹개발 > SQL(mySQL)' 카테고리의 다른 글

MySQL에서 변수 사용하기  (1) 2025.06.20
MySQL - JOIN 이해하기  (0) 2025.06.19
MySQL SELECT 문 사용방법  (0) 2025.06.17
MySQL DML 문법 (INSERT, UPDATE, DELETE)  (0) 2025.06.16
MySQL 제약조건(Constraints)  (4) 2025.06.15