ORACLE(DML)

동제동이·2023년 4월 9일
0

ORACLE

목록 보기
3/3
post-thumbnail

DML(Data Manipulation Language)은 DB에 데이터를
조회, 삽입, 수정, 삭제하는 작업을 수행하는 구문으로,
크게 SELECT, INSERT, UPDATE, DELETE 4가지로 나뉜다.
(TABLE을 조작하는 언어)

SELECT

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

SELECT 키워드

-- 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 키워드

-- 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;


INSERT

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이 대입

INSERT(SUBQUERY)

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 컬럼 수와 타입이 같아야한다.

INSERT ALL

하나의 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;

UPDATE

TABLE에 있는 데이터를 수정하는 명령어
WHERE절을 이용해 특정 데이터를 수정할 수 있다.

INSERT INTO TEST VALUES('핑구', 150);

-- UPDATE
UPDATE 테이블명
SET1 =1,2 =2, ...
WHERE 조건식;

UPDATE TEST 
SET AGE = 5
WHERE NAME = '핑구'

만약 WHERE을 사용하지 않으면 전체 ROW를 수정한다.
따라서 WHERE은 필수 👍


DELETE

TABLE에 있는 행(ROW)을 삭제하는 명령어
WHERE절을 이용해 특정 ROW를 삭제할 수 있다.

INSERT INTO TEST VALUES('펭구', 200);

-- DELETE
DELETE FROM 테이블명
WHERE 조건식;

DELETE FROM TEST
WHERE NAME = '펭구';

만약 WHERE을 사용하지 않으면 전체 ROW를 삭제한다.
이 때, ROLLBACK을 통해 COMMIT하기전으로 되돌릴 수 있다.


TRUNCATE

TABLE의 전체 행(ROW)을 삭제할 때 사용하는 명령어
DELETE보다 수행 속도가 빠르지만 ROLLBACK을 통해 복구 불가능

TRUNCATE TABLE 테이블명;

0개의 댓글