DML (Data Manipulation Language)은 데이터베이스 내의 데이터를 조작하는 데 사용되는 SQL 구문
CREATE TABLE goods (
id NUMBER(6) PRIMARY KEY,
goods_name VARCHAR2(10) NOT NULL,
price NUMBER(10) DEFAULT 1000,
reg_date DATE
);
-- INSERT
-- 날짜를 넣을 때는 숫자로 넣으면 안됨
INSERT INTO goods
(id, goods_name, price, reg_date)
VALUES
(1, '선풍기', 120000, SYSDATE);
INSERT INTO goods
(id, goods_name, price, reg_date)
VALUES
(2, '세탁기', 2000000, SYSDATE);
INSERT INTO goods
(id, goods_name, reg_date)
VALUES
(3, '달고나', SYSDATE);
INSERT INTO goods
(id, goods_name)
VALUES
(4, '계란');
-- 순서가 뒤바뀌어도 VALUES와 순서만 맞춰주면 문제 x
-- price, 암묵적 형변환 O
INSERT INTO goods
(goods_name, id, reg_date, price)
VALUES
('점퍼', 5, SYSDATE, '49000');
-- 컬럼명 생략시 테이블구조 순서대로 자동 기입
INSERT INTO goods
VALUES
(6, '냉장고', 1000000, SYSDATE);
-- UPDATE
UPDATE goods
SET goods_name = '에어컨'
WHERE id = 1
;
UPDATE goods
SET price = 9999;
UPDATE goods
SET id = 11
WHERE id = 4;
UPDATE goods
SET price = null
WHERE id = 3;
UPDATE goods
SET goods_name = '청바지',
price = 299000
WHERE id = 3;
-- DELETE
-- 조건 없이 delete하면 전체삭제
-- 다만 이 문법은 복구가 가능함
DELETE FROM goods
WHERE id = 11;
TRUNCATE TABLE goods; -- 복구 불가
DROP TABLE goods; -- 복구 불가 + 테이블까지 삭제
SELECT * FROM goods;
-- SELECT 기본
SELECT
certi_cd,
certi_nm,
issue_insti_nm
FROM tb_certi;
-- 컬럼 순서 바뀌어도 상관 X
SELECT
certi_nm,
certi_cd,
issue_insti_nm
FROM tb_certi;
-- DISTINCT: 중복제거
SELECT DISTINCT
issue_insti_nm
FROM tb_certi;
-- 모든 컬럼 조회
SELECT
*
FROM tb_certi;
-- 열 별칭 부여
-- AS "별칭" 인데 AS, "" 생략가능, 띄어쓰기 있으면 ""필요
SELECT
emp_nm 사원명,
addr "거주지 주소"
FROM tb_emp;
-- 문자열 결합: ||
SELECT
'자격증: ' || certi_nm AS "자격증 정보"
FROM tb_certi;
SELECT
certi_nm || ' (' || issue_insti_nm || ')'
FROM tb_certi;
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),
(value4, value5, value6, ...),
(value7, value8, value9, ...),
...;
데이터베이스 테이블에서 특정 조건에 맞는 행(row)만 선택하여 조회할 때 사용
=
: 값이 같음을 나타냅니다.<>
또는 !=
: 값이 다름을 나타냅니다.<
: 값이 작음을 나타냅니다.>
: 값이 큼을 나타냅니다.<=
: 값이 작거나 같음을 나타냅니다.>=
: 값이 크거나 같음을 나타냅니다.AND
: 두 개의 조건이 모두 참일 때 참입니다.OR
: 두 개의 조건 중 하나 이상이 참일 때 참입니다.NOT
: 조건의 결과를 부정합니다.-- WHERE 조건절
-- 조회 행을 제한
SELECT
emp_no,
emp_nm,
addr,
sex_cd
FROM tb_emp
WHERE sex_cd = 2
;
-- PK로 필터링하면 무조건 1건 이하가 조회됨 (PK는 최대 1개)
SELECT
emp_no,
emp_nm,
addr,
sex_cd
FROM tb_emp
WHERE emp_no = 1000000003
;
-- 비교 연산자
SELECT
emp_no,
emp_nm,
addr,
sex_cd
FROM tb_emp
WHERE sex_cd <> 2
;
SELECT
emp_no,
emp_nm,
addr,
birth_de
FROM tb_emp
WHERE birth_de >= '19800101'
AND birth_de <= '19891231'
;
SELECT
emp_no,
emp_nm,
addr,
birth_de
FROM tb_emp
WHERE NOT birth_de >= '19800101'
;
-- BETWEEN 연산자
SELECT
emp_no,
emp_nm,
birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19900101' AND '19991231'
;
SELECT
emp_no,
emp_nm,
birth_de
FROM tb_emp
WHERE birth_de NOT BETWEEN '19900101' AND '19991231'
;
-- IN 연산 : OR 연산
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 IN (100002,100007)
;
SELECT
emp_no,
emp_nm,
dept_cd
FROM tb_emp
WHERE dept_cd NOT IN (100002,100007)
;
-- LIKE
-- 검색에서 사용
-- 와일드카드 매핑 (%: 0글자 이상, _: 딱 1글자)
SELECT
emp_no,
emp_nm,
addr
FROM tb_emp
WHERE addr LIKE '%용인%'
;
SELECT
emp_no,
emp_nm,
addr
FROM tb_emp
WHERE emp_nm LIKE '이%'
;
SELECT
emp_no,
emp_nm,
addr
FROM tb_emp
WHERE emp_nm LIKE '이_' -- 이름이 외자인 사람
;
SELECT
emp_no,
emp_nm,
addr
FROM tb_emp
WHERE emp_nm LIKE '이__' -- 이름이 2글자인 사람
;
SELECT
emp_no,
emp_nm,
addr
FROM tb_emp
WHERE emp_nm LIKE '%심' -- 이름이 심으로 끝나는 사람
;
SELECT
email
FROM user
WHERE email LIKE '_A%@%' -- banana@gmail.com
;
-- 성씨가 김씨이면서
-- 부서가 100003, 100004 중에 하나면서
-- 90년대생인 사원의 사번, 이름 생일, 부서코드를 조회
SELECT
emp_no,
emp_nm,
birth_de,
dept_cd
FROM tb_emp
WHERE 1=1 -- 주석처리의 편의성을 위해서 무조건 true인 1=1을 붙인다.
AND emp_nm LIKE '김%'
AND dept_cd IN (100003, 100004)
AND birth_de BETWEEN '19900101' AND '19991231'
;
-- NULL값 조회
-- 반드시 IS NULL로 조회할 것!
SELECT
emp_no,
emp_nm,
direct_manager_emp_no
FROM tb_emp
WHERE direct_manager_emp_no IS NULL
;
-- NULL이 아닌 것 조회
-- IS NOT NULL을 제외하고 모두 앞에 NOT이 붙음
-- NOT IS NULL (x)
SELECT
emp_no,
emp_nm,
direct_manager_emp_no
FROM tb_emp
WHERE direct_manager_emp_no IS NOT NULL
;
-- 연산자 우선 순위
-- 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 '%일산%')
;
-- CHAR 타입은 남은 byte를 공백으로 채운다.
CREATE TABLE CHAR_COMPARE (
sn CHAR(10),
char_4 CHAR(4),
char_6 CHAR(6)
);
INSERT INTO char_compare VALUES ('101', 'SQLD', 'SQLD');
INSERT INTO char_compare VALUES ('102', 'SQLD', 'SQLA');
INSERT INTO char_compare VALUES ('103', 'SQLD', ' SQLD');
SELECT * FROM CHAR_COMPARE;
SELECT * FROM CHAR_COMPARE
WHERE sn = '103'
AND char_4 = char_6
;
SELECT * FROM CHAR_COMPARE
WHERE sn = '102'
AND char_4 > char_6
;
-- 한쪽이 VARCHAR타입일 경우의 비교
DROP TABLE VARCHAR_COMPARE;
CREATE TABLE VARCHAR_COMPARE (
sn CHAR(10),
char_4 CHAR(4),
varchar_6 VARCHAR2(6)
);
INSERT INTO varchar_compare VALUES ('101', 'SQLD', 'SQLD ');
INSERT INTO varchar_compare VALUES ('102', 'SQLD', 'SQLA ');
INSERT INTO varchar_compare VALUES ('103', 'SQLD', 'SQLD');
COMMIT;
SELECT * FROM varchar_compare;
SELECT * FROM varchar_compare
WHERE sn = '101'
AND char_4 = varchar_6
;
-- VARCHAR2 타입은 남은 byte는 없앤다. (= 공백이 생기면 없앰)
SELECT * FROM varchar_compare
WHERE sn = '101'
AND char_4 = TRIM(varchar_6)
;
-- 상수 문자열 비교
SELECT
*
FROM varchar_compare
WHERE sn = '101'
AND char_4 = 'SQLD ' -- true, char는 더 긴것의 길이만큼 공백을 늘림
;
SELECT
*
FROM varchar_compare
WHERE sn = '101'
AND varchar_6 = 'SQLD ' -- true
;
SELECT
*
FROM varchar_compare
WHERE sn = '101'
AND varchar_6 = 'SQLD' -- false, char처럼 공백을 늘리지 않음
;