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