서브쿼리 (이중SQL)
이번 글에서는 서브 쿼리에 대해서 정리해보려고한다.
서브쿼리?
- 서브쿼리란 하나의 SQL문 안에 작성되어있는 또 다른 SQL문을 말한다.
- 보통 (select * from member) 와 같이 괄호 안에 작성되어 있으며
끝나고는 세미콜론을 붙히지 않는다. - 실행 순서는 서브쿼리 → 메인쿼리 순으로 진행된다.
이러한 서브 쿼리는 지금까지 배운 DML (SELECT, INSERT, UPDATE, DELETE)에 모두 적용시킬 수 있다.
어떻게 사용할 수 있는지 하나씩 사용해보면서 간단히 알아보자.
기준이 될 테이블이다.
SELECT
- 가장 기본적인 SELECT의 서브 쿼리를 만들어보자.
select * from member where id in (select id from student);
- 결과 값은 다음과 같다.
- 새로운 내용은 없지만 where 절에 조건이 될 데이터에 쿼리문을 넣게된다.
- 쿼리문의 결과가 조건 데이터가 되는 것이다.
- 참고로
select id from student;
의 결과는 참고로 아래와 같다.
- 결과적으로는
select * from member where id in (1, 3, 5);
가 쿼리문이 되는 것이다. - 마치 결과는 전에 배운 Inner join의 값을 살짝 변경하면 얻을 수 있다.
select mem.* from member mem inner join student st on mem.id = st.id;
- 여기서 생각해보면 조인과 서브쿼리는 같은 결과 값을 낼 수 있는데
과연 어떤 걸 사용해야지 좋은 결과를 낼 수 있을까?
⇒ 이 부분에 대해서는 따로 글을 작성해보겠다.
INSERT
- 이번에는 INSERT 문에서 서브 쿼리를 이용하는 방법이다.
insert into student select id, name from member where id = 7;
- 위와 같이 Insert를 할 때 select를 사용하여 조회한 값을 가지고 데이터를 집어넣을 수 있다.
Values
형태를 사용하지 않고 데이터를 그대로 집어넣는 것을 볼 수 있다.- 물론 where 구절에서도 이중쿼리를 사용할 수 있다.
UPDATE
update
member as mem,
(select id from student where student_name = "BB") as stu
set mem.id = stu.id
where
mem.id = 4;
- update 문에서는 테이블을 정의하는 공간에서 student의 id 값을 조회하고,
이를 통해서 mem.id의 값을 stu.id의 값으로 변경하도록 작성할 수 있다. - 데이터가 얼마 없어서 생각보다 초라하지만 많은 데이터를 변경해야 한다면 유용할 것 같다.
- 이곳에서도 물론 where 구절에서도 이중쿼리를 사용할 수 있다.
DELETE
delete from member where id = (select id from student where student_name = "no_tel");
- delete 문도 위에서 활용했던 where 구절을 통한 delete를 이용할 수 있다.
위에서는 주로 단일 행 혹은 다중 행 서브 쿼리를 이용하였는데,
이외에도 여러가지 서브쿼리 종류(활용법)들이 존재한다.
그 종류들에 대해서도 한 번 살펴보자.
종류(활용법)
- 단일 행 서브쿼리
- 서브 쿼리의 결과 건수가 1건 이하일 때를 뜻한다.
- WHERE 에서 비교 연산자 (=, <, > ...)를 사용할 때 주로 사용된다.
- 당연히 비교 연산자를 사용하기에 건수가 여러개가 나오면 오류가 발생한다.
select * from member where id = (select id from student where student_name = "BB");
- 다중 행 서브쿼리
- 서브 쿼리의 결과 건수가 2건이상 반환 될 때를 뜻한다.
- 다중 행 비교 연산자 (IN, ALL, ANY, EXISTS) 를 사용할 때 사용된다.
- IN - 서브쿼리의 결과에 존재하는 동일한 값을 출력
select * from member where id in (select id from student);`
- ALL - 서브쿼리의 결과에 존재하는 모든 값이 만족하는 여부를 확인
select * from member where id = all (select id from student);
- ANY - 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 여부를 확인
select * from member where id = any (select id from student);
- EXISTS - 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인
select * from member where exists (select id from student where name ="BB");
- IN - 서브쿼리의 결과에 존재하는 동일한 값을 출력
- 다중 컬럼 서브 쿼리
- 서브쿼리 결과로 여러 개의 컬럼이 반환되어 조건들이 동시에 비교된다.
select * from member where (id, name) in (select id, student_name from student);
- 연관 서브쿼리
- 서브쿼리 내에 메인쿼리의 컬럼이 사용된 쿼리이다.
select * from member m1 where id in (select id from student s1 where s1.id = m1.id);
- 스칼라 서브쿼리
- SELECT 문에서 SELECT 절에 사용되는 서브쿼리이다.
select m.id, (select id from student s where s.id = 1) from member m;
- 한 행, 한 컬럼만을 반환하며, 위처럼 결과 값이 들어가는 것을 볼 수 있다.
- 인라인 뷰
- From 절에서 사용하게되며, 동적으로 생성된 테이블이라고 생각하면된다.
select t1.id from member t1, (select student_name from student s) t2 where t1.name = t2.student_name;
이렇게 서브 쿼리를 사용하는 방법들에 대해서 간단히 알아보았다.
SELECT, INSERT, UPDATE, DELETE 부터 해서 스칼라 서브쿼리, 인라인 뷰 까지...
그냥 아무생각없이 사용했었는데 몰랐던 사용법도 있었고 이름이 붙어있었다는 것도 처음 알았다.
알면 알수록 새로운게 나오는 것 같다.
참고 -
'오늘의 공부 > DB, SQL' 카테고리의 다른 글
[SQL] DML - DELETE (0) | 2022.03.23 |
---|---|
[SQL] DML - UPDATE (0) | 2022.03.20 |
[SQL] SELECT - JOIN (0) | 2022.03.20 |
[SQL] DML - SELECT (0) | 2022.03.20 |
[SQL] DB와 SQL (0) | 2022.03.20 |