Back-End/Oracle

Oracle ■ DML SELECT (4)-서브쿼리

SIKIDA 2024. 7. 17. 21:18
728x90

 

 

 DML 

 

• 서브쿼리

SQL 쿼리 안에 포함된 또 다른 쿼리

 

• 서브쿼리 예시

Donald 라는 직원과 같은 부서에 있는 직원 이름 조회할 때 기본적인

코드는 아래와 같이 2번에 걸쳐 SELECT를 사용해야 함

 

 

• 서브쿼리 예시

서브쿼리를 사용할 경우 한번의 쿼리로 조회 가능

 

 

• 설명

1. 서브쿼리가 실행

2. Donald가 속한 부서의 ID를 찾음

3. 찾은 결과(50)을 DEPARTMENT_ID = 50 으로 대입되어 조건식 생성

4. 메인 쿼리의 SELECT 실행

 

 DML (단일행 서브쿼리)

 

• 단일행 서브쿼리

결과값의 데이터(행)가 1개인 서브 쿼리로써 단일행 비교 연산자와 사용할 수 있음

* 단일행 비교 연산자 : =, <, <=, >=, >, !=

 

• 설명

1. 서브쿼리가 실행

2. DEPARTMENT_ID가 30인 직원들의 평균 월급을 반환

3. 찾은 평균 연봉값이 SALARY >= 조건식에 대입되어 조건식 생성

4. 메인 쿼리의 SELECT 실행

 

 

• 단일행 서브쿼리 사용해보기 (1)

가장 높은 월급을 받는 직원의 이름 조회

 

 

• 단일행 서브쿼리 사용해보기 (2)

직원의 가장 많은 부서 이름 조회

 

• 단일행 서브쿼리 사용해보기 (3)

가장 낮은 LOCATION_ID를 가진 도시 조회

 

 

• 단일행 서브쿼리 사용해보기 (4)

가장 높은 보너스를 받는 직원의 이름 조회

 

 

 DML (다중행 서브쿼리)

 

• 다중행 서브쿼리

결과값의 데이터(행)가 여러 개인 서브 쿼리로써 다중행 비교 연산자와 사용할 수 있음

* 다중행 비교 연산자 : IN, ALL, ANY, …

 

• 설명

1. 서브쿼리가 실행

2. 부서별 가장 낮은 월급 출력

3. 찾은 결과여러개를 IN에 의해 하나씩 대입하여 조건에 만족하는 데이터 조회

4. 메인 쿼리의 SELECT 실행

 

 

• 설명

결과값이 IN(2100, 4400, 6000, 6500, 10000, …) 처럼 완성되므로 EMPLOYEES

테이블의 SALARY가 해당 값들이 존재하는 컬럼들의 데이터를 조회함

 

 

• 다중행 서브쿼리 사용해보기 (1)

ALL 연산자는 앞에 비교 연산자(>, <, >=, <=)가 붙으며 모두 일치해야 TRUE가 됨

 

 

• 다중행 서브쿼리 사용해보기 (2)

ANY 연산자는 해당하는 값 중 하나라도 일치하면 TRUE를 반환함

 

 

 DML (다중열 서브쿼리) 

 

• 다중열 서브쿼리

결과값의 컬럼이 여러 개인 서브 쿼리. 단, 데이터(행)은 반드시 하나여야 하며 단일행 비교 연산자와 사용할 수 있음

* 단일행 비교 연산자 : =, <, <=, >=, >, !=

 

 

• 설명

1. 서브쿼리가 실행

2. Bruce 직원의 부서 번호와 월급 조회

3. 찾은 결과들을 각각의 컬럼에 대입하여 조건식 확인

4. 메인 쿼리의 SELECT 실행

 

• 설명

WHERE (컬럼1, 컬럼2) = (값1, 값2) 와 같이 대입되어 조건식을 계산함

 

 

• 다중열 서브쿼리 사용해보기 (1)

이메일이 SBELL인 직원과 사수번호, 부서번호가 같은 직원들의 이름 조회하기

 

• 다중열 서브쿼리 사용해보기 (2)

핸드폰 번호가 650.507.9811인 직원과 같은 부서, 직무를 가지는 직원 조회

 

 

 DML (다중열,다중행 서브쿼리) 

 

• 다중열, 다중행 서브쿼리

