본문 바로가기
데이터 분석 및 업무 자동화

MySQL 조건에 조건을 더하는 서브 쿼리 알아보기

by 공부머리 2022. 4. 13.
반응형

쿼리로 데이터를 가져오는 조건을 만듭니다. 그 안에 또 조건을 부여한 쿼리를 넣어줄 수 있습니다. 이때 쿼리 안에 있는 쿼리를 서브 쿼리라고 부릅니다. GROUP BY를 제외한 SELECT, FROM, WHERE, HAVING, ORDER BY에 서브 쿼리 적용이 가능합니다.

 

서브 쿼리 특징

  • 하나의 쿼리 내 포함된 또 하나의 쿼리를 의미합니다.
  • 서브 쿼리는 반드시 괄호 안에 있어야 합니다.
  • SELECT, FROM , WHERE, HAVING, ORDER BY 절에 사용 가능합니다.
  • INSERT, UPDATE, DELETE 문에도 사용 가능합니다.
  • 서브 쿼리에는 ; (세미 콜론)을 붙이지 않아도 됩니다.

 

SELECT 절의 서브 쿼리

 

SELECT 절의 서브 쿼리 특징

  • 스칼라 서브쿼리라고도 합니다.
  • SELECT절의 서브 쿼리는 반드시 결괏값이 하나의 값 이어야 합니다.

 

SELECT 절 서브 쿼리 문법

서브 쿼리는 괄호로 감싸서 원하는 쿼리를 작성합니다.

SELECT [컬럼 이름],
	(SELECT [컬럼 이름]
    FROM [테이블 이름]
    WHERE 조건식)
FROM [테이블 이름]
WHERE 조건식;

 

SELECT 절 서브 쿼리 예제

SELECT절의 서브 쿼리는 반드시 결과 값이 하나의 값이어야 합니다. 아래 코드는 mypokemon 테이블에서 이름이 pikachu인 number열과 name열을 가져오고 ability 테이블에서 number가 25인 height값을 가져와서 열 이름을 height로 표기해 주도록 동작합니다.

SELECT number, name,
	(SELECT height FROM ability WHERE number = 25) AS height
FROM mypokemon
WHERE name = 'pikachu';

 

 

FROM 절의 서브 쿼리

FROM 절의 서브 쿼리 특징

  • 인라인 뷰 서브쿼리라고도 합니다.
  • FROM절의 서브 쿼리는 반드시 결괏값이 하나의 테이블이어야 합니다.
  • 서브 쿼리로 만든 테이블은 반드시 별명을 가져야 합니다.

 

FROM 절 서브 쿼리 문법

서브 쿼리는 괄호로 감싸서 원하는 쿼리를 작성합니다.

SELECT [컬럼 이름],
FROM (SELECT [컬럼 이름]
    FROM [테이블 이름]
    WHERE 조건식) AS [테이블 별명]
WHERE 조건식;

 

FROM 절 서브 쿼리 예제

키 순위가 3순위인 포켓몬의 번호와 키 순위를 가져오는 예제입니다. FROM절의 서브 쿼리는 반드시 별명을 가져야 한다는 룰도 적용되었습니다.

SELECT number, height_rank
FROM (SELECT number, rank() OVER(ORDER BY height DESC) AS height_rank FROM ability) AS A
WHERE height_rank = 3;

 

WHERE 절의 서브 쿼리

WHERE 절의 서브 쿼리 특징

  • 중첩 서브쿼리라고도 합니다.
  • WHERE 절의 서브 쿼리는 반드시 결괏값이 하나의 컬럼 이어야 합니다. (EXISTS 제외) 하나의 컬럼에는 여러 개의 값이 존재할 수 있습니다.
  • 연산자와 함께 사용합니다. 보통 WHERE [컬럼 이름] [연산자] [서브 쿼리] 형식으로 사용합니다.

 

WHERE 절 서브 쿼리 문법

서브 쿼리는 괄호로 감싸서 원하는 쿼리를 작성합니다.

SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE [컬럼 이름] [연산자] (SELECT [컬럼 이름]
                    FROM [테이블 이름]
                    WHERE 조건식);

 

WHERE 절 서브 쿼리에 사용하는 주요 연산자

주요 연산자 사용시, WHERE절의 서브 쿼리는 반드시 결괏값이 하나의 컬럼이어야 합니다. 단, EXIST는 단독으로 사용하며, 결괏값이 여러 컬럼이어도 됩니다.

연산자 활용 의미
IN A IN([서브 쿼리]) A가 [서브 쿼리]의 결과값 내에 있다.
ALL A < ALL([서브 쿼리]) A가 모든 [서브 쿼리]의 결과값보다 작다
A > ALL([서브 쿼리]) A가 모든 [서브 쿼리]의 결과값보다 크다
ANY A < ANY([서브 쿼리]) A가 모든 [서브 쿼리]의 결과값보다 하나라도 작다
A > ANY([서브 쿼리]) A가 모든 [서브 쿼리]의 결과값보다 하나라도 크다
EXISTS EXISTS([서브 쿼리]) [서브 쿼리]의 결과값이 존재한다
NOT EXISTS([서브 쿼리]) [서브 쿼리]의 결과값이 존재하지 않는다

 

WHERE 절 서브 쿼리 예제

키가 평균 키보다 작은 포켓몬의 번호를 가져오는 예제입니다.

SELECT number
FROM ability
WHERE height < (SELECT AVG(height) FROM ability);

공격력이 모든 전기 포켓몬의 공격력보다 작은 포켓몬의 번호를 가져오는 예제입니다.

SELECT number
FROM ability
WHERE attack < ALL(SELECT attack FROM ability WHERE type='electric');

방어력이 모든 전기 포켓몬의 공격력보다 하나라도 큰 포켓몬의 번호를 가져오는 예제입니다.

SELECT number
FROM ability
WHERE attack > ANY(SELECT attack FROM ability WHERE type='electric');

bug 타입 포켓몬이 있다면 모든 포켓몬의 번호를 가져오는 예제입니다.

SELECT number
FROM ability
WHERE EXISTS (SELECT * FROM ability WHERE type='bug');

 

반응형

댓글