hyperskill - Inserting selected rows 원문
데이터를 작업 할 때면, 한 테이블에서 다른 테이블로 복사해야 하는 과제를 마주 할 것 입니다.
예를 들어, 만약 당신이 customers 테이블을 삭제하고,
그 모든 데이터를 새로운 테이블 users로 복사하고자 합니다.
당연하게, 당신은 정석대로 간단한 INSERT INTO 쿼리를 사용해서 수행 할 수 있습니다.
하지만, 이 결과는 오타 혹은 심지어 데이터 손실을 겪을 수 있습니다.
이 과정을 안전하게 만들기 위해, 당신은 두 개의 간단한 문법을 결합 할 수 있습니다.
INSERT INTO
and SELECT
이 두 문법을 어떻게 작업하는지 더 가까이 지켜봅시다.
Inserting selected rows - 선택된 줄들 삽입하기
우리의 초기 예제를 유지하고, 테이블 customers
를 봅시다.
customers
는 밑의 컬럼을 가지고 있습니다.
customer VARCHAR(40)
email VARCHAR(50)
zip_code(INT)
customer | zip_code | |
---|---|---|
Astoria hotel | hotelastora@hotel.com | 99501 |
Pasta Inc | pasta@inc.com | 85055 |
이제 우리는 새로운 테이블 users
를 가집니다.
users
는 밑의 컬럼을 가지고 있습니다.
user VARCHAR(40)
user_email VARCHAR(50)
zip_code INT
city VARCHAR(20)
users
테이블은 밑과 같이 이미 한 줄이 존재합니다.
user | user_email | zip_code | city |
---|---|---|---|
Tadfield Cinema | tadf@cinema.com | 56567 | Tadfield |
이제 customer 테이블의 정보를 users 테이블로 옮겨 봅시다.
flowchart LR
customer("customer")
email("email")
zip_code1('zip_code')
zip_code("zip_code")
zip_code
user("user")
user_email("user_email")
city("city")
subgraph customers
customer
email
zip_code1
end
subgraph users
user
user_email
zip_code
city
end
customer --> user
email --> user_email
zip_code1 --> zip_code
위의 작업은 INSERT INTO SELECT
문법으로 가능합니다.
밑의 간단한 쿼리가 users테이블에 필요한 모든 데이터를 삽입합니다.
INSERT INTO users (user, user_email, zip_code, city)
SELECT * from customers;
이 쿼리를 실행시켰을 때, 우리의 테이블 users는 밑과 같이 생길 겁니다. :
user | user_email | zip_code | city |
---|---|---|---|
Tadfield Cinema | tadf@cinema.com | 56567 | Tadfield |
Astoria hotel | hotelastoria@hotel.com | 99501 | NULL |
Pasta Inc | pasta@inc.com | 85055 | NULL |
customers테이블이 변하지 않는다는 걸 참고하세요 : 줄들을 복사했을 뿐, 이동시키진 않았습니다.
당신이 보다시피, 새로운 줄들은 users의 끝에 추가되었는데,
이는 간단한 INSERT INTO
쿼리로 새로운 정보를 추가 한 것과 같습니다.
INSERT INTO SELECT with WHERE - INSERT INTO SELECT 문법과 WHERE 문법
우리가 INSERT INTO SELECT
문법을 사용 할 때,
SELECT
문법 내부에 WHERE
절을 사용 할 수 있습니다.
지금 suppliers
테이블의 정보를 추가하는데, 이 테이블의 밑의 컬럼을 가집니다 :
supplier VARCHAR(40)
city VARCHAR(20)
supplier_email(45)
zip_code INT
supplier | city | supplier_email | zip_code |
---|---|---|---|
Tomato Inc | York | tomato@inc.uk | 01904 |
Potato Inc | London | Potato@inc.uk | 53342 |
만약, Tomato Inc에 대한 정보만 추가할 필요가 있다고 말한다면,
INSERT INTO users
SELECT
supplier,
supplier_email,
zip_code,
city
FROM
suppliers
WHERE
supplier = 'Tomato Inc';
여기서 우리는 SELECT
혹은 INSERT INTO
문법에서의 컬럼을 재정렬 해야 하는데,
이는 컬럼의 순서가 맞지 않기 때문입니다.
쿼리 실행 이후, users
테이블이 새로운 줄을 가집니다. :
user | user_email | zip_code | city |
---|---|---|---|
Tadfield Cinema | tadf@cinema.com | 56567 | Tadfield |
Astoria hotel | hotelastoria@hotel.com | 99501 | NULL |
Pasta Inc | pasta@inc.com | 85055 | NULL |
Tomato Inc | tomato@inc.uk | 01904 | York |
user_email
컬럼의 타입과 supplier_email
컬럼의 타입이 같지 않다는 것을 참고하세요 :
user_email VARCHAR(50)
supplier_email VARCHAR(45)
이 컬럼의 타입들이 호환 가능하기 때문에, 데이터를 변환할 수 있습니다.
그러므로, 타입이 호환 가능한지 체크하는 걸 기억해야 합니다.
그렇지 않다면, 에러가 납니다.
추가 내용 :
둘 다 VARCHAR() 로 호환 가능하더라도, 더 짧은 쪽에 데이터를 삽입 하는 경우가 있을 수도 있다.
이 때, 호환은 가능하지만, 실제 내부 스트링 데이터의 길이가 길어 짤리는 경우, 에러가 납니다.
Conclusion - 결론
여기 짧은 요약이 있습니다 :
한 테이블에서 다른 테이블로 데이터를 전송하려면, 밑의 쿼리 템플릿을 이용하세요 :
INSERT INTO table1 (column_1, column_2, ..., column_n)
SELECT
column_1,
column_2,
...,
column_n
FROM
table2
WHERE
condition;
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introducing to SQL' 카테고리의 다른 글
GROUP BY statement - GROUP BY 문법 (0) | 2024.04.28 |
---|---|
Aggregate functions - 집계 함수들 (0) | 2024.04.27 |
Updating selected rows - 선택된 줄들 업데이트하기 (1) | 2024.04.25 |
Basic UPDATE statement - 기초적인 UPDATE 문법 (0) | 2024.04.25 |
Types of JOINs - JOIN의 종류들 (0) | 2024.04.24 |