일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 클러스터형인덱스
- GenAI
- 티스토리챌린지
- Linux
- PRIMARY KEY
- SQL
- RStudio
- R
- Github
- 제주2주살이
- digital marketing
- 혼공S
- 에이바우트
- 독후감
- 오블완
- 보조인덱스
- 스토어드 프로시저
- PRML
- 맛집
- 런던
- 디지털마케팅
- 책리뷰
- 제주도여행
- 김호연작가
- 제주도
- 혼자공부하는SQL
- Jupyter notebook
- 영국여행
- 유럽여행
- 스플라인
- Today
- Total
Soy Library
[혼공S] CH3-(3). 데이터 변경을 위한 SQL 문 본문
SELECT문은 이미 만들어져 있는 테이블에서 데이터를 추출하는 구문이다. 이 절에서는 데이터의 입력, 수정, 삭제를 하는 방법을 알아보려 한다.
새로운 데이터를 입력할 때에는 INSERT, 데이터를 수정할 때에는 UPDATE, 데이터를 삭제할 때에는 DELETE를 사용한다.
데이터 입력: INSERT
INSERT는 데이터를 삽입하는 명령이다. 기본적인 형식은 아래와 같다.
INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...) ;
위의 구문에서 테이블 다음에 오는 열의 리스트는 생략 가능하다. 하지만 VALUES 다음에 오는 값은 테이블의 열 개수와 동일해야 한다.
hongong1 이라는 테이블을 만들고 데이터를 입력해보자. 아래와 같이 쿼리문을 작성하면 테이블이 만들어진 것을 확인할 수 있다.
CREATE TABLE hongong1 (toy_id INT, toy_name CHAR(4), age INT) ; -- TABLE 만들기
INSERT INTO hongong1 VALUES (1, '우디', 25) ; -- 데이터 입력하기
SELECT * FROM hongong1 ;
열 이름을 입력하고 해당 데이터를 작성할 수 있느데, 열의 이름을 생략한 경우에 대해서는 NULL 값이 들어가게 된다.
INSERT INTO hongong1 (toy_id, toy_name) VALUES (2, '버즈') ; -- 열 이름 입력,
SELECT * FROM hongong1 ;
자동으로 증가하는 AUTO_INCREMENT
AUTO_INCREMENT는 앞 절에서도 봤듯이, 1부터 자동으로 증가하는 값을 입력해준다. 여기서 주의할 점은, AUTO_INCREMENT를 사용하는 열은 PRIMARY KEY로 지정해주어야 한다는 것이다.
-- hongong2 테이블 만들기
CREATE TABLE hongong2
(toy_id INT AUTO_INCREMENT PRIMARY KEY,
toy_name CHAR(4),
age INT) ;
-- 테이블에 데이터 입력하기
INSERT INTO hongong2 VALUES (NULL, '보핍', 25) ;
INSERT INTO hongong2 VALUES (NULL, '슬링키', 22) ;
INSERT INTO hongong2 VALUES (NULL, '렉스', 21) ;
SELECT * FROM hongong2 ;
(내가 중복해서 여러 개 만들고 지웠더니 toy_id의 번호가 7번부터 시작하는데,, 이건 어떻게 수정해야 할까,, 나중에 차차 알게 되겠지..?ㅎ)
AUTO_INCREMENT를 이용해서 계속 입력하다 보면, 어느 숫자까지 증가되었는지를 확인이 필요한데, 이는 다음과 같이 볼 수 있다.
SELECT last_insert_id() ;
AUTO_INCREMENT를 사용할 때, 시작을 100부터 하고싶다면 다음과 같이 설정할 수 있다.
-- AUTO_INCREMENT 100부터 시작
ALTER TABLE hongong2 AUTO_INCREMENT = 100 ;
INSERT INTO hongong2 VALUES (NULL, '재남', 35) ;
SELECT * FROM hongong2 ;
이번에는 AUTO_INCREMENT를 이용해서 번호가 1000부터 시작하는데, 3씩 증가하도록 만들어보자.
CREATE TABLE hongong3
(toy_id INT AUTO_INCREMENT PRIMARY KEY,
toy_name CHAR(4),
age INT) ;
ALTER TABLE hongong3 AUTO_INCREMENT = 1000 ;
SET @@AUTO_INCREMENT_INCREMENT = 3 ; -- 증가값은 3으로 지정
INSERT INTO hongong3 VALUES (NULL, '토마스', 20) ;
INSERT INTO hongong3 VALUES (NULL, '제임스', 23) ;
INSERT INTO hongong3 VALUES (NULL, '고든', 25) ;
SELECT * FROM hongong3 ;
여기서 시스템 변수라는 개념을 알아볼 필요가 있다. 시스템 변수란, MySQL에서 자체적으로 가지고 있는 설정값이 저장된 변수를 의미한다. 주로 MySQL의 환경과 관련된 내용이 저장되어 있다. 시스템 변수는 앞에 @@이 붙는 것이 특징이며, 시스템 변수의 값을 확인하려면 SELECT @@시스템변수를 실행하면 된다. 또한 전체 시스템 변수의 종류를 알고 싶다면 SHOW GLOBAL VARIABLES를 실행하면 된다.
SELECT @@AUTO_INCREMENT_INCREMENT ;
SHOW GLOBAL VARIABLES ;
다른 테이블의 데이터를 한 번에 입력하는 INSERT INTO ~ SELECT
만약 다른 테이블에 이미 데이터가 입력되어 있다면 INSERT INTO ~ SELECT 구문을 사용하여 해당 테이블의 데이터를 가져와서 한 번에 입력할 수 있다. 형식은 아래와 같다.
INSERT INTO 테이블_이름 (열_이름1, 열_이름2, ...)
SELECT 문 ;
여기서 주의할 점은, SELECT 문의 열 개수가 INSERT할 테이블의 열 개수와 동일해야 한다는 점이다. world 데이터베이스의 city 테이블을 이용해보도록 하자.
-- city 테이블의 행 개수 확인
SELECT COUNT(*) FROM world.city ;
-- city 테이블의 description 확인
DESC world.city ;
-- 맨 처음 다섯 개의 데이터 확인
SELECT * FROM world.city LIMIT 5 ;
city 테이블에서 도시이름(Name)과 인구(Population)를 가져오는 걸로 해보자. 먼저 하나의 테이블을 만들고, INSERT INTO 해당테이블 SELECT ~ 문을 이용하여 city테이블에서 데이터를 가져올 것이다.
-- 테이블 만들기
CREATE TABLE city_popul
(city_name CHAR(35),
population INT) ;
SELECT * FROM city_popul ;
-- city테이블에서 데이터 불러오기
INSERT INTO city_popul
SELECT Name, Population FROM world.city ;
SELECT * FROM city_popul ;
데이터 수정: UPDATE
데이터를 수정해야 한다면 UPDATE를 이용하여 할 수 있다. 기본 형식은 아래와 같다.
UPDATE 테이블_이름
SET 열1 = 값1, 열2 = 값2, ..
WHERE 조건 ;
※ UPDATE문 또는 DELETE문을 쓰기 전에 체크해야할 것이 있다. Edit > Preference > SQL Editor > Safe Updates (rejects UPDATEs and DELETEs with no restrictions) 의 체크 해제.
city_popul의 테이블에서 city_name 중 'Seoul'을 '서울'로 변경해보고자 한다.
-- UPDATE
USE market_db ;
SELECT * FROM city_popul ;
UPDATE city_popul
SET city_name = '서울'
WHERE city_name = 'Seoul';
SELECT * FROM city_popul
WHERE city_name = '서울' ;
한꺼번에 여러 값을 변경할 수도 있다. New York을 '뉴욕'과 뉴욕의 인구수를 9으로 변경해보고자 한다.
-- 한꺼번에 여러 데이터 변경
UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York' ;
SELECT * FROM city_popul WHERE city_name = '뉴욕' ;
WHERE가 없는 UPDATE 문
UPDATE문에서 WHERE 부분은 생략이 가능하지만, WHERE를 생략하게 된다면 모든 행의 데이터 값이 변경된다.
UPDATE city_popul
SET city_name = '서울' ; -- 실행하지 않음
전체 행의 데이터 값을 변경하는 경우는 아래의 경우에 효과적일 수 있다. 인구 수의 값이 크기 때문에, 만 명 단위로 변경하고자 한다.
UPDATE city_popul
SET population = population / 10000 ;
SELECT * FROM city_popul LIMIT 5 ;
데이터 삭제: DELETE
데이터의 행을 삭제해야 하는 경우에는 DELETE를 쓸 수 있다. 형식은 아래와 같다.
DELETE FROM 테이블이름 WHERE 조건 ;
city_popul 테이블에서 New로 시작하는 데이터를 도시를 삭제하고자 한다. 아래의 쿼리문을 시행하니 11개 정도 되었던 데이터가 삭제된 것을 확인할 수 있었다.
-- New로 시작하는 도시 출력
SELECT * FROM city_popul WHERE city_name LIKE "New%" ;
-- New로 시작하는 도시 삭제
DELETE FROM city_popul WHERE city_name LIKE "New%" ;
-- New로 시작하는 도시 재출력
SELECT * FROM city_popul WHERE city_name LIKE "New%" ;
만약 New로 시작하는 모든 데이터를 삭제하는 것이 아닌, 상위 다섯 개만 삭제하고 싶다면 아래처럼 LIMIT을 이용할 수 있다.
DELETE FROM city_popul WHERE city_name LIKE "New%" LIMIT 5 ;
대용량 테이블 삭제하기
sakila 데이터 베이스에 있는 country 테이블과 world 데이터 베이스에 있는 city 테이블을 복사해서, 삭제를 해보고자 한다.
-- sakila DB의 country 테이블 description
DESC sakila.country ;
SELECT * FROM sakila.country LIMIT 5 ;
SELECT count(*) FROM sakila.country ;
-- world DB의 city 테이블 description
DESC world.city ;
SELECT * FROM world.city LIMIT 5 ;
SELECT count(*) FROM world.city ;
-- create big table
CREATE TABLE big_table1 (SELECT * FROM world.city, sakila.country) ; -- 어떻게 44만개가 만들어졌는지 모르겠음.. JOINING시켜서 그런건가
SELECT * FROM big_table1 LIMIT 5 ;
CREATE TABLE big_table2 (SELECT * FROM world.city, sakila.country) ;
CREATE TABLE big_table3 (SELECT * FROM world.city, sakila.country) ;
-- 대용량 테이블 삭제하는 법
DELETE FROM big_table1 ; -- 시간이 오래 걸림
DROP TABLE big_table2 ; -- 테이블 자체를 삭제함. 속도 빠름.
TRUNCATE TABLE big_table3 ; -- 테이블의 구조는 남겨놓음. 속도 빠름.
Reference
혼자 공부하는 SQL, 우재남 지음
'Study > SQL' 카테고리의 다른 글
[혼공S] CH4-(2). 두 테이블을 묶는 조인 (0) | 2022.01.25 |
---|---|
[혼공S] CH4-(1). MySQL의 데이터 형식 (0) | 2022.01.23 |
[혼공S] CH3-(2). 좀 더 깊게 알아보는 SELECT문 (0) | 2022.01.10 |
[혼공S] CH3-(1). 기본 중에 기본 SELECT ~ FROM ~ WHERE (0) | 2022.01.09 |
[혼공S] CH2. 실전용 SQL 미리 맛보기 (3) | 2021.12.24 |