학습 기록/DataBase

23.05.15 / DataBase / DML

SooHw 2023. 5. 15. 12:49

DML

데이터 조작어 -> 데이터에 변형을 가함

INSERT, UPDATE, DELETE, , ,

 

INSERT

테이블에 새로운 데이터를 튜플(행) 단위로 입력

 

오류문장 확인!

 

 

UPDATE 

테이블에 저장된 데이터를 변경

UPDATE 직원 
   SET 직업ID = 'JAVA'
 WHERE 직원ID = 4;

* WHERE로 조건 안걸어주면 모든 행의 ID가 JAVA로 바

 

DELETE 

테이블의 데이터 삭제

DELETE FROM 직원
WHERE 직원ID = 1;

 

서브쿼리

* 이름이 Shelli인 직원보다 급여가 낮은 직원들 출력

  SELECT FIRST_NAME, SALARY
    FROM EMPLOYEES
   WHERE SALARY < (SELECT SALARY
                FROM EMPLOYEES
                WHERE FIRST_NAME = 'Shelli')
ORDER BY SALARY DESC;

 

단일행 서브쿼리

- 결과가 단 하나의 행으로 나오는 서브쿼리

- 출력 결과가 하나이므로 단일행 연산자(>, >=, =, , ,)를 사용해 비교

 

* Nancy보다 빨리 입사한 사원의 이름과 입사일 조회

  SELECT FIRST_NAME, HIRE_DATE
    FROM EMPLOYEES
   WHERE HIRE_DATE <= (SELECT HIRE_DATE
                    FROM EMPLOYEES
                    WHERE FIRST_NAME = 'Nancy')
ORDER BY HIRE_DATE DESC;

 

다중행 서브쿼리

- 결과가 여러개의 행으로 나오는 서브쿼리

- 다중행 연산자 (IN, ANY/SOME, ALL, EXISTS)를 사용해 비교

 

IN 

- 메인쿼리의 데이터가 서브쿼리의 결과 중에서 하나라도 일치하면 WHERE이 TRUE

* 부서별 최고 급여와 같은 급여를 받는 직원 출력

  SELECT FIRST_NAME, SALARY
    FROM EMPLOYEES
   WHERE SALARY IN (SELECT MAX(SALARY)
                 FROM EMPLOYEES
                 GROUP BY DEPARTMENT_ID)
ORDER BY SALARY;

 

ANY, SOME

- 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 TRUE 반환

- ANY, SOME에 등가연산자(=)를 사용하면 IN과 같은 기능

  SELECT FIRST_NAME, SALARY
    FROM EMPLOYEES
   WHERE SALARY = ANY (SELECT MAX(SALARY)
                    FROM EMPLOYEES
                    GROUP BY DEPARTMENT_ID)
ORDER BY SALARY;

 

ALL

- 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 '전부' TRUE여야 TRUE로 반환

  SELECT FIRST_NAME, SALARY
    FROM EMPLOYEES
   WHERE SALARY >= ALL (SELECT MAX(SALARY)
                          FROM EMPLOYEES
                      GROUP BY DEPARTMENT_ID)
ORDER BY SALARY;

 

 

다중열 서브쿼리

컬럼이 여러개로 나오는 서브쿼리, 비교대상과 1:1대응해야함

* 각 부서별 최고연봉을 받는 직원 출력

  SELECT FIRST_NAME, DEPARTMENT_ID, SALARY
    FROM EMPLOYEES
   WHERE (DEPARTMENT_ID, SALARY) IN (SELECT DEPARTMENT_ID, MAX(SALARY)
                                       FROM EMPLOYEES
                                   GROUP BY DEPARTMENT_ID)
ORDER BY DEPARTMENT_ID;

 

FROM절 서브쿼리 (인라인뷰)

FROM절에서 가상테이블처럼 사용하는 서브쿼리, INNER JOIN과 유사

* 각 부서별 최고연봉을 받는 직원 출력 (JOIN조건 1. 부서 이름 동일 2.부서의 최고연봉이 직원의 급여와 동일

  SELECT FIRST_NAME, DMAX.DEPARTMENT_ID, DMAX."부서별 최고급여"
    FROM EMPLOYEES E,
         (SELECT DEPARTMENT_ID, MAX(SALARY) AS "부서별 최고급여"
            FROM EMPLOYEES
        GROUP BY DEPARTMENT_ID) DMAX
   WHERE E.DEPARTMENT_ID = DMAX.DEPARTMENT_ID
     AND E.SALARY = DMAX."부서별 최고급여"
ORDER BY DEPARTMENT_ID;

 

SELECT절 서브쿼(스칼라 서브쿼리)

SELECT절에서 사용하는 서브쿼리, 결과값이 1개만 나와야함

 

 

스칼라 서브쿼리 (SELECT절에 사용)

*직원의 부서이름 출력

  SELECT FIRST_NAME, SALARY, DEPARTMENT_ID,
                  (SELECT DEPARTMENT_NAME
                     FROM DEPARTMENTS
                    WHERE DEPARTMENT_ID = E.DEPARTMENT_ID) AS 부서이름
    FROM EMPLOYEES E 
ORDER BY DEPARTMENT_ID;

'학습 기록 > DataBase' 카테고리의 다른 글

DataBase 연습문제  (0) 2023.05.29
23.05.16 / DataBase / TCL, DCL  (0) 2023.05.29
23.05.10 / DataBase / DML  (0) 2023.05.10
23.05.09 / DataBase / ORDER BY, JOIN  (0) 2023.05.09
23.05.08 / DataBase / GROUP BY, HAVING  (0) 2023.05.08