MySQL 데이터 조작 (SELECT, INSERT, UPDATE, DELETE)

데이터 조작 기본 문법

SELECT (데이터 조회)

# 모든 컬럼 조회
SELECT * FROM 테이블명;

# 특정 컬럼만 조회
SELECT 컬럼1, 컬럼2, ... FROM 테이블명;

# 조건부 조회
SELECT * FROM 테이블명 WHERE 조건;

# 정렬
SELECT * FROM 테이블명 ORDER BY 컬럼명 [ASC|DESC];

# 개수 제한
SELECT * FROM 테이블명 LIMIT 개수;

INSERT (데이터 삽입)

# 모든 컬럼에 데이터 삽입
INSERT INTO 테이블명 VALUES (값1, 값2, 값3, ...);

UPDATE (데이터 수정)

# 단일 컬럼 수정
UPDATE 테이블명 SET 컬럼명 = 값 WHERE 조건;

# 여러 컬럼 동시 수정
UPDATE 테이블명
SET 컬럼1 = 값1, 컬럼2 = 값2, ...
WHERE 조건;

# 조건 없이 모든 행 수정 (주의!)
UPDATE 테이블명 SET 컬럼명 = 값;

DELETE (데이터 삭제)

# 조건에 맞는 행 삭제
DELETE FROM 테이블명 WHERE 조건;

# 모든 데이터 삭제 (주의!)
DELETE FROM 테이블명;

# 테이블 구조는 유지하고 데이터만 삭제
TRUNCATE TABLE 테이블명;

WHERE 절 조건 연산자

# 비교 연산자
WHERE 컬럼명 = 값          # 같음
WHERE 컬럼명 != 값         # 같지 않음
WHERE 컬럼명 <> 값         # 같지 않음 (위와 동일)
WHERE 컬럼명 > 값          # 큼
WHERE 컬럼명 >= 값         # 크거나 같음
WHERE 컬럼명 < 값          # 작음
WHERE 컬럼명 <= 값         # 작거나 같음

# 논리 연산자
WHERE 조건1 AND 조건2      # 둘 다 만족
WHERE 조건1 OR 조건2       # 하나라도 만족
WHERE NOT 조건             # 조건 불만족

# 범위 검색
WHERE 컬럼명 BETWEEN 값1 AND 값2
WHERE 컬럼명 IN (값1, 값2, 값3, ...)
WHERE 컬럼명 NOT IN (값1, 값2, ...)

# 패턴 검색
WHERE 컬럼명 LIKE '패턴'   # % (여러 문자), _ (한 문자)
WHERE 컬럼명 NOT LIKE '패턴'

# NULL 검색
WHERE 컬럼명 IS NULL
WHERE 컬럼명 IS NOT NULL

실전 예제

1. person 테이블 생성

먼저 예제를 위한 person 테이블을 생성합니다.

CREATE TABLE person (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT,
  sex CHAR(1)
);

2. 데이터 삽입 및 확인

문제: person 테이블에 다음의 데이터를 추가하고 확인하세요.

  • ID: 2, NAME: 이미자, AGE: 28, SEX: F
  • ID: 3, NAME: 유재석, AGE: 50, SEX: F
# 데이터 삽입
INSERT INTO person (id, name, age, sex) VALUES
  (2, '이미자', 28, 'F'),
  (3, '유재석', 50, 'F');

# 데이터 확인
SELECT * FROM person;

결과:

+----+--------+------+------+
| id | name   | age  | sex  |
+----+--------+------+------+
|  2 | 이미자 |   28 | F    |
|  3 | 유재석 |   50 | F    |
+----+--------+------+------+

3. 조건부 조회

문제 1: person 테이블에서 나이가 50세인 데이터를 조회하세요.

SELECT * FROM person WHERE age = 50;

결과:

+----+--------+------+------+
| id | name   | age  | sex  |
+----+--------+------+------+
|  3 | 유재석 |   50 | F    |
+----+--------+------+------+

문제 2: person 테이블에서 성별이 여자인 데이터를 조회하세요.

SELECT * FROM person WHERE sex = 'F';

결과:

+----+--------+------+------+
| id | name   | age  | sex  |
+----+--------+------+------+
|  2 | 이미자 |   28 | F    |
|  3 | 유재석 |   50 | F    |
+----+--------+------+------+

4. 데이터 수정

문제 1: person 테이블에서 유재석의 성별을 남자(M)로 수정하고 확인하세요.

# 데이터 수정
UPDATE person SET sex = 'M' WHERE name = '유재석';

# 수정 결과 확인
SELECT * FROM person WHERE name = '유재석';

결과:

