데이터 베이스/SQL 첫걸음(인프런 강의)

Ch03. 데이터 관리 - DML(등록, 수정, 삭제)

webmaster 2025. 10. 8. 18:05
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