김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • KMU_WINK
  • 로컬저장소
  • ㄱ
  • Remote저장소
  • GitHubDesktop
  • local저장소
  • 깃허브데스크탑
  • 원격저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

#3[DML] MySQL 에서 INSERT, DELETE, UPDATE 문을 사용해보기, sql_Safe_Updates모드
• 데이터베이스(DB)/__SQL__

#3[DML] MySQL 에서 INSERT, DELETE, UPDATE 문을 사용해보기, sql_Safe_Updates모드

2021. 5. 25. 02:36

본 포스트는 개인 스터디에 대한 정리 및 기록의 용도로써, 오개념이 존재 할 수 있습니다. 글은 상시 수정되며, 지적사항에 대해서 검토 후 수정하겠습니다.

본 포스트는 한국데이터진흥원 발간, SQL 전문가 가이드 2013Edition을 참고하였습니다.


지금까지 DDL을 사용하여 테이블단위에서 조작하는방법을 공부했는데, 이제부터 DML을 이용하여 테이블 속  행・열(튜플)들을 조작하는 방법을 공부하고 정리해보려고 한다. 먼저 DML을 공부하면서 느끼는 점은, 이 쿼리문을 열심히 공부해야겠다고 생각했다. 데이터베이스 공부하는 목적이 아마 원하는 데이터들을 데이터베이스에서 효율적이게 뽑아와서 사용하는거라고 생각하는데, 이 DML이 그런 역할을 하는거 같다. 


DML(Data Manipulation Language) 

  • 뜻 풀이 그대로 번역하면 데이터 조작어라는 뜻이다.
  • 자료들을 입맛에 맞게 입력 수정 삭제 조회하는데 사용된다.

 

- INSERT 문

  • 테이블에 데이터를 입력하는 방법이다.
  • 원하는 테이블 속 원하는 열들(colum)에 입력한다( 유형 1)
  • 원하는 테이블 전체에 값을 넣어준다. (유형 2)

PLAYER 테이블

현재 PLAYER 테이블이다. 이 테이블에 새로운 선수를 추가하고 싶을때 INSERT문을 사용한다. 

-- INSERT문의 형식 
INSERT INTO 테이블명( col_name1, col_name2, col_name3, col_name4)
VALUES ( col_name1에 넣을 데이터, col_name2에 넣을 데이터, col_name3에 넣을 데이터, col_name4에 넣을 데이터 );
--

