CRUD 요약
SELECT | INSERT | UPDATE | DELETE |
SELECT FROM WHERE | INSERT INTO VALUES | UPDATE SET WHERE | DELETE FROM WHERE |
도메인, 키, 엔터티무결성, 참조무결성 위반 가능 | 도메인, 키, 엔터티무결성, 참조무결성 위반 가능 | 참조무결성 위반 가능 |
DML이란? |
1) SELECT : 데이터 검색
2) INSERT : 데이터 추가
3) UPDATE : 데이터 수정
4) DELETE : 데이터 삭제
위 4가지가 일반적으로 DML로 불리는데
SELECT는 DQL(데이터 질의 언어, Data Query Language)로 따로 분리해서 보기도 하고
DML에 포함해서 보기도 한다
아무튼 DQL + DML = CRUD이며
CRUD란 Create, Read, Update, Delete의 약자로 일반적으로 데이터베이스에서 많이 수행하는 네 가지 작업을 의미
CRUD만 익혀도 대부분의 프로그램은 다 만들 수 있음
- 단위 : Row(가로 줄, 행 단위)
- DML만 COMMIT/ROLLBACK이 가능함, 다른 언어들은 커밋/롤백 불가능
0. SELECT |
SELECT는 아래 글에서 기본 SQL 문법과 함께 정리해뒀음
https://smallpants.tistory.com/90
1. INSERT |
INSERT INTO - 데이터 삽입
스키마도 만들고 테이블도 만들었으면 이제 데이터를 넣을 차례
- 도메인, 키, 엔터티무결성, 참조무결성 4가지 제약조건 위반 가능
INSERT INTO people
(person_id, person_name, age, birthday)
VALUES (1, '홍길동', 21, '2000-01-31');
-- 모든 컬럼에 값 넣을 때는 컬럼명들 생략 가능
INSERT INTO people
VALUES (2, '전우치', 18, '2003-05-12');
-- 일부 컬럼에만 값 넣기 가능 (NOT NULL은 생략 불가)
INSERT INTO people
(person_id, person_name, birthday)
VALUES (3, '임꺽정', '1995-11-04');
-- 자료형에 맞지 않는 값은 오류 발생
INSERT INTO people
(person_id, person_name, age, birthday)
VALUES (1, '임꺽정', '스물여섯', '1995-11-04');
-- 여러 행을 한 번에 입력 가능
INSERT INTO people
(person_id, person_name, age, birthday)
VALUES
(4, '존 스미스', 30, '1991-03-01'),
(5, '루피 D. 몽키', 15, '2006-12-07'),
(6, '황비홍', 24, '1997-10-30');
GUI로는 아래처럼 SELECT문의 결과 아래에 값을 추가로 적고 Apply를 누르면 insert문 자동 작성 됨
만약 CREATE할때 제약을 걸어뒀다면 잘못된 값을 입력시도하면 오류가 나면서 INSERT 거절됨
2. DELETE |
DELETE - 주어진 조건의 행 삭제하기
- 참조무결성 위반 가능하며 위반시
- RESTRICT(연산 거절)
- CASCADE(참조하는 모든 튜플 연쇄적으로 삭제)
- SET NULL(참조하는 외래키를 NULL로 설정)
조취를 취할 수 있음
- CASCADE가 참조무결성 조건에 명시되면 여러 튜플이 삭제될 가능성이 있음
MySQL Workbench에서 DELETE를 사용하려는 경우 안전장치가 걸려있기 때문에 먼저 설정을 변경해줘야 함
※ Preferences > SQL Editor > Safe Updates 항목 체크오프하고 다시 접속
Preferences는 아래 사진처럼 Workbench 오른쪽위에 있는 해당 아이콘임
다시 접속은 다 껐다 킬 필요 없이 아래에 mydb 옆의 x만 눌렀다가 다기 홈에서 클릭해서 들어오면 됨
DELETE FROM businesses
WHERE status = 'CLS';
-- 매우 주의해야할 것은 WHERE문 빼먹고 안쓰면 테이블 다 날릴 수 있음
-- WHERE문을 안쓰면 DROP businesses와 같게 됨
DELETE FROM businesses;
-- 이런식으로 테이블 다 날리지 않게 주의하기
-- 만약 id가 18이었던 화룡각, 19였던 철구분식, 20이었던 얄코렐라를 DELETE한 후에
-- 아래처럼 다시 INSERT하는 경우 각 튜플의 id가 원래 값인 18, 19, 20이 들어감
-- 즉 DELETE는 지워도 값을 기억하고 있다는 것
INSERT INTO businesses (fk_section_id, business_name, status, can_takeout)
VALUES (3, '화룡각', 'OPN', 1),
(2, '철구분식', 'OPN', 1),
(5, '얄코렐라', 'RMD', 1);
반면 TRUNCATE문은 아예 테이블을 삭제했다가 다시 만드는 초기화의 개념
즉 삭제 전의 값을 기억하지 않음
즉 테이블 정보를 아예 초기화할땐 DELETE가 아니라 TRUNCATE를 사용
(소수점 자르는 함수 TRUNCATE와 이름만 같고 다른 기능임)
TRUNCATE businesses;
-- TRUNCATE로 데이터를 다 날리고 아래처럼 추가를 하면
-- DELETE와 달리 id가 1, 2, 3으로 시작됨
-- 즉 완전 전체 초기화를 하려면 TRUNCATE를 쓰면 된다
INSERT INTO businesses (fk_section_id, business_name, status, can_takeout)
VALUES (3, '화룡각', 'OPN', 1),
(2, '철구분식', 'OPN', 1),
(5, '얄코렐라', 'RMD', 1);
3. UPDATE |
UPDATE - 주어진 조건의 행 수정하기
- 도메인, 키, 참조무결성. not null 제약조건 위반 가능
- 삭제 후 삽입연산과 동일하므로 해당 상황에서 발생하는 제약조건 위반 가능
UPDATE menus
SET menu_name = '삼선짜장'
WHERE menu_id = 12;
-- 테이블명은 menus
-- 애트리뷰트명은 menu_name
-- 조건은 menu_id = 12
-- 즉 menus테이블에서 menu_id가 12인 튜플의 menu_name값을 삼선짜장으로 바꾼다
-- 여러 칼럼 수정하기
UPDATE menus
SET
menu_name = '열정떡볶이',
kilocalories = 492.78,
price = 5000
WHERE
fk_business_id = 4
AND menu_name = '국물떡볶이';
컬럼 데이터 활용해서 수정하기
UPDATE menus
SET price = price + 1000
WHERE fk_business_id = 8;
UPDATE menus
SET menu_name = CONCAT('전통 ', menu_name)
WHERE fk_business_id IN (
SELECT business_id
FROM sections S
LEFT JOIN businesses B
ON S.section_id = B.fk_section_id
WHERE section_name = '한식'
);
UPDATE문도 WHERE문을 안붙이면 모든 행이 값이 변해버림
UPDATE menus
SET menu_name = '획일화';
★ DELETE와 UPDATE는 WHERE문 안붙이면 사고 날수 있으니 꼭 붙이는거 신경쓰기
※ 출처 얄코님 MySQL강의 무료파트