DML(Data Manipulation Language)은 DB에 데이터를
조회, 삽입, 수정, 삭제하는 작업을 수행하는 구문으로,
크게 SELECT, INSERT, UPDATE, DELETE 4가지로 나뉜다.
(TABLE을 조작하는 언어)
DB에 데이터를 조회하는데 사용되며 SELECT 구문은 다음과 같다.
-- SELECT 구문
SELECT 컬럼명 -- FROM TABLE의 조회하고 싶은 컬럼명
FROM 테이블명 -- 데이터를 조회하고 싶은 TABLE명
WHERE 조건 -- 조회하고 싶은 데이터의 조건
GROUP BY 컬럼명 -- 특정 컬럼을 기준으로 데이터를 그룹화(주로 그룹함수와 사용)
HAVING 그룹함수 -- 그룹화된 데이터에 대한 조건
ORDER BY 컬럼명 -- 정렬하고 싶은 컬럼명
🙄 WHERE
이랑 HAVING
의 차이점은 뭐야?
😎 그룹화된 데이터의 유무이며, 유사한 역할을 한다.
하지만 WHERE
절은 그룹화 이전에 필터링을 수행하고,
HAVING 절은 그룹화 이후에 조건을 적용한다.
SELECT문 실행순서
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
-- EMPLOYEE 테이블 전체 조회
SELECT *
FROM EMPLOYEE;
-- 산술연산 가능
SELECT 10 + 10
FROM DUAL;
-- 별칭
SELECT EMP_NAME AS 사원이름, EMP_NO AS "사원 번호"
FROM EMPLOYEE;
-- 리터럴
SELECT SALARY AS 월급, '원' AS 단위
FROM EMPLOYEE;
-- DISTINCT
-- 중복값을 한번씩만 표시 (SELECT절에 1회만 가능)
SELECT DISTICT 컬럼명
FROM 테이블명;
SELECT DISTINCT EMP_NAME AS 사원이름
FROM EMPLOYEE;
-- WHERE
SELECT 컬럼명
FROM 테이블명
WHERE 조회하고 싶은 데이터의 조건
-- 이름이 '핑구'인 직원 찾기
SELECT EMP_NAME AS 사원이름
FROM EMPLOYEE
WHERE EMP_NAME = '핑구';
-- 이름이 '핑구'이며 월급이 3,000,000원 이상인 사원 찾기
-- AND | OR
SELECT *
FROM EMPLOYEE
WHERE EMP_NAME = '핑구' AND SALARY >= 3000000;
-- 이름이 '핑구'이거나 '펭구'인 사원 찾기
WHERE EMP_NAME = '핑구' OR EMP_NAME = '펭구';
-- LIKE & NOT LIKE
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 LIKE 리터럴;
-- % : 포함된 문자 조회
-- _ : _ 개수만큼 문자 조회
SELECT EMP_NAME AS 사원이름
FROM EMPLOYEE
WHERE EMP_NAME LIKE '핑%'; -- 핑씨 사원
WHERE EMP_NAME LIKE '%핑%'; -- 핑이 포함된 이름
WHERE EMP_NAME LIKE '핑_'; -- 핑씨 외자
WHERE EMP_NAME LIKE '_핑_'; -- 가운데 핑이들어간 3글자 이름
-- 🙄 %, _ 둘 다 사용할 때는??
-- 😎 ESCAPE문을 쓰면 된다.
-- ESCAPE
SELECT EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '__|_%' ESCAPE '|';
-- IS NULL & IS NOT NULL
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 IS NULL || IS NOT NULL
SELECT *
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL; -- 매니저가 없는 직원 조회
-- IN
-- OR 연산자를 많이 쓸 때
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 IN (리터럴, 리터럴 . . .);
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE IN ('D6', 'D7'); -- 부서코드가 D6, D7인 직원
-- BETWEEN AND
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 BETWEEN 최소범위 AND 최대범위;
SELECT *
FROM EMPLOYEE
-- 월급이 2,000,000원 ~ 4,000,000원인 사원
WHERE SALARY BETWEEN 2000000 AND 4000000;
TABLE에 새로운 행을 삽입하는 명령어
-- INSERT
INSERT INTO 테이블명 VALUES(컬럼대입 값, 컬럼대입 값...)
-- 테이블 생성
CREATE TABLE TEST(
NAME VARCHAR2(15),
AGE NUMBER
);
-- TEST 테이블에 행(ROW) 삽입
INSERT INTO TEST VALUES('핑구펭구', 5);
-- 특정컬럼에 값을 대입
INSERT INTO 테이블명(특정컬럼...) VALUES(컬럼대입 값, ...)
INSERT INTO TEST(NAME) VALUES('뽀로로');
이 때 지정된 컬럼 수와 VALUES()의 컬럼 수, 데이터 타입이 같아야한다.
지정되지 않은 컬럼의 값은 NULL이 대입
SUBQUERY를 통해 TABLE에 조건을 걸어 행을 삽입할 수 있다.
-- SUBQUERY 사용
INSERT INTO 테이블명 (SUBQUERY)
-- 테이블 생성
CREATE TABLE TEST AS SELECT ANIMAL_NAME, ANIMAL_AGE, ZOOKEEPER_NAME
FROM ANIMAL JOIN ZOOKEEPER ON ANIMAL_CODE = ZOOKEEPER_ID
WHERE 0 = 1; -- FALSE를 통해 값을 가져오지 않는다.
-- SUBQUERY를 통해 행(ROW) 삽입
-- 나이가 10살 이상인 동물이름, 나이, 사육사이름 삽입
INSERT INTO TEST (
SELECT ANIMAL_NAME, ANIMAL_AGE, ZOOKEEPER_NAME
FROM ANIMAL
JOIN ZOOKEEPER ON ANIMAL_CODE = ZOOKEEPER_ID
WHERE ANIMAL_AGE >= 10);
위와 똑같이 지정된 컬럼 수와 SUBQUERY 컬럼 수와 타입이 같아야한다.
하나의 TABLE로 여러 TABLE의 값을 삽입할 수 있다.
-- INSERT ALL
INSERT ALL
INTO 테이블명 VALUES(컬럼대입 값, 컬럼대입 값 . . .)
INTO 테이블명 VALUES(컬럼대입 값, 컬럼대입 값 . . .)
SELECT 컬럼명, 컬럼명 . . .
FROM 테이블명;
-- 테이블 생성
CREATE TABLE ANIMAL_TYPE_TB
AS SELECT ANIMAL_NAME, ANIMAL_AGE, ANIMAL_TYPE FROM ANIMAL
WHERE 0 = 1;
CREATE TABLE ANIMAL_CODE_TB
AS SELECT ANIMAL_NAME, ANIMAL_AGE, ANIMAL_CODE FROM ANIMAL
WHERE 0 = 1;
-- ANIMAL_TYPE_TB랑 ANIMAL_CODE_TB에 데이터 한번에 삽입
INSERT ALL
INTO ANIMAL_TYPE_TB VALUES(ANIMAL_NAME, ANIMAL_AGE, ANIMAL_TYPE)
INTO ANIMAL_CODE_TB VALUES(ANIMAL_NAME, ANIMAL_AGE, ANIMAL_CODE)
SELECT ANIMAL_NAME, ANIMAL_AGE, ANIMAL_TYPE, ANIMAL_CODE
FROM ANIMAL;
TABLE에 있는 데이터를 수정하는 명령어
WHERE
절을 이용해 특정 데이터를 수정할 수 있다.
INSERT INTO TEST VALUES('핑구', 150);
-- UPDATE
UPDATE 테이블명
SET 열1 = 값1, 열2 = 값2, ...
WHERE 조건식;
UPDATE TEST
SET AGE = 5
WHERE NAME = '핑구'
만약
WHERE
을 사용하지 않으면 전체 ROW를 수정한다.
따라서WHERE
은 필수 👍
TABLE에 있는 행(ROW)을 삭제하는 명령어
WHERE
절을 이용해 특정 ROW를 삭제할 수 있다.
INSERT INTO TEST VALUES('펭구', 200);
-- DELETE
DELETE FROM 테이블명
WHERE 조건식;
DELETE FROM TEST
WHERE NAME = '펭구';
만약
WHERE
을 사용하지 않으면 전체 ROW를 삭제한다.
이 때,ROLLBACK
을 통해COMMIT
하기전으로 되돌릴 수 있다.
TABLE의 전체 행(ROW)을 삭제할 때 사용하는 명령어
DELETE
보다 수행 속도가 빠르지만 ROLLBACK
을 통해 복구 불가능
TRUNCATE TABLE 테이블명;