-- 박지성 선수에 대한 데이터 추가하기 ( 유형 1 )
INSERT INTO PLAYER (PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('2002007', '박지성', 'K07', 'MF', 178, 73, 7);

넣어줄 열에 추가할 데이터를 1:1 매핑 되게 넣어주어야 한다. 문자는 ' ' 로 숫자일시에는 그냥 사용한다. 칼럼을 따로 지정해주지 않은 곳들에 대해서는 NULL 값이 입력 되었다.

박지성 선수에 대해 원하는 값들이 입력되어 새로운 행이 생겼다.

 

유형2 에 대한 적용을 해보자면 모든 열에 대해 값을 넣어줄거면 따로 열들을 지정해줄 필요가 없다. 

-- 이청용 선수 추가 ( 유형 2 )
INSERT INTO PLAYER
VALUES ('2002010', '이청용', 'K07', '', 'BlueDragon', '2002', 'MF', '17‘ , NULL, NULL, '1', 180, 69);

박지성 선수를 추가할때와 차이점을 찾아냈다면 정말 눈썰미가 좋다. 바로 NULL 값에 대한 처리인데, E_PLAYER_NAME에 열에는 NULL 이 아닌 ' '의 공백 문자가 추가 됐다. 이는 엄연히 NULL가 다르며 이런식으로 표현 할수 있다는 사실을 알아 두어야 한다.

이청용 선수 데이터 행이 추가 되었다.

 

INSERT문을 SELECT와 결합하여 사용 할 수 있는데, 아직 SELECT에 관한 이야기를 정리하지 않았기 때문에 이렇게 할수도 있다는 사실만을 염두해 두고 넘어가자.

INSERT INTO BLUE_DRAGON_TEAM1
SELECT PLAYER_ID, PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K07';

간단히 설명하자면, PLAYER 테이블에 TEAM_ID가 K07인 선수들중 PLAYER_ID, PLAYER_NAME, BACK_NO 만을 뽑아와 BLUE_DRAGON_TEAM1 테이블에 추가하라는 말이다. 주의할점은 BLUE_DRAGON_TEAM1가 미리 존재해야 한다. 이경우 CTAS를 사용하면 테이블이 미리 생성되고 튜플들이 삽입된다.


- DELETE 문

  • 테이블을 삭제하기 위해 사용한다.
  • 테이블의 스키마는 그대로 있지만, 튜플들만 삭제된다. 이는 TRUNCATE TABLE과 의미상은 같지만 로그를 DELETE문은 로그를 저장하기 때문에 전체 데이터를 지울경우는 부하가 생겨 권하지 않는다.
  • WHERE절과 함께 사용하여 튜플만 지우기도 한다.

 

DELETE문을 사용하여 값들을 지워 보겠다.

현재 PLAYER 테이블의 상태

-- 사용법, WHERE 은 사용해도 되고 안해도 됨
DELETE FROM 적용할테이블;
[WHERE 조건]
-- 

--박지성선수 튜플 지우기 PLAYER_ID 는 PK
DELETE FROM PLAYER
WHERE PLAYER_ID = '2002007';

박지성 선수는 사라졌다

이청용선수를 지우고 싶다. 그러나 PLAYER_ID는 기억이 안나고, 이름밖에 모른다. 이름을 통해서 지워보자

DELETE FROM PLAYER
WHERE PLAYER_NAME = '이청용';

에러가 발생했다.

safe_updates 모드 뭐라고 하면서 지워지지 않았다. 왜그런걸까? MySQL에서는 사용자가 실수로 여러개의 데이터를 지우는것을 방지하기 위해 PK가 아닌 열에 대해서는 Safe_updates 모드를 0으로 변경하고 지워줘야한다. 이말은 즉슨 2개이상의 데이터가 지워지는거를 방지해주는거다. 

SET sql_safe_updates=0; -- OFF
DELETE FROM PLAYER
WHERE PLAYER_NAME = '이청용';
SET sql_safe_updates=1; -- ON 

이청용 선수도 지워졌다.

이말은 PLAYER 테이블의 모든 튜플을 지워줄때도 safe_updates=0을 해야한다.

SET sql_safe_updates=0; -- 기본값은 1이다.
DELETE FROM PLAYER;

safe_updates=1 이면 지워지지 않는다.


-UPDATE 문

정보를 수정해줄때 사용한다.

-- 사용법
UPDATE 테이블명
SET 바꿀 값
WHERE 검색조건;
--

UPDATE PLAYER
SET BACK_NO = 99
WHERE PLAYER_ID = '2000062';

BACK_NO가 바뀜

 

 


오늘은 DML에서 INSERT와 DELETE 그리고 UPDATE를 정리하며 공부해봤다. 확실히 이렇게 하나하나 해보면서 기록하니까 기억에는 잘남는데 시간이 너무 오래걸린다. 뭐 좋은 방법이 없을까 늘 고민이다. 그래도 만드느게 재밌다. 다음에는 SELECT 절에 대해서 정리할건데 양이 많기때문에 몇개로 나눠서 정리해볼 생각이다.

 

'• 데이터베이스(DB) > __SQL__' 카테고리의 다른 글

#5 [DML] MySQL에서 WHERE 조건식 사용해보기 IN,LIKE,IS NULL,BETWEEN  (0) 2021.05.25
#4 [DML] MySQL에서 SELECT 사용해보기  (0) 2021.05.25
#2[DDL]_ MySQL 을 이용하여 제약조건 사용 및 DROP TABLE, ALTER TABLE 정리  (0) 2021.05.20
#1[DDL]_ MySQL 테이블 개념과 CREATE TABLE  (0) 2021.05.18
#0_SQL 기본 및 명령어 종류  (0) 2021.05.16
    '• 데이터베이스(DB)/__SQL__' 카테고리의 다른 글
    • #5 [DML] MySQL에서 WHERE 조건식 사용해보기 IN,LIKE,IS NULL,BETWEEN
    • #4 [DML] MySQL에서 SELECT 사용해보기
    • #2[DDL]_ MySQL 을 이용하여 제약조건 사용 및 DROP TABLE, ALTER TABLE 정리
    • #1[DDL]_ MySQL 테이블 개념과 CREATE TABLE
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바