INSERT INTO
다른 테이블의 입력을 사용하여 테이블을 만들려고 합니다. 이것은 많은 데이터베이스 엔진에서 전적으로 실현 가능하지만, 항상 엔진의 올바른 구문 SQL
( MySQL , Oracle , SQL Server , Informix 및 DB2 ) 을 기억하는 데 어려움을 겪고 있습니다.
기본 데이터베이스에 대해 걱정하지 않고 값을 삽입 할 수 있는 SQL 표준 (예 : SQL-92 ) 에서 나오는 은색 불릿 구문이 있습니까?
INSERT INTO
다른 테이블의 입력을 사용하여 테이블을 만들려고 합니다. 이것은 많은 데이터베이스 엔진에서 전적으로 실현 가능하지만, 항상 엔진의 올바른 구문 SQL
( MySQL , Oracle , SQL Server , Informix 및 DB2 ) 을 기억하는 데 어려움을 겪고 있습니다.
기본 데이터베이스에 대해 걱정하지 않고 값을 삽입 할 수 있는 SQL 표준 (예 : SQL-92 ) 에서 나오는 은색 불릿 구문이 있습니까?
답변:
Claude Houle의 답변 : 제대로 작동해야하며 여러 열과 다른 데이터도 가질 수 있습니다.
INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT table2.column1, table2.column2, 8, 'some string etc.'
FROM table2
WHERE table2.ID = 7;
이 구문은 Access, SQL 2000 / 2005 / Express, MySQL 및 PostgreSQL에서만 사용되었으므로 이에 대해 다루어야합니다. SQLite3에서도 작동합니다.
INSERT
다른 테이블에서 다중 값으로 하나의 값만 얻으려면 SQLite3에서 다음을 수행했습니다.
INSERT INTO column_1 ( val_1, val_from_other_table )
VALUES('val_1', (SELECT val_2 FROM table_2 WHERE val_2 = something))
두 답변 모두 Informix에서 제대로 작동하며 기본적으로 표준 SQL입니다. 즉, 표기법 :
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
Informix와 잘 작동하며 모든 DBMS를 기대합니다. (5 년 또는 그 이전에, 이것은 MySQL이 항상 지원하지 않았던 종류입니다. 이제는 이러한 종류의 표준 SQL 구문을 지원하고 AFAIK는이 표기법에서 정상적으로 작동합니다.) 열 목록 선택 사항이지만 대상 열을 순서대로 표시하므로 SELECT 결과의 첫 번째 열이 나열된 첫 번째 열 등으로 이동합니다. 열 목록이없는 경우 SELECT 결과의 첫 번째 열은 목표 테이블의 첫 번째 열.
시스템마다 다른 점은 다른 데이터베이스에서 테이블을 식별하는 데 사용되는 표기법입니다. 표준은 데이터베이스 간 (DBMS 간) 작업에 대해서는 아무 말도하지 않습니다. Informix에서는 다음 표기법을 사용하여 테이블을 식별 할 수 있습니다.
[dbase[@server]:][owner.]table
즉, 데이터베이스를 지정하여 선택적으로 해당 데이터베이스가 현재 서버에없는 경우 해당 데이터베이스를 호스팅하는 서버를 식별 한 다음 선택적 소유자, 점 및 마지막으로 실제 테이블 이름을 지정할 수 있습니다. SQL 표준은 Informix가 소유자라고 부르는 것에 스키마라는 용어를 사용합니다. 따라서 Informix에서 다음 표기법 중 하나가 테이블을 식별 할 수 있습니다.
table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table
일반적으로 소유자는 인용 할 필요가 없습니다. 그러나 따옴표를 사용하는 경우 소유자 이름의 철자를 정확하게 입력해야합니다. 대소 문자를 구분합니다. 그건:
someone.table
"someone".table
SOMEONE.table
모두 같은 테이블을 식별합니다. Informix의 경우 소유자 ANSI 이름이 대문자로 변환되는 MODE ANSI 데이터베이스와 약간의 복잡성이 있습니다 (informix는 예외). 즉, 일반적으로 사용되지 않는 MODE ANSI 데이터베이스에서 다음을 작성할 수 있습니다.
CREATE TABLE someone.table ( ... )
시스템 카탈로그의 소유자 이름은 'someone'이 아닌 "SOMEONE"입니다. 소유자 이름을 큰 따옴표로 묶으면 구분 식별자처럼 작동합니다. 표준 SQL을 사용하면 구분 식별자를 여러 곳에서 사용할 수 있습니다. Informix를 사용하면 소유자 이름 주위에서만 사용할 수 있습니다. 다른 상황에서 Informix는 작은 따옴표로 묶은 문자열을 문자열로 구분하고 큰 따옴표로 묶은 문자열을 구분 식별자로 분리하는 대신 작은 따옴표와 큰 따옴표로 묶은 문자열을 문자열로 처리합니다. (물론, 완전성을 위해, 어떤 값으로도 설정할 수있는 환경 변수 DELIMIDENT가 있지만, Y가 가장 안전합니다. 큰 따옴표는 항상 구분 된 식별자를 둘러싸고 작은 따옴표는 항상 문자열을 둘러싸고 있음을 나타냅니다.)
MS SQL Server는 대괄호로 묶인 [구분 식별자]를 사용합니다. 그것은 이상하게 보이고 SQL 표준의 일부가 아닙니다.
다른 테이블의 레코드를 거의 원하지 않을 때 첫 번째 답변에 무언가를 추가하려면 (이 예제에서는 하나만) :
INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
VALUES (value1, value2,
(SELECT COLUMN_TABLE2
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);
하위 쿼리를 선택하여 삽입하는 두 가지 방법.
1. SELECT 하위 쿼리를 사용하여 한 행 으로 결과를 반환하는 방법 .
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');
이 경우 SELECT 하위 쿼리는 WHERE 조건 또는 SUM, MAX, AVG 등의 SQL 집계 함수를 기반으로 한 행의 결과 만 반환한다고 가정합니다. 그렇지 않으면 오류가 발생합니다.
2. SELECT 하위 쿼리를 사용하여 여러 행 으로 결과를 반환하는 방법 .
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;
두 번째 방법은 두 경우 모두에 적용됩니다.
INSERT INTO
부품의 모든 열에 값을 제공하는 경우 부품 의 열을 지정하지 않고 수행 할 수 있습니다 SELECT
.
table1에 두 개의 열이 있다고 가정 해 봅시다. 이 쿼리는 작동해야합니다.
INSERT INTO table1
SELECT col1, col2
FROM table2
이 WOULD NOT 작동하지 않습니다 (에 대한 값 col2
이 지정되지 않았습니다).
INSERT INTO table1
SELECT col1
FROM table2
MS SQL Server를 사용하고 있습니다. 다른 RDMS의 작동 방식을 모르겠습니다.
이것은 select와 함께 값을 사용하는 또 다른 예입니다.
INSERT INTO table1(desc, id, email)
SELECT "Hello World", 3, email FROM table2 WHERE ...
테이블 열 순서가 알려진 경우 간단한 삽입 :
Insert into Table1
values(1,2,...)
간단한 삽입 언급 열 :
Insert into Table1(col2,col4)
values(1,2)
테이블 (# table2)의 선택된 열 수가 삽입 테이블 (Table1)과 같은 경우 대량 삽입
Insert into Table1 {Column sequence}
Select * -- column sequence should be same.
from #table2
원하는 테이블 열 (table1)에만 삽입하려는 경우 대량 삽입 :
Insert into Table1 (Column1,Column2 ....Desired Column from Table1)
Select Column1,Column2..desired column from #table2
from #table2
다음은 둘 이상의 테이블을 사용하여 소스를 가져 오는 또 다른 예입니다.
INSERT INTO cesc_pf_stmt_ext_wrk(
PF_EMP_CODE ,
PF_DEPT_CODE ,
PF_SEC_CODE ,
PF_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PF_SEP_TAG ,
PF_SOURCE)
SELECT
PFl_EMP_CODE ,
PFl_DEPT_CODE ,
PFl_SEC ,
PFl_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PFl_SEP_TAG ,
PF_SOURCE
FROM cesc_pf_stmt_ext,
cesc_pfl_emp_master
WHERE pfl_sep_tag LIKE '0'
AND pfl_emp_code=pf_emp_code(+);
COMMIT;
SELECT 절에 괄호를 사용 하여 INSERT하십시오. 예를 들면 다음과 같습니다.
INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
'col1_value',
'col2_value',
(SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
'col3_value'
);
여러 테이블에서 삽입하는 방법은 다음과 같습니다. 이 특정 예는 다 대다 시나리오에서 맵핑 테이블이있는 위치입니다.
insert into StudentCourseMap (StudentId, CourseId)
SELECT Student.Id, Course.Id FROM Student, Course
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'
(학생 이름과 일치하면 하나 이상의 값을 반환 할 수 있지만 아이디어를 얻습니다. ID가 ID 열이고 알 수없는 경우 ID 이외의 항목과 일치해야합니다.)
Microsoft SQL Server의 경우 MSDN에서 제공되는 SYNTAX를 해석하는 방법을 배우는 것이 좋습니다. Google에서는 구문을 찾는 것이 그 어느 때보 다 쉬워졌습니다.
이 특별한 경우에는
Google : 사이트 삽입 : microsoft.com
첫 번째 결과는 http://msdn.microsoft.com/en-us/library/ms174335.aspx입니다.
페이지 맨 위에 제공된 구문을 해석하기 어려운 경우 예제 ( "SELECT 및 EXECUTE 옵션을 사용하여 다른 테이블에서 데이터 삽입")로 스크롤하십시오.
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table <<<<------- Look here ------------------------
| execute_statement <<<<------- Look here ------------------------
| <dml_table_source> <<<<------- Look here ------------------------
| DEFAULT VALUES
}
}
}
[;]
다른 RDBMS에도 적용 할 수 있습니다. 모든 제품 IMO에 대한 모든 구문을 기억할 필요는 없습니다.
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT COLUMN_NAME
FROM ANOTHER_TABLE_NAME
WHERE CONDITION;
select *
into tmp
from orders
멋지게 보이지만 tmp가 존재하지 않는 경우에만 작동합니다 (만들고 채워짐). (SQL 서버)
기존 tmp 테이블에 삽입하려면 다음을 수행하십시오.
set identity_insert tmp on
insert tmp
([OrderID]
,[CustomerID]
,[EmployeeID]
,[OrderDate]
,[RequiredDate]
,[ShippedDate]
,[ShipVia]
,[Freight]
,[ShipName]
,[ShipAddress]
,[ShipCity]
,[ShipRegion]
,[ShipPostalCode]
,[ShipCountry] )
select * from orders
set identity_insert tmp off
INSERT VALUES 라우트에서 여러 행을 삽입하는 경우 괄호를 사용하여 VALUES를 세트로 구분해야합니다.
INSERT INTO `receiving_table`
(id,
first_name,
last_name)
VALUES
(1002,'Charles','Babbage'),
(1003,'George', 'Boole'),
(1001,'Donald','Chamberlin'),
(1004,'Alan','Turing'),
(1005,'My','Widenius');
그렇지 않으면 "열 개수가 행 1의 값 개수와 일치하지 않습니다"라는 MySQL 객체가 생겨 마지막으로 조치를 취할 때 사소한 게시물을 작성하게됩니다.
열 이름을 쓰지 않고 테이블에 일부 데이터를 삽입하려는 경우.
INSERT INTO CUSTOMER_INFO
(SELECT CUSTOMER_NAME,
MOBILE_NO,
ADDRESS
FROM OWNER_INFO cm
WHERE ID>100)
테이블이있는 곳 :
CUSTOMER_INFO || OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS || CUSTOMER_NAME | MOBILE_NO | ADDRESS
--------------|-----------|--------- || --------------|-----------|---------
A | +1 | DC || B | +55 | RR
결과:
CUSTOMER_INFO || OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS || CUSTOMER_NAME | MOBILE_NO | ADDRESS
--------------|-----------|--------- || --------------|-----------|---------
A | +1 | DC || B | +55 | RR
B | +55 | RR ||