명령어 요약
INSERT INTO {table_name} (column1, column2, ... ) VALUES (data1-1, data1-2, ... ), (data2-1, data2-2, ... );
👉 테이블에 데이터를 추가UPDATE {table_name} SET {column_name}={new_data} WHERE {condition};
👉 테이블에 입력된 데이터를 수정DELETE FROM {table_name} WHERE {condition};
👉 테이블에 입력된 데이터를 삭제
: 데이터를 조작하는 쿼리문
ex) INSERT, UPDATE, DELETE
RDMBS의 종류와 각 버전에 따라서 DML 문법이 다를 수 있기 때문에, 공식문서에서 제공하는 메뉴얼의 SQL 문법을 참조하는 것이 좋습니다.
이하 1-1.~ 1-3.의 문법 표기는 참고사항 정도로 알아두자;
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{ {VALUES | VALUE} (value_list) [, (value_list)] ... }
[AS row_alias[(col_alias [, col_alias] ...)]]
[ON DUPLICATE KEY UPDATE assignment_list]
value:
{expr | DEFAULT}
value_list:
value [, value] ...
row_constructor_list:
ROW(value_list)[, ROW(value_list)][, ...]
assignment:
col_name =
value
| [row_alias.]col_name
| [tbl_name.]col_name
| [row_alias.]col_alias
assignment_list:
assignment [, assignment] ...
: 기존 테이블에 새 데이터(row)를 추가
대문자
: 키워드대괄호(”[]”)
: 해당 키워드나 표현식 자체가 선택 사항이다파이프(”|”)
: 해당 키워드나 표현식 중에서 단 하나만 선택해서 사용중괄호(”{}”)
: 괄호 내의 아이템 중에서 반드시 하나를 사용(필수)”...”
: 앞에 명시된 키워드나 표현식의 조합이 반복될 수 있음[LOW_PRIORITY | DELAYED | HIGH_PRIORITY]
LOW_PRIORITY, DELAYED, HIGH_PRIORITY 키워드 중에 하나를 선택할 수 있습니다. 다중 클라이언트의 요청을 처리하는 경우에 테이블에 락(lock)을 걸어주는 키워드입니다. 이는 데이터의 정합성을 위해서 다른 클라이언트가 테이블에서 읽지 않을 때까지 INSERT 실행이 지연시켜줍니다. MySQL의 SQL문을 실행해서 테이블에 정보를 기록해주는 MySQL 스토리지엔진에는 Innodb, MyISAM, MEMORY, 그리고 MERGE 등이 있는데, 해당 키워드는 MyISAM, MEMORY, MERGE와 같이 테이블 수준의 잠금을 사용하는 스토리지 엔진에만 영향을 줍니다. 쉽게 정리하면, MySQL 8.0 버전부터는 Innodb 스토리지 엔진을 기본으로 사용하기 때문에, 설정하지 않아도 되는 키워드입니다.
[IGNORE]
중복 키 에러가 발생했을 때 신규로 입력되는 레코드를 무시하는 키워드입니다.
[INTO]
INSERT INTO와 INSERT는 동일하게 동작합니다. INSERT INTO를 기본적으로 사용합니다.
[PARTITION (partition_name [, partition_name] ...)]
파티션 기능을 사용해서 테이블을 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리해서 관리하는 경우에 사용하는 키워드입니다.
[ON DUPLICATE KEY UPDATE assignment_list]
ON DUPLICATE KEY UPDATE 키워드를 사용하면 데이터를 추가할 때, UNIQUE 인덱스 또는 PRIMARY KEY에서 중복 값이 발생할 경우 기존 행을 업데이트할 수 있습니다.
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET assignment_list
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
value:
{expr | DEFAULT}
assignment:
col_name = value
assignment_list:
assignment [, assignment] ...
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
위스타그램 웹서비스에 새로운 사용자를 추가해보자
INSERT INTO users (name, email, password, age) VALUES ("Rebekah Johnson", "Glover12345@email.com", "password", 30);
INSERT INTO users (name, email, password, age) VALUES ("Fabian Predovic", "O'Connell12345@email.com", "password", 31);
INSERT INTO users (name, email, password, age) VALUES ("Elenor Gottlieb", "Skiles12345@email.com", "password", 22);
INSERT INTO users (name, email, password, age) VALUES ("Madge Ledner", "Quitzon12345@email.com", "password", 23);
확인: select * from users;
posts 테이블의 user_id 열(column)이 users 테이블의 pk를 참조하고 있는 FK(Foreign Key)이므로 user_id는 반드시 users 테이블에 존재하는 행(row)을 참조해야 된다
INSERT INTO 뒤에는 테이블 명과 칼럼값을 소괄호로 감싸 줍니다.
VALUES 뒤에는 실제로 넣을 값을 소괄호로 감싸주고 앞서 테이블의 칼럼을 지정한 순서대로 데이터를 넣으면 됩니다.
INSERT INTO posts (title, content, user_id) VALUES ("위코드 1일차", "HTML과 CSS 익숙해지기..", 1);
INSERT INTO posts (title, content, user_id) VALUES ("위코드 2일차", "Javascript 기본 문법 학습..", 1);
INSERT INTO posts (title, content, user_id) VALUES ("위코드 3일차", "웹서비스의 역사와 발전 세션을 듣고..", 1);
INSERT INTO posts (title, content, user_id) VALUES ("자료구조 1번", "BigO Notation이란 무엇인가?", 2);
INSERT INTO posts (title, content, user_id) VALUES ("자료구조 2번", "시간 복잡도와 공간 복잡도에 대해서..", 2);
확인: SELECT * FROM posts;
users 테이블에 존재하지 않는 user 데이터를 참조하는 경우에는 아래와 같은 에러가 발생하게 되니 참조 관계에 있는 테이블에 데이터를 추가할 때에는 주의
ex) user테이블에 존재하지 않는 id=100을 참조할 경우: Error!
UPDATE 문은 주로 하나의 테이블에 대해 한 건 또는 여러 건의 레코드를 수정
”Rebekah Johnson” 사용자가 등록했던 첫번째 게시물의 내용을 "HTML과 CSS 익숙해지기.."에서 “위코드 3개월 과정을 시작하며...”로 수정한다면
UPDATE table_reference SET column='' [WHERE where_condition]
SET column=’’
: 변경하고자 하는 열과 값을 지정.
=
: 값을 대입하는 대입 연산자.
갱신해야 할 열이 복수인 경우column=’value’, column=’value’
의 리스트 형식으로 지정.value
는 column의 자료형에 맞는 값을 지정.
WHERE
구에 조건을 지정하면 그에 일치하는 행을 셀 단위로 변경
WHERE
문은 프로그래밍 언어의 if 문. 조건을 주는 쿼리문 입니다.
UPDATE posts SET content='위코드 3개월 과정을 시작하며...' WHERE user_id=1 AND id=1;
id가 pk값이다.
UPDATE 명령의 WHERE 키워드 뒤에 where_condition에 일치하는 모든 행이 그대로 변경 대상이 된다
”Rebekah Johnson” 사용자가 등록했던 모든 게시물을 삭제하는 요청을 받았다면:
DELETE FROM tbl_name [WHERE where_condition]
DELETE 명령은 하나의 테이블에 대해 한 건 또는 여러 건의 행(row) 자체를 삭제.
UPDATE와 INSERTE와 같이 column을 별도로 명시해 그 열만 삭제할 수는 없다.
DELETE 역시 WHERE 구를 지정할 수도 있고, 생략할 수도 있다.
DELETE FROM posts WHERE user_id = 1;
확인: SELECT * FROM posts;
DELETE 명령 역시 WHERE 키워드 뒤에 where_condition에 일치하는 모든 행이 그대로 변경 대상이 됨