DML은 SQL에서 가장 중요하고 사용 빈도가 높은 문법입니다.
같은 결과를 도출하더라도 효율면에서 큰 차이가 발생할 수 있기 때문에 개발자의 역량을 가르는 부분이 됩니다. 이 때, 인덱스와 뷰, 조인 등의 다양한 방법이 사용됩니다.
DML
Data Manipulation Language, 데이터 조작어.
데이터베이스에서 데이터를 출력, 입력, 삭제, 수정하기 위해 사용되는 문법입니다. SELECT문은 DQL(Data Query Language)로 분류되기도 합니다.
SELECT, INSERT, UPDATE, DELETE 문법으로 구성됩니다.
1. SELECT
SELECT [DISTINCT | ALL] 컬럼명
FROM 테이블명
WHERE 조건
GROUP BY 컬럼명
HAVING 조건
ORDER BY 컬럼명 [ASC | DESC]
SELECT문 기본 구조입니다.
출력을 위한 쿼리인 SELECT문에서 SELECT와 FROM 두가지 명령어는 필수로 들어갑니다.
SELECT
테이블에서 가져올 값을 선언합니다. 2개 이상의 테이블이 사용된 경우 [테이블명.] 또는 [별칭.] 을 사용하여 구분해야 합니다. 출력 값 옆에 AS을 사용하여 별칭을 설정할 수 있습니다.
ALL이 기본값으로 설정되어 있습니다. 중복되는 내용이 있어도 모두 출력합니다. 반대로 DISTINCT는 중복된 내용을 제거합니다.
TB_USER
ID | NAME | AGE | CLASS |
1 | 김박수 | 31 | C |
2 | 최민식 | 50 | B |
3 | 김박수 | 31 | B |
4 | 유초롱 | 47 | A |
5 | 김박수 | 15 | C |
TB_CLASS
CLASS | CLASS_NAME |
A | 고급반 |
B | 중급반 |
C | 초급반 |
TB_USER라는 테이블에서 이름이 '김박수'인 데이터를 추출한 뒤 이름(NAME)과 나이(AGE)를 나열하고자 합니다. 테이블에는 이름이 '김박수'인 사람은 3명이 존재합니다. 그 중 2명의 나이가 동일합니다.
ALL
SELECT ALL NAME, AGE
FROM TB_USER
WHERE NAME='김박수'
ALL은 생략가능합니다.
ID | NAME | AGE |
1 | 김박수 | 31 |
2 | 김박수 | 31 |
3 | 김박수 | 15 |
중복이 제거되지 않습니다.
DISTINCT
SELECT DISTINCT NAME, AGE
FROM TB_USER
WHERE NAME='김박수'
ID | NAME | AGE |
1 | 김박수 | 31 |
2 | 김박수 | 15 |
중복이 제거되었습니다.
* (Asterisk, 애스터리스크)
SELECT *
FROM TB_USER
WHERE NAME='김박수'
ID | NAME | AGE | CLASS |
1 | 김박수 | 31 | C |
2 | 김박수 | 31 | B |
3 | 김박수 | 15 | C |
TB_USER의 모든 컬럼을 출력합니다.
FROM
데이터를 가져올 테이블(객체)를 선언합니다. 2개 이상의 테이블을 사용한 경우 "FROM 테이블명 별칭"과 같은 형태로 치환값을 설정해줍니다. 이 때 치환하기 전의 테이블명을 사용하면 에러가 발생합니다.
SELECT A.NM
FROM TB_USER A
정상 처리
SELECT TB_USER.NM
FROM TB_USER A
에러 발생
WHERE
테이블에서 값을 가져오기 위한 1개 이상의 조건을 명시합니다. 2개 이상의 조건 설정 시 AND 또는 OR 연산자를 사용해 구분합니다. <, >, =, !=, LIKE, IN, EXISTS 등의 연산자가 사용됩니다.
비교연산자 <, >, =, !=, <>
SELECT NAME
FROM TB_USER
WHERE [
AGE<10 //AGE가 10 미만
AGE<=10 //AGE가 10 이하
AGE>10 //AGE가 10 초과
AGE>=10 //AGE가 10 이상
AGE=10 //AGE가 10과 일치
AGE!=10 //AGE가 10과 불일치
AGE<>10 //AGE가 10과 불일치 (!=와 동일)
AGE!=10 //AGE가 10과 불일치 (<>와 동일)
]
비교연산자 기본 구조입니다.
값의 크기를 비교하는 <, >, <=, >= 연산자는 피연산자로 숫자만 사용가능하지만, =, !=, <> 의 연산자는 문자형에도 적용이 가능합니다. 문자열의 길이를 비교하고 싶다면 LENGTH(NAME)과 같은 형태로 사용 가능합니다.
LIKE 연산자
SELECT *
FROM TB_USER
WHERE [
NAME LIKE '%명%' -- '명' 자를 포함하고 있는 값
NAME LIKE '%명' -- '명' 자로 끝나는 값
NAME LIKE '명%' -- '명' 자로 시작는 값
NAME LIKE '_명' -- '명' 자앞에 1개의 문자가 있는 값
NAME LIKE '__명' -- '명' 자앞에 2개의 문자가 있는 값
NAME LIKE '명_' -- '명' 자뒤에 1개의 문자가 있는 값
]
LIKE 연산자 기본 구조입니다
% : 0개 이상의 문자를 대체합니다.
_ : _가 사용된 개수만큼의 문자를 대체합니다
만약 주소지가 서울인 사람을 찾고싶다면 address LIKE '서울시%' 와 같이 조건을 둔다면 쉽게 찾을 수 있습니다.
IN 연산자
SELECT *
FROM TB_USER
WHERE NAME IN ('박초롱','김명수','진미채')
IN 연산자 기본 구조입니다
괄호 안에 들어있는 값과 일치하는 모든 값을 선별합니다. 괄호 안에 새로운 SELECT문을 사용해서 *서브쿼리 형식으로도 사용할 수 있습니다. NOT IN 을 사용하면 반대로 일치하지 않는 값을 찾을 수 있습니다.
*서브쿼리 : 하나의 쿼리 안에서 사용되는 또 다른 쿼리입니다. 가장 바깥의 쿼리는 메인쿼리라고 합니다.
EXISTS
SELECT *
FROM TB_USER A
WHERE EXISTS(SELECT 1
FROM TB_CLASS B
WHERE A.CLASS = B.CLASS
AND B.CLASS='C')
EXISTS 연산자는 항상 서브퀴리와 함께 사용됩니다. EXISTS내부의 서브쿼리 결과가 한 건이라도 참이면 TRUE를, 거짓이면 FALSE를 리턴합니다. IN 연산자와 비슷해 보이지만 큰 차이가 있습니다.
위의 쿼리를 보면, A 테이블을 모두 탐색하며 A.CLASS의 값을 EXISTS쿼리 안쪽에 삽입합니다. A.CLASS=B.CLASS의 조건과 B.CLASS='C' 모두 일치하는 값이 하나라도 있다면 SELECT 1을 반환하게 되고 EXISTS 조건은 참으로 넘어가게 됩니다
.
구체적인 순서는 다음과 같습니다.
1. 메인 쿼리에서 TB_USER A 테이블의 각 행이 하나씩 선택됩니다.
2. 각 행에 대해 서브쿼리가 실행되어 TB_CLASS B 테이블에서 조건을 만족하는 행이 있는지를 확인합니다.
3. 서브쿼리에서 조건이 참이면 EXISTS는 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환합니다.
따라서, A 테이블의 모든 행에 대해 EXISTS 조건이 반복적으로 평가됩니다.
2. INSERT
INSERT INTO 테이블명(컬럼명1, 컬럼명2, ...)
VALUES(입력값1, 입력값2, ...)
INSERT문 기본 구조입니다.
TB_USER테이블은 ID, NAME, AGE, CLASS 4개의 컬럼으로 이루어져 있습니다. 새로운 값을 추가하기 위해 INSERT 문을 작성하는 3가지 방법이 있습니다.
TB_USER 전
ID | NAME | AGE | CLASS |
1 | 김박수 | 31 | C |
2 | 최민식 | 50 | B |
3 | 김박수 | 31 | B |
4 | 유초롱 | 47 | A |
5 | 김박수 | 15 | C |
TB_USER 후
ID | NAME | AGE | CLASS |
1 | 김박수 | 31 | C |
2 | 최민식 | 50 | B |
3 | 김박수 | 31 | B |
4 | 유초롱 | 47 | A |
5 | 김박수 | 15 | C |
6 | 조치훈 | 22 | A |
1. 컬럼명을 명시하는 경우
INSERT INTO TB_USER(ID, NAME, AGE, CLASS)
VALUES(6, '조치훈', 22, 'A')
컬럼명과 일치하는 자료형의 값을 입력해줍니다. 일치하지 않아도 묵시적 형변환이 발생하여 자동으로 형을 맞춰주긴 하지만 한글 문자열을 숫자형으로 바꿀 수 없듯이 모든 상황에서 묵시적 형변환이 일어나지는 않기 때문에 주의해야 합니다.
2. 컬럼명을 생략하는 경우
INSERT INTO TB_USER
VALUES(6, '조치훈', 22, 'A')
테이블 컬럼의 순서에 맞춰 자동으로 일치하는 컬럼에 값을 넣어줍니다. 작성하기 편하지만 테이블 구조가 변경되었을 때 에러를 발생시킬 수 있으니 컬럼명은 명시해주는 것이 좋습니다.
3. SELECT문을 적용
INSERT INTO TB_USER(ID, NAME, AGE, CLASS)
SELECT * FROM TB_USER2
SELECT 문을 사용하면 한 번에 여러 개의 행을 삽입할 수 있고 잘 못된 값을 집어넣을 위험성도 낮아집니다.
3. UPDATE
UPDATE 테이블명
SET 변경값
WHERE 조건
UPDATE문 기본 구조입니다.
TB_USER의 6번째 값을 수정해주겠습니다.
UPDATE TB_USER
SET NAME='박미라', AGE=25
WHERE ID=6
ID가 6인 행의 NAME과 AGE를 입력한 값으로 수정하는 쿼리입니다. WHERE조건에 해당되는 값이 모두 바뀌기 때문에 반드시 테이블의 키값을 확인하여 의도하지 않는 수정을 방지해야 합니다. 실수로 WHERE 절을 생략해버리기라도 한다면 모든 테이블의 값들이 수정되는 사태가 벌어질 수 있습니다.
INSERT문과 UPDATE문을 조합한 MERGE INTO문을 사용할 수도 있습니다.
4. DELETE
DELETE FROM 컬럼명
WHERE 조건
DELETE문 기본 구조입니다
TB_USER에서 ID가 5인 값을 삭제하겠습니다.
DELETE FROM TB_USER
WHERE ID=5
조건이 일치하는 행을 삭제합니다. WHERE 조건을 입력하지 않는다면 테이블의 모든 값을 삭제합니다. DELETE 문은 항상 조심해서 사용해야 합니다.
'DBMS' 카테고리의 다른 글
4. SQL 기본 문법(DCL, TCL) (0) | 2024.12.29 |
---|---|
오라클 구조 (1) | 2024.12.03 |
2. SQL 기본 문법(DDL) (1) | 2024.11.25 |
1. 데이터베이스(DataBase)란? (1) | 2024.11.19 |