본문 바로가기

DB

1004 DB - SubQuery 서브 쿼리

728x90
반응형

Contents

     

     

    서브 쿼리


    서브 쿼리(Subquery)란 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문을 말한다. 

    서브 쿼리는 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계이다.

     

     

     

    쿼리 구문을 보조하는 쿼리구문

     
    SELECT employee_id, last_name, salary  --메인쿼리 시작--
    FROM employees
    WHERE salary > (    --서브쿼리 시작--
        SELECT salary
        FROM employees
        WHERE last_name = 'Abel'
    );

    안쪽에 있는 서브 쿼리가 실행의 우선순위가 높다.

    서브 쿼리가 돌려주는 데이터 타입, 행의 수, 컬럼의 수를 확인하고 작성한다.

    서브쿼리가 돌려주는 데이터 타입, 컬럼의 수는 SELECT절에서 행의 수는 WHERE절에서 정해진다

     

     

     

    Abel의 급여는 11000이므로 아래 구문의 실행결과는 아래의 결과와 동일하다.

    SELECT employee_id, last_name, salary
    FROM employees
    WHERE salary > 11000;

     

     

     

    연산 가능한 데이터타입, 칼럼수, 행 숫자 인경우 서브 쿼리의 구성은 상관없다.

    SELECT last_name, job_id, salary
    FROM employees
    WHERE salary =
    (SELECT MIN(salary) FROM employees);
    LAST_NAME|JOB_ID  |SALARY|
    
    ---------+--------+------+
    
    Olson    |ST_CLERK|  2100|

     

     

    서브 쿼리가 들어갈 수 있는 위치의 제한은 특별히 없다.

    서브쿼리가 들어갈 수 있는 위치는 리터럴 값이 들어갈 수 있는 위치면 대부분 사용 가능하다.

    50번 부서 사원들의 최소 급여 값보다 더 많은 최소 급여를 받는 부서의 번호와 최소 급여 값을 출력하는 구문

     

    SELECT department_id, MIN(salary)
    FROM employees
    GROUP BY department_id
    HAVING MIN(salary) > (
        SELECT MIN(salary)
        FROM employees
        WHERE department_id = 50
    );
    DEPARTMENT_ID|MIN(SALARY)|
    -------------+-----------+
               40|       6500|
              110|       8300|
               90|      17000|
               30|       2500|
               70|      10000|
                 |       7000|
               10|       4400|
               20|       6000|
               60|       4200|
              100|       6900|
               80|       6100|

     

     

     

     

    문제


    사원의 last_name 칼럼의 값에 'u'가 포함된 사원과 동일한 부서에 근무하는 모든 사원의 employee_id, last_name칼럼을 출력하는 구문을 작성하시오. 

     

     
    SELECT employee_id, last_name, department_id
    FROM employees
    WHERE department_id IN (
    	SELECT department_id
    	FROM employees
    	WHERE last_name LIKE '%u%'
    );

     

     

     

     

    Inline View 

    - From 절에 SubQuery가 작성된 경우 

     

     

     

    데이터 조작어 (DML/Data Manipulation Language)


    테이블의 데이터를 조작하는 데 사용되는 문법

     

    INSERT   :  새로운 데이터를 삽입

    UPDATE :  기존 데이터를 갱신

    DELETE  :  기존 데이터를 삭제

    MERGE    : 데이터를 합치는 문법

     

     

    INSERT 구문

    테이블에 새로운 데이터를 추가하는 문법

     

    키워드

    INSERT INTO : 값을 입력할 테이블과 칼럼을 

    VALUES           : 해당 칼럼에 입력될 값을 지정하는 절

     

     

    값을 입력받을 칼럼의 데이터 타입과 입력값의 데이터 타입은 일치해야 한다.

    INSERT INTO절의 칼럼 목록의 순서와 VALUES절의 값들의 순서는 일치해야 한다.

     
    INSERT INTO departments (department_id, department_name, manager_id, location_id)
    VALUES (280, 'Go Home', 100, 1700);

     

     
    SELECT * FROM departments;
    DEPARTMENT_ID|DEPARTMENT_NAME     |MANAGER_ID|LOCATION_ID|
    
    -------------+--------------------+----------+-----------+
    
    …
    
              240|Government Sales    |          |       1700|
    
              250|Retail Sales        |          |       1700|
    
              260|Recruiting          |          |       1700|
    
              270|Payroll             |          |       1700|
    
              280|Go Home             |       100|       1700|

     

     

    특정 컬럼만 선택하여 값 입력하기

    명시한 컬럼에는 정상적으로 값이 입력 됨.

    명시하지 않은 컬럼에는 경우에 따라서 NULL값도 들어갈 수 있다.

     
    INSERT INTO departments (department_id, department_name)
    VALUES (290, 'Nap');
     
    SELECT * FROM departments;
    DEPARTMENT_ID|DEPARTMENT_NAME     |MANAGER_ID|LOCATION_ID|
    
    -------------+--------------------+----------+-----------+
    
    …
    
              260|Recruiting          |          |       1700|
    
              270|Payroll             |          |       1700|
    
              280|Go Home             |       100|       1700|
    
              290|Nap                 |          |           |

     

    728x90
    반응형

    'DB' 카테고리의 다른 글

    1011 DB - 트랜잭션 Transaction  (1) 2022.10.11
    1011 DB - 서브 쿼리를 통한 행 입력  (1) 2022.10.11
    1004 JSP - (MVC) 커넥션 풀 (DBCP), boardList  (1) 2022.10.04
    0928 DB - JOIN  (1) 2022.09.28
    0928 DB - Having 절  (0) 2022.09.28