BE_[Database] MySQL and SQL_data 추가/수정/삭제_10.31

송철진·2022년 10월 30일
0

명령어 요약

  • 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};
    👉 테이블에 입력된 데이터를 삭제

1. DML(Data Manipulation Language)

: 데이터를 조작하는 쿼리문

ex) INSERT, UPDATE, DELETE

RDMBS의 종류와 각 버전에 따라서 DML 문법이 다를 수 있기 때문에, 공식문서에서 제공하는 메뉴얼의 SQL 문법을 참조하는 것이 좋습니다.

이하 1-1.~ 1-3.의 문법 표기는 참고사항 정도로 알아두자;

1-1. 문법 표기

1-1-1.INSERT

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에서 중복 값이 발생할 경우 기존 행을 업데이트할 수 있습니다.

1-1-2. UPDATE

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] ...

1-1-3. DELETE

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

1-2. 데이터 추가

위스타그램 웹서비스에 새로운 사용자를 추가해보자

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 테이블에 게시물을 저장하기 위해서는 제목(title), 내용(content), 작성자(user_id) 정보가 필요

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!

1-3. 데이터 수정

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에 일치하는 모든 행이 그대로 변경 대상이 된다

1-4. 데이터 삭제

”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에 일치하는 모든 행이 그대로 변경 대상이 됨

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글