VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
VALUES는 직접 입력한 행을 제공합니다. 그 자리에 쓴 SELECT는 서버가 계산한 행을 제공하므로, 쿼리할 수 있는 요약은 저장할 수 있는 요약입니다. 보고서 테이블을 채우는 방법이고, 행을 한 테이블에서 다른 테이블로 옮기는 방법입니다.
이 예제들은 INSERT의 sakila_practice 데이터베이스를 사용합니다. 시작하기 전에 거기 있는 설정 블록을 다시 실행한 다음, mysql -u root -p sakila_practice로 클라이언트를 여세요.
INSERT SELECT의 동작 방식
TARGET_TABLE을 쓰기 대상 테이블로, COLUMN_LIST를 그 테이블의 열로, SOURCE_COLUMNS를 쿼리가 반환하는 것으로, SOURCE_TABLE을 읽는 테이블로 바꾸세요.
VALUES 키워드는 없습니다. 열은 위치로 짝지어지므로, SELECT가 반환하는 첫 번째 것이 첫 번째로 지정한 열에 들어가고, 둘의 이름이 무엇인지는 상관없습니다. 쿼리가 반환하는 모든 행이 대상 테이블의 행이 됩니다.
예제
- 요약 저장
rating_count는 비어 있고 sakila.film이 답을 가지고 있습니다. 테이블을 database.table로 지정하면 다른 데이터베이스에서 읽으므로, 문 1개가 2개의 데이터베이스를 넘나들 수 있습니다.
GROUP BY가 5개의 행을 만들었고 5개의 행이 쓰였습니다.
film이 바뀌어도 아무것도 이 행을 갱신하지 않습니다.
- 들어가는 길에 값 만들기
SELECT는 무엇이든 계산할 수 있으므로, 들어가는 행이 그 모양 그대로 어딘가에 존재할 필요는 없습니다.
CONCAT으로 만들었고 날짜는 모든 행에 반복되는 상수입니다.
ERROR 1136은 2개의 목록 길이가 다르다는 뜻입니다
SELECT는 받아들여지고 엉터리 데이터를 씁니다. 먼저 SELECT를 따로 실행해서 무엇이 돌아오는지 읽으세요.
두 번째 실행은 테이블의 키와 만납니다
쿼리가 반환하는 모든 행이 테이블에 제시되고, 테이블의 규칙은 여전히 적용됩니다.rating이 기본 키이고 G는 이미 저장되어 있습니다. 한 번 만들고 마는 것이 아니라 새로 고치고 싶은 요약에는 upsert가 필요한데, 실패하는 대신 저장된 행을 갱신합니다.
요약
VALUES가 들어갈 자리에SELECT를 두고,VALUES키워드는 쓰지 마세요.- 열은 이름이 아니라 언제나 위치로 짝지어집니다.
ERROR 1136은 2개의 목록 길이가 다르다는 뜻으로 읽으세요.- 같은 문에서 다른 데이터베이스를 읽으려면 테이블을
database.table로 지정하세요. - 두 번째 실행은 다른 삽입과 마찬가지로 대상 테이블의 키에 부딪힙니다.
함께 보기
- INSERT — 직접 입력한 값을 받는 형태
- 여러 행 삽입 — 쿼리 없이 여러 행
- Upsert — 두 번째 실행이 충돌할 행 새로 고치기
- MySQL의 대량 삽입 — 큰 양을 옮기기, 그리고 그 비용