티스토리 뷰
안녕하세요, 끙정입니다.
오늘은 테이블에 레코드를 입력할 수 있는 삽입문에 대해서 알아보고자 합니다.
기본적으로는 INSERT를 생각하실 겁니다.
그 외에도 목적에 따라 INSERT SELECT라든지 CREATE SELECT 도 있습니다.
하나씩 찬찬히 뜯어보겠습니다.
1. INSERT
INSERT INTO 테이블 (필드목록) VALUES (값목록)
기본적인 INSERT 구문의 형식은 위와 같습니다.
구문 해석상 전치사 INTO가 꼭 필요한 것은 아니지만 SQL 표준에서는 INTO를 붙여야 합니다.
예외로 SQL Server나 Maria DB는 INTO를 생략하는 것을 허용하지만,
습관적으로 붙이는 것이 여러모로 좋습니다.
Oracle은 INTO를 넣어야 한다.
SQL Server와 Maria DB는 INTO를 넣지 않아도 문제는 없다.
모든 필드의 값을 넣어주지 않는다면 필드 목록을 지정해주어야 하지만
모든 필드의 값을 넣어주는 것이라면 필드목록을 지정하지 않더라도 VALUES만 순서대로 넣어주면 괜찮습니다.
/* 모든 필드의 값을 넣는 것이라면 필드목록을 생략해도 괜찮다. */
/* 다만 순서가 일치해야 한다. */
INSERT INTO tCity VALUES ('평택', 453, 51, 'n', '경기');
평택은 잘 들어가 있다.
필드 목록과 밸류는 일대일 대응을 하기 때문에
필드 목록을 지정해준다면 순서는 바뀌어도 상관이 없습니다.
/* name이 맨 뒤로 가더라도 잘 대응한다. */
INSERT tCity (area, popu, metro, region, name)
VALUES (453, 51, 'n', '경기', '평택');
평택은 잘 들어가 있다.
2. 확장 INSERT 문
INSERT 명령을 나열해 놓으면 여러 개의 행을 한 번에 삽입할 수 있습니다.
그러나 각 행마다 개별적으로 INSERT INTO 명령을 일일이 작성하면 쿼리가 너무 길어집니다.
그래서 일부 DBMS에서는 아래와 같은 문법을 허용하기도 합니다.
INSERT INTO tCity (name, area, popu, metro, region) VALUES
('서울', 605, 974, 'y', '경기'),
('부산', 765, 342, 'y', '경상'),
('오산', 42, 21, 'n', '경기'),
('청주', 940, 83, 'n', '충청'),
('전주', 205, 65, 'n', '전라'),
('순천', 910, 27, 'n', '전라'),
('춘천', 1116, 27, 'n', '강원'),
('홍천', 1819, 7, 'n', '강원');
"INSERT INTO 테이블 (필드 목록) VALUES"에 이어서
밑으로 레코드 값을 나열하는 것이지요.
매우 간소해지고 강력한 문법입니다.
그러나, 안타까운 점은 위 문법은 SQL 표준이 아닙니다.
그래서 오라클에서는 지원이 되지 않습니다.
그래도 MySQL과 Maria DB, SQL server, DB2, PostgreSQL 등의 DBMS에서는 지원을 하고 있습니다.
오라클에서는 오류가 뜨지만, SQL Server에서는 잘 작동된다.
3. INSERT SELECT
INSERT INTO는 대량의 정보를 한 번에 입력하기가 힘들었지만,
INSERT SELECT는 대량의 정보를 한 번에 처리하는 것이 가능합니다.
INSERT INTO 는 새로운 정보를 만들어서 입력해주는 것이라면,
INSERT SELECT는 기존에 다른 테이블에 존재하는 레코드를 복사해서 붙여 넣는 기능입니다.
그래서 INSERT 뒤에 SELECT가 붙습니다. SELECT로 복사할 레코드를 불러와줘야 하기 때문이죠.
INSERT INTO 대상테이블 (필드목록) SELECT 필드목록 FROM 원본테이블
앞부분은 INSERT INTO와 똑같고, VALUES가 들어가야 할 부분에 SELECT 문이 들어갑니다.
그리고 SELECT문은 우리가 아는 SELECT문을 그대로 집어넣으면 됩니다.
/* 실습용 테이블이 이거 뿐이라 어쩔 수 없이... */
INSERT INTO tStaff(name, depart, gender, joindate, grade, salary, score)
SELECT name, region, metro, '20210629', '신입', area, popu
FROM tCity
WHERE region = '경기';
위 쿼리는 tCity에 있는 region이 '경기'인 레코드를 가져와서 tStaff에 복사 붙여 넣어 달라는 명령입니다.
그래서 아래와 같이 서울과 오산이 입력된 것을 알 수 있습니다.
다소 안 맞지만, 잘 들어가긴 했습니다.
4. CREATE SELECT
CREATE SELECT는 INSERT SELECT와 유사하지만,
기존 테이블에 레코드를 삽입하는 것이 아닌,
새로운 테이블을 만들어 결과셋을 삽입하는 것입니다.
그래서 CREATE이 붙어 있습니다.
CREATE TABLE 대상테이블 AS SELECT 필드목록 FROM 원본테이블
당연하겠지만, 새로 생성하는 대상 테이블은 기존에 존재하는 테이블과 겹치면 안 됩니다.
원본을 손상시키지 않고 작업을 하고자 할 때 사본을 따로 만드는 용도로도 유용합니다.
tCity 테이블에서 경기 지역의 name, area, popu를 공유하는 tSudo 테이블을 만들어보겠습니다.
/* Oracle과 Maria DB의 CREATE SELECT 형식 */
CREATE TABLE tSudo AS SELECT name, area, popu, FROM tCity WHERE region = '경기';
tSudo 테이블이 잘 만들어진 것을 알 수 있습니다.
그런데 SQL Server는 CREATE SELECT 문을 조금 다르게 씁니다.
SELECT INTO 문법을 사용하고 있습니다.
형식은 아래와 같습니다.
SELECT (필드목록) INTO 대상테이블 FROM 원본테이블
사실 큰 차이는 없고, 해석상으로도 납득은 갑니다만,
오랜만에 쓰게 된다면 헷갈릴 여지가 다분합니다.
/* 예시 */
SELECT name, area, popu INTO tSudo FROM tCity WHERE region = '경기';
SELECT INTO로 잘 돌아갑니다.
사본 테이블을 만들어서 작업을 할 경우가 많기 때문에,
아래 쿼리는 유용하게 사용됩니다.
/* Oracle 사본 만들기 */
CREATE TABLE tStaff_6월18일 AS SELECT * FROM tStaff;
/* SQL Server 사본 만들기 */
SELECT * INTO tCityCopy FROM tCity;
CREATE SELECT 으로 사본을 만든 Oracle, SELECT INTO 로 사본을 만든 SQL Server
그만 알아보겠습니다.
출처
http://www.yes24.com/Product/Goods/101637633
'SQL' 카테고리의 다른 글
제약과 무결성에 대해 알아보자 (feat. NULL, DEFAULT, CHECK) (0) | 2023.02.03 |
---|---|
삭제와 갱신에 대해서 알아보자 (feat. DELETE, TRUNCATE, UPDATE) (0) | 2023.01.29 |
그룹핑을 알아보자 (feat.GROUP BY, HAVING) (0) | 2023.01.29 |
집계함수를 알아보자 (feat.COUNT, SUM, AVG ...) (0) | 2023.01.26 |
효율적으로 출력하는 법을 알아보자 (feat. DISTINCT, ROWNUM, TOP, LIMIT, OFFSET FETCH) (2) | 2023.01.26 |
- Total
- Today
- Yesterday
- condenast
- Apple
- SSI
- sql
- ai pc
- Amazon
- searchgpt
- Meta
- alexa
- IDC
- Samsung
- apple intelligence
- aitv
- Intel
- perplexity
- datacenter
- 액침냉각
- aichip
- sb1047
- galaxyai
- ChatGPT
- genai
- Nvidia
- OpenAI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |