서브 쿼리
쿼리 내부에 포함된 select 쿼리를 서브 쿼리(Sub Query)라 부른다. select 쿼리에 들어가는 서브 쿼리 종류에는 인라인 뷰, 스칼라 서브쿼리, 중첩 서브쿼리가 있다. 이때 서브 쿼리를 포함한 select 쿼리를 메인 쿼리라 하며 서브 쿼리가 실행 된 후 메인 쿼리가 실행된다.
1. 인라인 뷰
- from 절에 들어가는 서브 쿼리
- 서브 쿼리의 조회 결과를 테이블 처럼 사용할 때 씀
- alias 지정 필수
select *
from (
select l.common, l.col_l, r.col_r
from table_l l
left join table_r r
#on table_l.common = table_r.common;
using(common)
union
select r.common, l.col_l, r.col_r
from table_l l
right join table_r r
using(common)
) as A
where common % 2 = 0
2. 스칼라 서브 쿼리
- select 절에 들어가는 서브 쿼리
- 메인 쿼리 select 절에 서브 쿼리의 조회 결과를 넣을 때 사용
- 서브 쿼리의 동작 결과는 무조건 하나의 행이어야함
#반환값은 하나여야함!
select continent, name, gnp,
(select avg(gnp) from country) as '전세계 평균',
(select avg(gnp) from country where continent=c.continent) as '대륙별 평균'
from country c;
3. 중첩 서브 쿼리
3-1 단일행 서브 쿼리
- 서브 쿼리의 조회 결과는 1개 행
- where [컬럼명] [비교연산자] (서브 쿼리)
3-2 다중행 서브 쿼리
- 서브 쿼리 조회 결과는 n개 행
- where [컬럼명] [다중행 비교 연산자] (서브 쿼리)
비교 연산자는 <, >, = 등을 말하며 다중행 비교 연산자는 아래와 같다. 가급적 = 연산자를 안쓰는게 좋다. IN만 써도 똑같은 의미이기 때문이다. 아래의 부속 질의문은 서브 쿼리를 뜻한다.
-- 적립금이 가장 많은 고객의 고객이름과 적립금을 출력 --
SELECT 고객이름, 적립금
FROM 고객
WHERE 적립금 = (SELECT MAX(적립금) FROM 고객);
select 쿼리 이외에 들어가는 서브 쿼리
서브 쿼리는 select 쿼리 내부에만 들어가는 것이 아니라 create, insert, update, delete 쿼리 내부에도 들어 갈 수 있다.
1. create
create table [테이블명]
[as]
(select 쿼리)
2. insert
INSERT INTO 목표 테이블 (열1, 열2, ...)
SELECT 값1, 값2, ...
FROM 테이블
WHERE 조건;
3. 데이터 수정/삭제 시, 조건식으로 활용
delete from [테이블명] where [컬럼] [비교연산자] (서브쿼리)
4. 데이터 수정 시, 수정할 값을 서브 쿼리로 줌
# 단일행 서브 쿼리 사용해야함
update [테이블명] set 컬럼1 = (
select *
from (
select 컬럼 from [테이블명]
as a
)
where [조건절]
'Computer Science > DataBase' 카테고리의 다른 글
정규화 (0) | 2024.10.06 |
---|---|
MySQL Join (0) | 2023.11.16 |
[데이터베이스 - 9] 병행 제어 (0) | 2022.10.14 |
[데이터베이스 - 8] 장애와 회복 (0) | 2022.10.12 |
[데이터베이스 - 7] 트랜잭션 (0) | 2022.10.11 |