▶ Query
Single row Sub Query / Multiple Sub Query ⦁ If you need information from more than one table, use Sub Query ⦁ Use Sub Query to add, modify, and delete table data. |
1. Sub Query
1) Concept of Sub Query
Sub Query는 하나의 SELECT문장의 Clause(절) 안에 포함된 또 하나의 SELECT문장이다.
Sub Query를 포함하고 있는 Query를 Main Query라 부른다
2) Notice of Sub Query (유의 사항)
- Sub Query는 비교 연산자(WHERE) 오른쪽에 위치해야 하고 반드시 괄호로 묶어야 한다.
- Sub Query는 Main Query가 실행되기 전에 한번만 실행된다.
- 서브 쿼리에서 SELECT 하지 않은 컬럼은 주 쿼리에서 사용할 수 없다.
- Sub Query안에 Sub Query가 들어갈 수 있다. 조건절에 ( )로 중첩 가능
- 단일 행 Sub Query와 다중 행 Sub Query에 따라 연산자를 잘 선택해야 한다.
- 특별한 경우 (인라인 뷰 등)를 제외하고는 Sub Query에 Order by은 올 수 없다.
3) Query example 01
직원의 이름이 Susan인 직원이 어떤 부서 소속인지 소속 부서명을 알아내자
① 먼저 Susan의 부서명을 알기 위해서 부서번호를 알아야 한다.
SELECT DEPARTMENT_ID
FROM EMPLOYEES WHERE FIRST_NAME='Susan';
|
|
|
DEPARTMENT_ID
|
1
|
40
|
② 부서 번호가 40임을 알아내고 다음과 같이 Query문을 사용한다.
SELECT DEPARTMENT_NAME
FROM DEPARTMENTS WHERE DEPARTMENT_ID = 40;
|
|
|
DEPARTMENT_NAME
|
1 | Human Resources |
③ 부서번호를 알아냈다 그럼이제 Sub Query문을 작성하자
SELECT DEPARTMENT_NAME
FROM DEPARTMENTS
WHERE DEPARTMENT_ID = ( SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE FIRST_NAME='Susan' );
|
|
|
DEPARTMENT_NAME
|
1 | Human Resources |
▷ Query example 02
① EMPLOYEES 테이블에서 Lex와 같은 부서에 있는
모든 사원의 이름과 입사일자(형식: 2003-01-13)를 출력하는 SELECT문을 작성하시오.
SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE FIRST_NAME='Lex';
|
|
|
DEPARTMENT_ID
|
1 | 90 |
② 서브쿼리로 작성하면
SELECT FIRST_NAME, TO_CHAR(HIRE_DATE, 'YYYY-MM-DD') AS HIRE_DATE, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE FIRST_NAME='Lex';
|
|||
|
FIRST_NAME
|
HIRE_DATE
|
DEPARTMENT_ID
|
1 | Steven | 2003-06-17 | 90 |
2 | Neena | 2005-09-21 | 90 |
3 | Lex | 2001-01-13 | 90 |
▷ Query example 03
EMPLYOEES 테이블에서 CEO에게 보고하는 직원의 모든 정보를 출력하는 SELECT문을 작성하시오
① 상사의 매니저 번호가 없는 사원의 번호=CEO
SELECT EMPLOYEE_ID
FROM EMPLOYEES WHERE MANAGER_ID IS NULL; |
|
|
EMPLOYEE_ID
|
1 | 100 |
② 상사번호 없는 사원의 번호=상사의 번호 -> 사원의 Sub Query출력
SELECT *
FROM EMPLOYEES WHERE MANAGER_ID=( SELECT EMPLOYEE_ID FROM EMPLOYEES WHERE MANAGER_ID IS NULL); |
|
![]() |
1-2. 단일 행 Sub Query
1) Concept of 단일 행 서브 쿼리
단일 행 Sub Query(Single Row)는 내부 SELECT으로부터 오직 하나의 로우(행, row)만을 반환 받으며
단일 행 비교 연산자(=, >, >=, <, <=, <>)를 사용한다.
2) Concept of 단일 행 서브 쿼리 example 01
Guy와 같은 부서에서 근무하는 사원의 정보를 출력하는 예
① 서브클래스) 부서번호가 30 -> 부서번호가 30번인 사원들을 찾으면 됨
SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE FIRST_NAME='Guy'; |
|
DEPARTMENT_ID | |
1 | 30 |
② Sub Query를 이용해 Guy와 같은 부서에서 근무하는 사원의 정보를 출력
SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID,SALARY, NVL(COMMISSION_PCT,0) COMMISSION_PCT,
TO_CHAR(HIRE_DATE, 'YYYY.MM.DD') HIRE_DATE FROM EMPLOYEES WHERE DEPARTMENT_ID=( SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE FIRST_NAME='Guy' ); |
![]() |
3) 서브 쿼리에서 그룹 함수의 사용 example 01
서브 쿼리를 사용하여 평균 급여보다 더 많은 급여를 받는 사원을 검색하는 쿼리
SELECT AVG(SALARY)
FROM EMPLOYEES;
|
|
AVG(SALARY) | |
1 | 6461.83177570093457.... |
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > ( SELECT AVG(SALARY)
FROM EMPLOYEES );
|
|
![]() |
1-3. 다중 행 Sub Query
1) Concept of 다중 행 Sub Query
다중 행 Sub Query는 Sub Query에서 반환되는 결과가 하나 이상의 행일 때 사용한다.
다중 행 Sub Query는 반드시 아래와 같은 다중 행 연산자( )와 함께 사용해야 한다
종류
|
의 미
|
IN
|
메인 쿼리의 비교 조건('=' 연산자로 비교할 경우)이 서브 쿼리의 결과 중에서 하나라도 일치하면 참
|
ANY
|
메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참
|
ALL
|
메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참
|
EXIST
|
메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참
|
SELECT 컬럼명,(Sub Query) FROM 테이블명 SELECT 컬럼명 FROM (Sub Query) SELECT 컬럼명 FROM 테이블명 WHERE (Sub Query) |
2) 서브 쿼리로 테이블 복사하기
3) 서브 쿼리를 이용한 데이터 추가
서브 쿼리를 사용하여 INSERT 문장을 작성하며, VALUES 절은 사용하지 않는다.
VALUES 절에 기술하는 자료를 서브 쿼리에서 얻어올 것이다. 단, 서브 쿼리의 값 개수와 INSERT할 테이블의 열 수가 일치해야 한다.
4) 서브 쿼리를 이용한 데이터 수정
10번 부서의 지역번호을 40번 부서의 지역번호으로 변경하기 위해서 서브 쿼리을 사용한 예
5) 서브 쿼리를 이용한 두 개 이상의 칼럼에 대한 값 변경
서브 쿼리를 사용한 UPDATE 형식 2가지
6) 서브 쿼리를 이용한 데이터 삭제
예제로 사용할 테이블을 생성한다.
'DB > SQL' 카테고리의 다른 글
시퀀스 (0) | 2022.04.03 |
---|---|
VIEW (0) | 2022.04.03 |
JOIN (0) | 2022.04.03 |
무결성 제약 조건 * (0) | 2022.04.03 |
DML 테이블에 내용을 추가 • 수정 • 삭제 (0) | 2022.04.03 |