DML
- 데이터베이스 내의 데이터를 조작하는 데 사용되는 SQL 구문
- SELECT 조회, INSERT 삽입, UPDATE 갱신, DELETE 삭제
SELECT
SELECT 컬럼명1, 컬럼명2
FROM 테이블명;
- SELECT 컬럼 순서대로 조회 결과 출력
- [ * ] 모든 컬럼 조회, 유지보수를 위해 실무에서는 컬럼 나열 권장
DISTINCT vs ALL
- DISTINCT는 중복된 값을 제거하고 고유한 값만 조회
- ALL은 DEFAULT이며 생략 가능, 중복 상관없이 모든 값을 조회
SELECT DISTINCT
issue_insti_nm
FROM tb_certi;
SELECT ALL <--- ALL은 생략 가능 (DEFAULT)
issue_insti_nm
FROM tb_certi;
문자열 연결연산자 ||
- || : 오라클 문법
- CONCAT 함수 : 다른 sql 문법
SELECT
certi_nm || ' (' || issue_insti_nm || ')'
FROM tb_certi;

별칭 ALIAS
- AS 생략 가능
- "" 생략 가능
- 띄어쓰기가 있는 경우 "" 생략 불가
-- 열 별칭 부여
SELECT
emp_nm AS "사원명",
addr AS "주소"
FROM tb_emp;
-- 띄어쓰기 있을 경우 "" 필요
SELECT
emp_nm 사원명,
addr 거주지 주소 -- 에러 발생
FROM tb_emp;
INSERT
INSERT INTO 테이블명 (컬럼명1, 컬럼명2, ...)
VALUES(값1, 값2, ...);
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date)
VALUES (1, 'John', 'Doe', 'john.doe@example.com', TO_DATE('2023-05-01', 'YYYY-MM-DD'));
다중 행 삽입
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),
(value4, value5, value6, ...),
(value7, value8, value9, ...), ...;
INSERT INTO SELECT
- 다른 테이블에서 선택한 데이터를 기반으로 행을 삽입
- insert into select 서브쿼리
INSERT INTO 테이블1 (컬럼1, 컬럼2, 컬럼3, ...)
SELECT 컬럼1, 컬럼2, 컬럼3, ...
FROM 테이블2
WHERE 조건;
** INSERT문 주의사항
- NOT NULL 제약 조건이 있는 열에는 NULL 값을 삽입할 수 없고 반드시 값을 제공해야 힘
- 기본 키(primary key) 또는 고유 키(unique key) 제약 조건이 있는 열에 중복 값을 삽입하면 오류 발생
- 외래 키(foreign key) 제약 조건이 있는 열에 존재하지 않는 참조 값을 삽입하면 오류 발생
** VARCHAR2(10) 은 10Byte - 한글, 이모티콘 주의
** 자동 형변환
숫자 → 문자 : 자동 형변환
문자 → 숫자 : 숫자만 있다면 자동 형변환
INSERT INTO goods
(goods_name, id, reg_date, price)
VALUES
('점퍼', 5, sysdate, '49000'); -- '100' 문자열이어도 숫자형태면 암묵적 형변환

