728x90
Insert 문법
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- table_name : 데이터를 추가할 테이블의 이름이다.
- (column1, column2, ...): 값을 지정할 열의 목록이다. 이 목록을 생략하면 테이블의 모든 열에 순서대로 값을 넣어야 한다.
- VALUES (value1, value2, ...): 지정된 각 열에 삽입될 값이다. 열 목록과 값 목록은 순서와 개수가 정확히 일치해야 한다.
모든 열(컬럼) 추가하기
insert into customers values(null, '강감찬', 'kang@example.com', 'hashed_password_123', '서울시 관악구', '2025-06-11 10:30:00');
insert into customers values(null, '이순신', 'lee@example.com', 'hashed_password_123', '서울시 관악구', '2025-06-12 10:30:00');
- 데이터를 추가할 열의 목록을 생략할 수 있다.(열의 순서대로 모든 값을 Values에 제공)
- customer_id에 null을 넣은 이유: 이 열은 auto_increment로 설정했기 때문에 null을 명시하거나 열 목록에서 생략하면 MySql이 알아서 다음 순번의 숫자를 자동으로 채워준다.
- join_date에 직접 날짜와 시간을 입력했다.
원하는 특정 열만 골라서 데이터 추가하기
insert into customers(name, email, password, address) values('세종대왕', 'sejong@example.com', 'hashed_password_456', '서울시 종로구');
- 모든 열에 데이터를 넣을 필요가 없을 때, 사용하는 방식이다.
- auto_increment나 default 값이 설정된 열은 굳이 명시할 피요가 없어 생략하면, 코드가 훨씬 간결해진다.
- customer_id는 자동으로 다음 번호가 부여된다.
- join_date는 default 값인 현재 시각(current_timestamp)로 자동으로 기록된다.
실무 이야기: 열 목록을 사용하자
열 목록을 생략하고 INSERT INTO products VALUES (NULL, '베이직 반팔 티셔츠', ...) 와 같이 값만 순서대로 나열하는 방법은 추천하지 않는다. 나중에 테이블 구조가 변경(예: ALTER TABLE로 열 추가)되면 기존의 INSERT 코드는 모두 오류를 일으키기 때문이다. 항상 데이터를 추가할 열의 목록을 명시적으로 작성하는 것이 안전하고 좋은 습관이다. 물론 학습이나 테스트를 위한 것이라면 편의상 이런 방식을 사용해도 괜찮다.
한 번에 등록하기
insert into products(name, price, stock_quantity) values
('검정 양말', 5000, 100),
('갈색 양말', 5000, 150),
('흰색 양말', 5000, 200);
- Values에 여러 항목을 한 번에 넣어서 하나의 쿼리로 많은 데이터를 등록할 수 있다.
- 중간에 쉼표를 사용해서 데이터를 구분하면 된다.
Update 문법
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
- table_name : 데이터를 수정할 테이블의 이름이다.
- SET column1 = value1, ...: 수정할 열과 새로운 값이다. 쉼표(,)를 사용해 여러 열을 한 번에 수정할 수 있다.
- WHERE condition : 수정할 행을 식별하는 조건이다. 이 부분을 생략하면 테이블의 모든 행이 수정되므로 극도로 주의해야 한다.
update products
set price = 9800, stock_quantity = 580
where product_id = 1;
- 상품의 가격을 9800원으로 할인하고, 재고를 580개로 변경할 수 있다.
SQL 안전 업데이트 모드
UPDATE products
SET price = 990; -- WHERE product_id = 1; -- 실수로 생략
- where절을 생략하면 쇼핑몰의 모든 상품 가격이 990원이 된다(서비스가 망할 수도 있다.)
- 실행 결과: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
- MYSQL은 안전 업데이트 모드를 제공하여 이런 실수를 방지한다.
select @@sql_safe_updates;
- 실행 결과: 1
- 실행 결과 1은 안전 업데이트 모드가 활성화 상태이고 0은 비활성화 상태이다.
안전 업데이트 모드 활성화 상태에서는 데이터를 변경하거나 삭제할 때 WHERE 절에 기본키 컬럼을 반드시 지정해야 한다.(또는 LIMIT를 사용해서 변경하거나 삭제할 데이터의 양을 조절해야 한다. LIMIT는 뒤에서 배운다.)
그래서 기본 키 컬럼을 사용하지 않은 다음과 같은 SQL도 실행이 되지 않는다.
UPDATE products
SET price = 990
WHERE name = '베이직 반팔 티셔츠'; -- name 컬럼을 사용했다.
- 실행 결과: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
- 참고로 MySQL이 제공하는 안전 업데이트 모드의 기본 설정은 비활성화(0) 상태이다.
- 그런데 MySQL 워크벤치는 이런 실수를 방지하기 위해 MySQL에 접근할 때 안전 업데이트 설정을 활성화한다.
- MySql 서버(전역): 기본적으로 off(0)
- 애플리케이션 서버(커넥션): 기본적으로 off(0)
- MySql 워크벤치: 기본적으로 on(1)
완전 업데이트 모드 설정 변경
SET SQL_SAFE_UPDATES = 0; -- 안전 모드 제거
UPDATE products
SET price = 990;
SET SQL_SAFE_UPDATES = 1; -- 안전 모드 활성화
- 안전 모드를 끄고, 필요한 기능을 실행하고 나면 안전 모드를 다시 활성화해 주는 것이 안전하다.
- MySql 워크벤치의 기본 설정을 변경하고 싶다면, 메뉴바 > MySQLWorkbench Settings... > SQL Editor > 맨 아래의 Safe Updates 체크 해제
변경 대상을 먼저 확인하는 습관을 들이자. 예방이 최선이다. UPDATE 나 DELETE문을 실행하기 전에는, 반드시 동일한 WHERE절을 사용한 SELECT문을 먼 저 실행해서 내가 변경하려는 데이터가 정확히 맞는지를 눈으로 확인하는 습관을 들여야 한다!!!
Delete 문법
DELETE FROM table_name
WHERE condition;
- table_name : 데이터를 삭제할 테이블의 이름이다.
- WHERE condition : 삭제할 행을 식별하는 조건이다. UPDATE와 마찬가지로 이 부분을 생략하면 테이블의 모든 데이터가 삭제되는 재앙이 발생하므로 반드시 작성해야 한다.
DELETE FROM products
WHERE product_id = 1; -- 상품 ID가 1번이라고 가정
- product_id=1 베이직 반팔 티셔츠 상품이 제거된 것을 확인할 수 있다
Where절의 절대적인 중요성
DELETE FROM customers;
- DELETE는 UPDATE 보다 더 파괴적이다. UPDATE는 데이터를 잘못 바꿔도 원래 값을 추적할 여지라도 있지만, DELETE는 행 자체를 없애버린다. DELETE 문에서 WHERE 절을 빠뜨리는 것은 핵폭탄 발사 버튼을 누르는 것과 같다.
- 만약 안전 업데이트 모드가 활성화되어 있지 않다면 쇼핑몰의 모든 고객 정보가 순식간에 사라진다. 변명의 여지가 없는 대형 사고다. UPDATE와 마찬가지로, DELETE 역시 실행 전 SELECT 문으로 삭제 대상을 확인하는 것이 철칙이다
전체 UPDATE , DELETE를 실행했을 때 벌어지는 끔찍한 상황과 대처법
1) 사고 발생: WHERE 절 없는 UPDATE를 실행했다는 사실을 깨닫는다. 심장이 내려앉는다.
2) 즉시 보고 및 서비스 점검: 즉시 DBA를 호출하고, 상급자에게 상황을 보고한다. 가능하다면 추가적인 피해를 막기 위해 서비스를 점검 상태로 전환한다. 전문적인 지식을 갖춘 DBA가 있다면 데이터베이스 복원 기능으로 빠르게 복구할 수도 있다.
3) 백업 확인: 가장 먼저 확인해야 할 것은 가장 최근의 데이터베이스 백업이다. 정기적인 백업이 있었다면, 백업 시점 이후의 데이터 유실을 감수하고 복구(Restore)를 진행할 수 있다. 이것이 백업이 중요한 이유다.
4) 로그 분석: 백업이 없다면, 데이터베이스 로그를 분석하여 변경 이전의 값을 추적하는 복잡한 작업을 시도해 볼 수 있으나, 이는 매우 어렵고 시간이 오래 걸린다.
DELETE vs TRUNCATE
| 구분 | delete from table; | Truncate table table; |
| 종류 | DML(데이터 조작어) | DDL(데이터 정의어) |
| 처리 방식 | 한줄씩, 조건에 따라 삭제 가능(where 사용 가능) | 테이블 전체를 한번에 삭제(where 사용 불가) |
| 속도 | 느림(각 행의 삭제를 기록) | 매우 빠름(테이블을 잘라내고 새로 만드는 개념) |
| Auto Increment | 초기화되지 않음 | 1부터 다시 시작하도록 초기화된다. |
| 되돌리기(rollback) | 트랜잭션 내에서 rollback 가능 | rollback 불가능(즉시 적용) |
- "탈퇴한 회원 한 명의 정보만 지우고 싶다" 또는 "특정 조건에 맞는 주문 기록만 삭제하고 싶다" 와 같이 선별적인 삭제가 필요할 때는 DELETE를 사용해야 한다. 일반적인 비즈니스 로직은 항상 DELETE를 사용한다.
- "테스트용으로 넣었던 수백만 건의 데이터를 모두 지우고 처음부터 다시 시작하고 싶다"와 같이 테이블의 모든 데이터를 깨끗하게 비울 목적이라면 TRUNCATE가 훨씬 빠르고 효율적인 선택이다.
728x90
'데이터 베이스 > SQL 첫걸음(인프런 강의)' 카테고리의 다른 글
| Ch04. 조회와 정렬 - Select(조회) (0) | 2025.10.13 |
|---|---|
| Ch03. 데이터 관리 - 제약 조건 활용 (0) | 2025.10.08 |
| Ch03. 데이터 관리 - DDL(테이블 변경, 제거) (0) | 2025.10.08 |
| Ch03. 데이터 관리 - DDL(테이블 생성) (0) | 2025.10.08 |
| Ch02. 데이터 베이스 시작 - 제약 조건 (0) | 2025.10.04 |