+----+--------+------+------+
| id | name   | age  | sex  |
+----+--------+------+------+
|  3 | 유재석 |   50 | M    |
+----+--------+------+------+

문제 2: person 테이블에서 ID가 2번의 이름을 이미주로 수정하고 확인하세요.

# 데이터 수정
UPDATE person SET name = '이미주' WHERE id = 2;

# 수정 결과 확인
SELECT * FROM person WHERE id = 2;

결과:

+----+--------+------+------+
| id | name   | age  | sex  |
+----+--------+------+------+
|  2 | 이미주 |   28 | F    |
+----+--------+------+------+

전체 데이터 확인:

SELECT * FROM person;

결과:

+----+--------+------+------+
| id | name   | age  | sex  |
+----+--------+------+------+
|  2 | 이미주 |   28 | F    |
|  3 | 유재석 |   50 | M    |
+----+--------+------+------+

5. 데이터 삭제

문제 1: person 테이블에서 성별이 여자인 데이터를 삭제하고 확인하세요.

# 데이터 삭제
DELETE FROM person WHERE sex = 'F';

# 삭제 결과 확인
SELECT * FROM person;

결과:

+----+--------+------+------+
| id | name   | age  | sex  |
+----+--------+------+------+
|  3 | 유재석 |   50 | M    |
+----+--------+------+------+

문제 2: person 테이블의 모든 데이터를 삭제하고 확인하세요.

# 모든 데이터 삭제
DELETE FROM person;

# 삭제 결과 확인
SELECT * FROM person;

결과:

Empty set (0.00 sec)

테이블 구조는 유지되고 데이터만 삭제되었는지 확인:

DESC person;

결과:

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  | PRI | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

추가 예제

여러 조건 사용

# 나이가 30 이상이고 성별이 남자인 데이터 조회
SELECT * FROM person WHERE age >= 30 AND sex = 'M';

# 나이가 20대이거나 50대인 데이터 조회
SELECT * FROM person WHERE (age >= 20 AND age < 30) OR (age >= 50 AND age < 60);

# 이름이 '이'로 시작하는 데이터 조회
SELECT * FROM person WHERE name LIKE '이%';

# ID가 1, 2, 3 중 하나인 데이터 조회
SELECT * FROM person WHERE id IN (1, 2, 3);

정렬 및 제한

# 나이순으로 정렬 (오름차순)
SELECT * FROM person ORDER BY age ASC;

# 나이순으로 정렬 (내림차순)
SELECT * FROM person ORDER BY age DESC;

# 나이순으로 정렬 후 상위 3개만 조회
SELECT * FROM person ORDER BY age DESC LIMIT 3;

# 여러 컬럼으로 정렬 (나이 먼저, 같으면 이름순)
SELECT * FROM person ORDER BY age ASC, name ASC;

특정 컬럼만 조회

# 이름과 나이만 조회
SELECT name, age FROM person;

# 컬럼에 별칭(alias) 사용
SELECT name AS 이름, age AS 나이 FROM person;
SELECT name 이름, age 나이 FROM person;  # AS 생략 가능

집계 함수

# 전체 행 개수
SELECT COUNT(*) FROM person;

# 평균 나이
SELECT AVG(age) FROM person;

# 최대 나이
SELECT MAX(age) FROM person;

# 최소 나이
SELECT MIN(age) FROM person;

# 나이 합계
SELECT SUM(age) FROM person;

주의사항

  1. WHERE 절 필수: UPDATE와 DELETE 문에서 WHERE 절을 생략하면 모든 행이 수정/삭제됨
  2. 트랜잭션: 중요한 데이터 조작 전에는 트랜잭션을 사용하여 롤백 가능하도록 준비
  3. 데이터 확인: UPDATE나 DELETE 실행 전에 SELECT로 조건 확인 권장
  4. 문자열 비교: 문자열 비교 시 대소문자 구분 여부는 데이터베이스 설정에 따라 다름
  5. NULL 처리: NULL 값 비교 시 = 대신 IS NULL 또는 IS NOT NULL 사용
  6. LIKE 패턴: %는 0개 이상의 문자, _는 정확히 1개의 문자를 의미
  7. DELETE vs TRUNCATE:
    • DELETE: 조건부 삭제 가능, 트랜잭션 로그 기록, 느림
    • TRUNCATE: 모든 데이터 삭제, 트랜잭션 로그 기록 안 함, 빠름, AUTO_INCREMENT 초기화
  8. 성능: 대용량 데이터 조작 시 인덱스 활용 및 조건 최적화 고려
  9. 백업: 중요한 데이터 수정/삭제 전 백업 필수