Day38 :) 서브쿼리

Nux·2021년 10월 29일
0

자바웹개발

목록 보기
39/105
post-thumbnail

서브쿼리

select 컬럼
from 테이블
where 조건 연산자 (select 컬럼
		 from 테이블
         	 where 조건);
  • 메인쿼리 내부에 정의된 쿼리
  • 서브쿼리가 먼저 실행되고 이후 메인쿼리가 실행됨
- 작성 위치에 따른 기능

select 단순값
from 가상테이블
where 조건식

사용 예

employee_id 100번과 같은 부서에서 일하는 사람의 정보 조회
  • 서브쿼리를 사용하지 않았을 때
-- 100번 사원이 일하는 부서 조회
select first_name, department_id
from employees
where employee_id = '100';
-- 100번 사원의 부서번호는 10으로 가정
-- 그 부서 소속 사람 조회
select employee_id, first_name
from employees
where department_id = '10';
  • 서브쿼리를 사용했을 때
select employee_id, first_name
from employees
where department_id = (select department_id
			from employees
			where employee_id = '100');

서브쿼리의 종류

단일행 서브쿼리

  • 서브쿼리 수행 시 하나의 행만 반환

다중행 서브쿼리

SELECT column, column, ... 
FROM table1
WHERE column 연산자 (select column
		    from table2);
  • 서브쿼리 수행 시 여러 행 반환

다중컬럼 서브쿼리

 select column, column, ....
 from table1 
 where (columnA, columnB) 관계연산자 (select columnA, columnB 
                               from table2)
  • column순서를 맞게 작성해야 함

having절 서브쿼리

select column
from table1
group by column
having 그룹함수 연산자 (select column
                      from table)
  • having절에 사용하는 서브쿼리

상호연관 서브쿼리

select outer.column1, outer.column2, ...
from table1 outer
where column 연산자 (select column1
                    from table2
                    where column = outer.column3);
  • 서브쿼리가 메인쿼리를 참조하는 것
  • 바깥 쿼리로 실행되는 모든 행을 조회함
  • 성능이 나쁘므로 사용시 유의
select first_name, position, salary
from employee e1
where salary >= (select avg(salary)
				 from employee e2
                 where e1.employee_id = e2.employee_id)

with절

with
이름1 as ( select 반복구문 ),
이름2 as ( select 반복구문2)
select 컬럼
from 테이블;
  • 원하는 테이블(보통 반복되는 구문)을 가상테이블로 저장
  • 단독으로 사용 불가하며 수행할 sql문이 함께 와야함
  • 중첩하여 사용 가능
WITH
TEST AS (SELECT a.employee_id, b.first_name
	 FROM a,b),
TEST2 AS (SELECT a.manager_id, c.salary
	 FROM a,c)
SELECT *
FROM TEST, TEST2
WHERE TEST.employee_id = TEST2.manager_id;

0개의 댓글