쿼리로 데이터를 가져오는 조건을 만듭니다. 그 안에 또 조건을 부여한 쿼리를 넣어줄 수 있습니다. 이때 쿼리 안에 있는 쿼리를 서브 쿼리라고 부릅니다. 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');
'데이터 분석 및 업무 자동화' 카테고리의 다른 글
Power BI DAX TOPN 함수 사용하여 시군구별 대장 아파트 가격 비교 하기 (0) | 2022.04.22 |
---|---|
Power BI DAX Patterns 동적 제목 설정하는 방법 (CONCATENATEX) (0) | 2022.04.14 |
MySQL 여러 테이블 한번에 다루는 방법 (UNION, UNION ALL) (0) | 2022.04.12 |
Power BI DAX patterns - YoY, QoQ, MoM 구하기 (0) | 2022.04.08 |
Power BI EARLIER 함수 사용하여 그룹별 순위 구하기 (0) | 2022.04.06 |
댓글