* 컬럼명 생략시 테이블구조 순서대로 기입
- 실무 관점에서는 생략하지 않는 것을 권장
- 순서대로 모든 컬럼에 대한 데이터를 입력해야 함
UPDATE
UPDATE 테이블명
SET 컬럼명 = 변경값
WHERE 조건;
** UPDATE문 주의사항
- WHERE 절을 사용하여 특정 행을 선택하지 않으면, 테이블의 모든 행이 업데이트됨 (BULK UPDATE)
- NOT NULL 제약 조건이 있는 열에 NULL 값을 설정하려고 하면 오류가 발생
- 기본 키(primary key) 또는 고유 키(unique key) 제약 조건이 있는 열에 중복 값을 설정하려고 하면 오류가 발생
- 외래 키(foreign key) 제약 조건이 있는 열에 존재하지 않는 참조 값을 설정하려고 하면 오류가 발생
** 기존 값을 계산, 문자열 조합 등의 조작한 값으로 갱신할 수 있음
UPDATE employees
SET salary = salary + 1000, last_name = CONCAT(last_name, ' (Updated)')
WHERE employee_id = 1;
** 기본키 update 가능
단, 제약조건 제한을 지켜야 함 ( ex. 다른 기본키와 중복될 수 없고 null로 수정도 불가 )
UPDATE goods
SET id = 11
WHERE id = 4;
-- 변경사항이 중복되면 에러 / NOT NULL을 NULL로 변경하면 에러
UPDATE goods
SET id = 1
WHERE id = 11;
DELETE
DELETE FROM 테이블명 WHERE 조건;
** DELETE문 주의사항
- WHERE 절을 사용하여 특정 행을 선택하지 않으면, 테이블의 모든 행이 삭제됨
(복구가 필요없다면 TRUNCATE문을 사용하는 것이 더 효율적) - 삭제된 데이터는 복구할 수 없으므로, DELETE문을 사용하기 전에
데이터를 백업하거나 데이터를 복구할 수 있는 방법을 고려해야 함 - 외래 키(foreign key) 제약 조건으로 인해 참조 무결성이 깨질 경우, 해당 행을 삭제할 수 없음
참조하는 행을 먼저 삭제하거나 외래 키 제약 조건을 수정해야 함
DELETE FROM 과 TRUNCATE TABLE의 차이
**DELETE FROM**을 사용하는 경우:
- 특정 조건을 충족하는 행만 삭제하려는 경우
- 트리거를 발생시키려는 경우
- 삭제 과정을 로깅하려는 경우
**TRUNCATE TABLE**을 사용하는 경우:
- 테이블의 모든 데이터를 빠르게 삭제하려는 경우
- 트리거를 발생시키지 않으려는 경우
- 삭제 과정을 로깅하지 않으려는 경우
실무적인 예를 들자면,
- 웹 애플리케이션에서 사용자가 작성한 댓글을 삭제할 때 DELETE FROM을 사용하여 특정 댓글만 삭제
- 일정 기간이 지난 후 사용되지 않는 임시 데이터를 삭제하려면 TRUNCATE TABLE을 사용해 삭제
WHERE 조건절
- 데이터베이스 테이블에서 특정 조건에 맞는 행(row)만 선택하여 조회할 때 사용
- SELECT, UPDATE, DELETE 등 다양한 SQL문에서 사용 가능
- 데이터베이스에서 원하는 데이터만 검색하여 추출할 수 있으며, 데이터베이스의 부하를 줄일 수 있음
- 조건 표현식(expression)은 비교 연산자(<, >, =, <=, >=, <>), 논리 연산자(AND, OR, NOT) 사용하여 구성
연산자
WHERE절 비교 연산자, 논리 연산자, IN 연산자, LIKE 연산자, BETWEEN 연산자 등이 있음
- 비교 연산자
- =: 컬럼 값과 조건 값이 같음
- <> 또는 !=: 컬럼 값이 조건 값과 다름
- <: 컬럼 값이 조건 값 보다 작음
- >: 컬럼 값이 조건 값 보다 큼
- <=: 컬럼 값이 조건 값 보다 작거나 같음
- >=: 컬럼 값이 조건 값 보다 크거나 같음
- 논리 연산자
- AND: 두 개의 조건이 모두 참일 때 참
- OR: 두 개의 조건 중 하나 이상이 참일 때 참
- NOT: 조건의 결과를 부정
- IN 연산자:
- WHERE절에서는 IN 연산자를 사용하여 여러 개의 값을 비교하여 하나라도 해당되는 데이터 선택
- OR 연산 2개 이상 할 때 유용
-- IN 연산: OR연산 SELECT emp_no, emp_nm, dept_cd FROM tb_emp WHERE dept_cd IN (100002, 100007); SELECT emp_no, emp_nm, dept_cd FROM tb_emp WHERE dept_cd = 100002 OR dept_cd = 100007; SELECT emp_no, emp_nm, dept_cd FROM tb_emp WHERE dept_cd NOT IN (100002, 100007, 100008); - LIKE 연산자
문자열 패턴을 검색
- %: 0개 이상의 문자와 일치합니다.
- _: 한 개의 문자와 일치합니다.
SELECT email FROM user WHERE email LIKE '_A%@%';
- BETWEEN 연산자
- 컬럼명 BETWEEN 작은 값 AND 큰 값 : 작은 값 이상, 큰 값 이하 범위에 해당하는 데이터 선택
- 컬럼명 NOT BETWEEN A AND B - IS NULL 연산자
- 해당 열(column)의 값이 NULL인 행(row)을 선택
- IS NOT NULL
- ** NULL 연산은 무조건 결과가 NULL
연산자 우선순위
- (), NOT > AND > OR
- AND 김 AND 수원 OR 일산 ⇒ 김씨이면서 수원에 사는 사람 || 그냥 일산에 사는 사람
- AND 김 AND( 수원 OR 일산) ⇒ 김씨 AND (수원 또는 일산에 사는 사람 )
-- 연산자 우선 순위
-- NOT > AND > OR
SELECT
EMP_NO ,
EMP_NM ,
ADDR
FROM TB_EMP
WHERE 1=1
AND EMP_NM LIKE '김%'
AND (ADDR LIKE '%수원%' OR ADDR LIKE '%일산%')
주석처리 Tip
- 주석처리 편의를 위해 컬럼, 조건마다 다음 줄로 작성 권장
- ; 도 다음 줄로 작성하면 주석 처리가 더 편함
-- 성씨가 김씨이면서
-- 부서가 100003, 100004 중에 하나면서
-- 90년대생인 사원의 사번, 이름, 생일, 부서코드 조회
SELECT
emp_no 사번,
emp_nm 이름,
birth_de 생일,
dept_cd 부서코드
FROM tb_emp
WHERE 1=1
AND emp_nm LIKE '김%'
AND dept_cd IN (100003, 100004)
AND birth_de BETWEEN '19900101' AND '19991231'
;