| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Model
- Java
- @ResponseBody
- application.properties
- @Valid
- c:if
- @
- @RequestMapping
- 의존주입
- MVC
- SpringBoot
- 스프링
- @RequestParam
- 어노테이션
- 바인딩변수
- springmvc
- jointpoint
- .xml
- spring
- frontController
- PointCut
- 생성자주입
- 비즈니스레이어
- AOP
- 서비스레이어
- produces
- 유효성검사
- after-throwing
- springjdbc
- gradle
- Today
- Total
메모장
04-2 서브쿼리 본문
서브쿼리의 특징
- 반드시 소괄로로 감싸 사용한다.
- 주 쿼리를 실행하기 전에 1번만 실행된다.
- 비교 연산자에 서브쿼리를 사용하는 경우 서브 쿼리를 오른쪽에 기술 해야 한다.
- 내부에는 정렬 구문인 ORDER BY문을 사용할 수 없다.
WHERE문에 서브쿼리 사용하기
서브 쿼리 중에서도 WHERE문에 사용하는 서브쿼리를 중첩 서브 쿼리 라고 부른다. 중첩서브쿼리는 SELECT문을 사용한 결과를 주 쿼리의 조건값으로 사용한다. 서브쿼리를 비교연산자와 함께 사용할 땐 반드시 서브쿼리의 반환결과가 1건 이하여야 한다. 2건 이상이면 다중 행 연산자 사용
다중 행 연산자
- IN : 서브쿼리의 결과에 존재하는 임의의 값과 같은 조건 검색
- ANY : 서브쿼리의 결과에 존재하느 어느 하나의 값이라도 만족하는 조건 검색
- EXISTS : 서브 쿼리의 결과를 만족하는 값이 존재하는지 여부 확인
- ALL : 서브 쿼리의 결과에 존재하는 모든 값을 만족하는 조건 검색
단일 행 서브쿼리
WHERE문에 사용한 서브쿼리가 한 행을 반환해 최종으로 1건의 데이터만 검색하는 쿼리이다.
SELECT * FROM nasdaq_company
WHERE symbol = (SELECT symbol FROM nasdaq_company WHERE symbol IN ('MSFT')
다중 행 서브 쿼리
IN 문 , NOT IN 문
출처 입력
- IN 문
쿼리 형태를 보면 WHERE절에 IN문의 소괄호가 서브쿼리를 안고 있다.
SELECT * FROM nasdaq_company WHERE symbol IN (SELECT symbol FROM nasdaq_company
WHERE symbol IN ('MSFT','AMD', 'AMZN'))
서브쿼리에서 검색된 3개의 행이 메인 쿼리의 조건으로 사용된 것을 알 수 있다.
3개의 테이블을 사용해 조인하는 쿼리를 IN 문 서브쿼리를 사용해 변경한것, WHERE문에 사용한 서브쿼리 안에서 2개의 테이블을 조인한 결과 행을 IN문에 적용했다.
-- 3개 테이블 조인
SELECT a.industry, c.symbol, c.company_name, c.ipo_year, c.sector FROM industry_group AS a
INNER JOIN industry_group_symbol AS b ON a.num = b.num
INNER JOIN nasdaq_company AS c ON b.symbol = c.symbol
WHERE a.industry = N'자동차' ORDER BY symbol
-- IN문 서브 쿼리
SELECT * FROM nasdaq_company
WHERE symbol IN (SELECT symbol FROM industry_group AS a
INNER JOIN industry_group_symbol AS b ON a.num = b.num
WHERE a.industry = N'자동차' )
- NOT IN
-- NOT IN 문 서브쿼리
SELECT * FROM nasdaq_company
WHERE symbol NOT IN (SELECT symbol FROM industry_group AS a
INNER JOIN industry_group_symbol AS b ON a.num = b.num
WHERE a.industry = N'자동차' )
ANY 문
서브 쿼리 결과에서 값이 하나라도 만족하는 조건을 검색한다.
언뜻 보면 비교 연산자가 잘못 쓰인듯 보일 수 있지만, ANY문을 함께 사용했으므로 서브쿼리 의 결괏값이 여러 개여도 일치하는 모든 행을 주 쿼리에서 검색해 반환할 수 있다.
다중 행 서브쿼리 : =ANY로 같은 값 반환
SELECT * FROM nasdaq_company
WHERE symbol = ANY(SELECT symbol FROM nasdaq_company WHERE symbol IN ('MSFT', 'AND', 'AMZN'))
다중 행 서브쿼리 : <ANY로 최솟값 반환
SELECT * FROM nasdaq_company
WHERE symbol < ANY(SELECT symbol FROM nasdaq_company WHERE symbol IN ('MSFT', 'LTCH', 'ZY'))
다중 행 서브쿼리 : >ANY로 최댓값 반환
SELECT * FROM nasdaq_company
WHERE symbol > ANY(SELECT symbol FROM nasdaq_company WHERE symbol IN ('MSFT', 'LTCH', 'ZY'))
EXISTS문, NOT EXISTS 문
다중 행 서브쿼리: EXISTS 문의 결괏값이 TRUE 일때
SELECT * FROM nasdaq_company
WHERE EXISTS(SELECT symbol FROM nasdaq_company WHERE symbol IN ('MSFT', 'AMD', 'AMZN'))
다중 행 서브쿼리: EXISTS 문의 결괏값이 FALSE 일때
SELECT * FROM nasdaq_company
WHERE EXISTS(SELECT symbol FROM nasdaq_company WHERE symbol IN ('123', '456', '789'))
다중 행 서브쿼리: NOT EXISTS 문의 결괏값이 TRUE 일때
SELECT * FROM nasdaq_company
WHERE NOT EXISTS(SELECT symbol FROM nasdaq_company WHERE symbol IN ('123', '456', '789'))
ALL 문
다중 행 서브쿼리: ALL 문 사용
SELECT * FROM nasdaq_company
WHERE symbol = ALL(SELECT symbol FROM nasdaq_company WHERE symbol IN ('MSFT', 'AMD', 'AMZN'))
FROM 문에 서브쿼리 사용하기
FROM 문에 사용하는 서브쿼리의 기본 형식
SELECT [열 이름] FROM [테이블] AS a
INNER JOIN (SELECT [열] FROM [테이블] WHERE [열] = [값]) AS b ON [a.열] = [b.열]
WHERE [열] = [값]
SELECT 문에 서브 쿼리 사용하기
SELECT문에 사용하는 서브 쿼리는 반드시 1개의 행을 반환 해야 하므로 SUM, COUNT,MIN, MAX등의 집계함수와 함께 사용하는 경우가 많다. 하지만 이렇게 하면 성능 문제가 생기기 쉬우므로 SELECT 문에서는 서브쿼리를 집계함수와 함께 사용하지 않는게 좋다.
SELECT문에 사용된 서브쿼리는 스칼라 서브 쿼리 라고 부르며, 스칼라 서브 쿼리는 1개 이상 사용할 수 있다.
스칼라 서브 쿼리의 기본 형식
SELECT [열 이름],
(SELECT <집계함수> [열 이름] FROM [테이블 2]
WHERE [테이블 2.열] = [테이블 1.열]) as Alias
FROM [테이블 1]
WHERE [조건]
'DB > [SQL 입문]' 카테고리의 다른 글
| 05-1 문자열 함수 (0) | 2024.04.11 |
|---|---|
| 04-3 공통 테이블 식 (0) | 2024.04.11 |
| 04-1 조인 (0) | 2024.04.11 |
| 03-7 SQL Server에서 다루는 자료형 정리하기 (0) | 2024.04.11 |
| 03-6 테이블 생성하고 데이터 조작하기 (0) | 2024.04.11 |