결과값의 컬럼과 데이터(행)가 여러 개인 서브 쿼리. 다중행 비교 연산자와 사용할 수 있음

 

• 설명

WHERE (컬럼1, 컬럼2) IN (값1, 값2) 와 같이 대입되어 조건식을 계산함

• 다중열, 다중행 서브쿼리 사용해보기 (1)

부서번호가 50번 이면서 이름이 S로 시작하는 직원들의 이름과 연봉 조회하기

 

• 다중열, 다중행 서브쿼리 사용해보기 (2)

부서별 가장 많은 월급을 받는 직원들의 이름, 부서번호, 월급 조회하기

 

 DML (인라인 뷰) 

• 인라인 뷰

메인쿼리의 FROM에 서브 쿼리를 사용하며, 수행한 결과가 테이블 대신 사용됨

단, 서브쿼리에서 조회한 컬럼들을 기준으로만 메인 쿼리에서 조회할 수 있음

 

 

• 인라인 뷰 서브쿼리 사용해보기 (1)

부서별 가장 많은 월급을 받는 직원 조회하기

 

• 인라인 뷰 서브쿼리 사용해보기 (2)

이름이 K로 시작하고 월급을 5000 이상 받는 직원 조회하기

 

• 인라인 뷰를 사용하는 이유

1. 인라인 뷰를 사용할때는 되도록 조건식을 메인쿼리에 두는것이 좋음 인라인 뷰에서는

필요한 일부 데이터만을 불러오고, 그 데이터에서 조건식을 따지면

성능이 좋아짐 (전체 데이터에서 하나씩 비교해가며 조건식을 보는것보다 빠름)

2. 인라인 뷰를 사용할 때 별칭을 사용하여 쿼리의 가독성을 높일 수도 있음

3. TOP-N 쿼리를 사용하기 위해서 주로 사용됨

* TOP-N 쿼리 : 상위 N개의 데이터를 추출하는 쿼리

 

• 참고 1,2번으로 변경된 인라인 뷰

이름이 K로 시작하고 월급을 5000 이상 받는 직원 조회하기

 

 

• 인라인 뷰 서브쿼리 사용해보기 (3)

인라인뷰로 각 부서별 월급의 합계, 평균, 인원수를 구하고 조회하기

 

 

 

• TOP-N 쿼리

상위 N개의 데이터를 추출하기 위한 쿼리

ex) 직원중 급여가 가장 높은 상위 3명, 입사한지 가장 오래된 직원 상위 5명, …

 

• 종류

1. ROWNUM

-> 오라클에서 사용되며, WHERE에서 행의 개수를 제한함

-> 단, ROWNUM으로 TOP-N 쿼리를 만들기 위해서는 인라인뷰 사용 필요

2. ROW LIMITING  ANSI 표준 문법

-> 그동안 실습에서 자주 사용했던 ‘FETCH FIRST 5 ROWS ONLY‘

-> 실습에서 사용한 것 외에도 행의 개수를 제한하는 옵션들이 있음

3. 기타

 

• ROWNUM 사용해보기 (1)

월급이 높은 직원 3명 조회하기

인라인뷰에서 정렬 후 ROWNUM <= 3을 통해 3번째 행보다 낮거나 같은 데이터만 출력

 

• 참고

메인쿼리 컬럼에 ROWNUM을 작성하여 몇번째 행인지 컬럼을 추가하여 데이터를 조회할 수 있음

 

• ROWNUM 사용해보기 (2)

 

 

오늘은 오라클 DML SELECT문 서브쿼리에 대해 공부를 진행하였다! 세미 프로젝트때 쉴틈없이 했던거지만 더욱더 공부해 까먹지않고 익숙해져야겠다 그럼 20000!! 곧 파이널 프로젝트에 들어가는데 과정 및 여러가지 이슈 등등을 업로드할 예정이다 진짜로 그럼 20000@!@!

'Back-End > Oracle' 카테고리의 다른 글

Oracle ■ CREATE  (0) 2024.07.25
Oracle ■ DML INSERT, UPDATE, DELETE  (5) 2024.07.24
Oracle ■ DML SELECT(3)-집합 연산자,조인  (0) 2024.07.17
Oracle ■ DML SELECT(2)-그룹쿼리  (0) 2024.07.15
Oracle ■ DML SELECT(1)  (0) 2024.07.10