DDL로 테이블 구조를 잡았다면, 이제 실제 데이터를 넣고 꺼내고 바꾸고 지우는 작업이 남는다. 이걸 담당하는 게 DML(Data Manipulation Language)이다.
INSERT, SELECT, UPDATE, DELETE — 네 가지만 알면 된다.
테이블에 새 행을 추가한다.
INSERT INTO members (member_name, email)
VALUES ('김민수', 'kim@email.com');
member_id는 AUTO_INCREMENT로 설정돼 있으니 직접 넣지 않아도 자동으로 채워진다.
여러 행을 한 번에 넣을 수도 있다.
INSERT INTO members (member_name, email)
VALUES ('김민수', 'kim@email.com'),
('이지현', 'lee@email.com'),
('박준혁', 'park@email.com');
저장된 데이터를 꺼내 볼 때 쓴다. DML 중에서 가장 자주 쓰고, 옵션도 가장 많다.
-- members 테이블의 모든 컬럼, 모든 행 조회
SELECT * FROM members;
*는 모든 컬럼을 뜻한다. 컬럼이 많을 때는 필요한 것만 지정하는 게 낫다.
SELECT member_name, email FROM members;
특정 조건에 맞는 행만 골라낼 때 쓴다.
-- member_id가 1인 행만 조회
SELECT * FROM members WHERE member_id = 1;
조건을 여러 개 걸 수도 있다.
-- 이름이 '김민수'이고 이메일이 특정 값인 행
SELECT * FROM members WHERE member_name = '김민수' AND email = 'kim@email.com';
| 연산자 | 의미 | 예시 |
|---|---|---|
= | 같다 | WHERE id = 1 |
!= | 다르다 | WHERE id != 1 |
>, < | 크다/작다 | WHERE price > 10000 |
AND | 둘 다 만족 | WHERE a = 1 AND b = 2 |
OR | 하나라도 만족 | WHERE a = 1 OR b = 2 |
LIKE | 패턴 일치 | WHERE name LIKE '김%' |
LIKE의 %는 "아무 문자나 0개 이상"을 뜻한다. '김%'이면 김으로 시작하는 모든 값이 해당된다.
-- 가격 낮은 순으로 정렬
SELECT * FROM products ORDER BY price ASC;
-- 가격 높은 순으로 정렬
SELECT * FROM products ORDER BY price DESC;
ASC는 오름차순, DESC는 내림차순이다. 생략하면 기본값은 ASC다.
-- 상위 5개만 조회
SELECT * FROM products ORDER BY price DESC LIMIT 5;

이미 저장된 데이터를 바꿀 때 쓴다.
-- member_id가 1인 회원의 이메일 변경
UPDATE members
SET email = 'minsu@email.com'
WHERE member_id = 1;
WHERE를 빠뜨리면 테이블의 모든 행이 바뀐다. 실수하기 쉬운 부분이라 항상 조건을 먼저 확인하고 실행하는 습관이 필요하다.
-- 이렇게 하면 모든 회원의 이메일이 바뀐다 (위험)
UPDATE members SET email = 'minsu@email.com';
특정 행을 삭제한다.
-- member_id가 2인 회원 삭제
DELETE FROM members WHERE member_id = 2;
UPDATE와 마찬가지로 WHERE가 없으면 테이블의 모든 행이 삭제된다.
-- 이렇게 하면 테이블이 텅 빈다 (위험)
DELETE FROM members;
DDL의 TRUNCATE와 결과는 같지만, DELETE는 행 하나씩 삭제하는 방식이라 조건을 걸 수 있다는 차이가 있다.
| 명령어 | 하는 일 |
|---|---|
INSERT | 새 행 추가 |
SELECT | 데이터 조회 |
UPDATE | 데이터 수정 |
DELETE | 행 삭제 |
UPDATE와 DELETE는 WHERE 없이 실행하면 테이블 전체에 적용된다. 습관적으로 WHERE 조건을 먼저 SELECT로 확인하고 나서 실행하는 게 안전하다.