데이터 갱신
데이터 삽입
기존의 테이블에 레코드를 삽입할 때 INSERT문을 사용한다. 참조되는 테이블에 레코드가 삽입되는 경우에는 참조 무결성 제약 조건이 위배되지 않으나 참조하는 테이블에 레코드가 삽입되는 경우에는 참조 무결성 제약 조건을 위배할 수 있으므로, 참조 무결성 제약 조건을 설정하지 않은 상태에서 참조하는 테이블에 레코드를 삽입할 때에는 주의가 필요하다. INSERT문은 테이블에 한 번에 한 레코드씩 삽입하는 것과 한 번에 여러 개의 레코드를 삽입할 수 있는 것으로 구분한다. 한 번에 한 레코드씩 삽입하는 INSERT문의 구문은 아래와 같다. INTO절에서 컬럼의 리스트는 생략할 수 있다. 생략한 경우에는 VALUES절의 값의 순서가 테이블 내의 컬럼의 순서와 일치해야 한다.
INSERT
INTO 테이블(컬럼1, 컬럼2, …)
VALUES (값1, 값2, …)
|
예제 1 |
문제
athlete 테이블에 2008 베이징 올림픽 펜싱 은메달리스트 남현희 선수의 정보를 입력하는 예제이다.
SQL문 1
INSERT INTO athlete (name, gender, nation_code, event)
VALUES ('Nam Hyun-Hee', 'W', 'KOR', 'Fencing');
|
SQL문 2
SELECT name, gender, nation_code, event
FROM athlete
ORDER BY code DESC;
|
결과 2
no
|
name
|
nation_code
|
event
|
1
|
Nam Hyun Hee
|
KOR
|
Fencing
|
2
|
Zulianello Clavdio F
|
ARG
|
Volleyball
|
3
|
Zuelow Andreas
|
GDR
|
Boxing
|
4
|
Zimmermann Kathrin
|
GDR
|
Swimming
|
5
|
Zilporitee Laima
|
URS
|
Cycling
|
6
|
Zheng Meizhu
|
CHN
|
Volleyball
| |
|
설명
INTO절에 컬럼을 열거하지 않으면 테이블 생성시에 지정하였던 순서대로 컬럼 값을 열거해야 하며, 널 값을 갖는 컬럼을 생략할 수 없다. 컬럼의 값을 생략하고 입력하면 디폴트 값이 입력된다.
| |
예제 2 |
문제
오늘 올림픽이 개최했다고 가정하고 Olympic 테이블에 관련 정보를 입력하라. 단, 개최 날짜와 폐막 날짜는 SYSDATE 함수를 사용하라.
SQL문 1
INSERT INTO olympic
VALUES (2009, 'Korea', 'Seoul', SYSDATE, SYSDATE + 14, NULL, NULL, 'The 2009 Olymp..…');
|
SQL문 2
SELECT host_year, host_nation, opening_date, closing_date
FROM OLYMPIC
ORDER BY host_year DESC;
|
결과 2
no
|
host_year
|
host_nation
|
opening_date
|
closing_date
|
1
|
2009
|
Korea
|
2009-11-10
|
2009-11-24
|
2
|
2004
|
Greece
|
2004-08-13
|
2004-08-29
|
3
|
2000
|
Australia
|
2000-09-15
|
2000-10-01
|
4
|
1996
|
USA
|
1996-07-19
|
1996-08-09
|
5
|
1992
|
Spain
|
1992-07-25
|
1992-08-09
|
6
|
1988
|
Korea
|
1988-09-17
|
1988-10-02
| |
|
설명
SYSDATE 대신 ‘2009-11-10’과 같은 기본 형을 사용해도 된다.
| |
예제 3 |
문제
NATION_CODE 컬럼과 GOLD 컬럼을 가진 NATION_GOLD_COUNT 테이블을 생성하고 PARTICIPANT 테이블에서 GOLD 개수가 30개 이상인 NATION_CODE와 GOLD를 값을 NATION_GOLD_COUNT 테이블에 추가하라.
SQL문 1
CREATE TABLE nation_gold_count (
nation_code VARCHAR(3),
gold INT);
|
SQL문 2
INSERT INTO nation_gold_count (nation_code, gold)
SELECT nation_code, gold
FROM participant
WHERE gold > 30;
|
SQL문 3
SELECT *
FROM nation_gold_count;
|
결과 3
NO
|
nation_code
|
gold
|
1
|
CHN
|
32
|
2
|
USA
|
36
|
3
|
RUS
|
32
|
4
|
USA
|
37
|
5
|
USA
|
44
|
6
|
GER
|
33
|
7
|
USA
|
37
|
8
|
EUN
|
45
|
9
|
USA
|
36
|
10
|
GDR
|
37
|
11
|
URS
|
55
| |
|
설명
SQL문 2를 보면 SELECT문이 있는데, SELECT 되는 컬럼값의 타입이 INSERT되는 테이블의 컬럼값의 타입과 같을 경우 SELECT된 모든 데이터들이 해당 테이블에 입력된다. | |
테이블에 한 번에 여러 개의 레코드들을 삽입하는 INSERT문의 구문은 아래와 같다. SELECT문의 수행 결과로 검색된 레코드들이 한꺼번에 테이블로 입력된다.
이런 형식의 구문에는 VALUES절이 사용되지 않는다.
INSERT
INTO 테이블(컬럼1, 컬럼2, …)
SELECT … FROM … WHERE …;
|
예제 4 |
문제
NATION 테이블에 새로운 행을 추가 하되, VALUES 안의 값들 중에 올림픽 개최 날이 1988년인 나라 명과 경기장 이름이 Seoul Olympic Stadium인 주소를 SELECT문을 이용하여 값을 구한 다음 INSERT하는 쿼리를 만들어라.
SQL문 1
INSERT INTO nation VALUES(
'CIA',
(SELECT host_nation FROM olympic WHERE host_year=1988),
'Asia',
(SELECT address FROM stadium WHERE name='Seoul Olympic Stadium')
);
|
SQL문 2
SELECT *
FROM nation
WHERE name='Korea';
|
결과 2
no
|
code
|
name
|
continent
|
capital
|
1
|
KOR
|
Korea
|
Asia
|
Seoul
|
2
|
CIA
|
Korea
|
Asia
|
Seoul, Korea
| |
|
설명
INSERT문 내에 SELECT문은 기본 키로 조회한 것이 아니므로 두 개 이상의 레코드가 검색될 가능성이 있다. 단일 레코드가 아닌 조회 결과를 INSERT문의 VALUE절에 사용하는 경우에는 질의가 실행되지 않는다.
| |
데이터 삭제
삭제 연산은 한 테이블로부터 레코드들을 삭제한다. 레코드를 삭제하기 위해서는 DELETE문을 사용한다. DELETE문의 구문은 아래와 같다. FROM절에 명시한 테이블로부터 WHERE절을 만족하는 레코드들을 삭제한다. WHERE절을 생략하면 해당 테이블에서 모든 레코드들이 삭제되어 빈 테이블이 되므로 매우 신중하게 사용해야 한다.
DELETE
FROM 테이블
[WHERE 조건];
|
예제 5 |
문제
nation 테이블에서 code 값이 ‘CIA’인 레코드를 삭제하라.
SQL문 1
DELETE
FROM nation
WHERE code='CIA';
|
SQL문 2
SELECT *
FROM nation
WHERE name='Korea';
|
결과 2
no
|
code
|
name
|
continent
|
capital
|
1
|
KOR
|
Korea
|
Asia
|
Seoul
| |
|
설명
CIA 코드명을 가진 레코드는 예제 4에서 삽입한 레코드이다.
| |
예제 6 |
문제
nation_gold_count 테이블에서 nation 테이블의 continent(대륙명)이 Americas인 국가 코드를가진 레코드를 모두 삭제하는 쿼리를 작성하라.
SQL문 1
DELETE FROM nation_gold_count
WHERE nation_code IN (
SELECT code FROM nation WHERE continent='Americas' );
|
SQL문 2
SELECT *
FROM nation_gold_count
|
결과 2
no
|
nation_code
|
gold
|
1
|
CHN
|
32
|
2
|
RUS
|
32
|
3
|
GER
|
33
|
4
|
EUN
|
45
|
5
|
GDR
|
37
|
6
|
URS
|
55
| |
|
설명
nation_gold_count 테이블은 [예제 3]에서 작성한 테이블이며, IN 연산자를 사용할 경우, SELECT문을 사용하여 나오는 값이 하나 이상일 경우, 그 값 중 하나의 조건만이라도 만족하면 실행된다. 하지만 IN 연산자가 아닌 = 연산자를 사용하였을 경우, SELECT문의 결과 값이 여러 개가 나온다면 에러가 발생한다.
| |
데이터 수정
UPDATE문은 한 테이블에 들어 있는 레코드의 컬럼 값을 수정한다. UPDATE문의 구문은 아래와 같다. WHERE절을 만족하는 레코드들이 해당 테이블에서 수정된다. WHERE절을 생략할 수 있다. WHERE절을 생략하면 테이블 내의 모든 레코드들이 수정된다. 하나의 UPDATE문에서 여러 컬럼의 값을 수정할 수 있다. 또한 값 대신에 식을 사용할 수도 있다.
UPDATE 테이블
SET 컬럼 = 값 또는 식 [, …]
[WHERE 조건]
|
예제 7 |
문제
Olympic 테이블에서 mascot(마스코트)가 NULL인 레코드의 값을 Nothing으로 수정하라.
SQL문 1
UPDATE olympic
SET mascot = 'Nothing'
WHERE mascot IS NULL;
|
SQL문 2
SELECT host_year, host_nation, host_city, mascot
FROM olympic;
|
결과 2
no
|
host_year
|
host_nation
|
host_city
|
mascot
|
8
|
1976
|
Canada
|
Montreal
|
Amik
|
9
|
1972
|
Germany
|
Munich
|
Waldi
|
10
|
1968
|
Mexico
|
Mexico City
|
Nothing
|
11
|
1964
|
Japan
|
Tokyo
|
Nothing
|
12
|
1960
|
Italy
|
Rome
|
Nothing
|
13
|
1956
|
Australia
|
Melbourne
|
Nothing
| |
|
| |
예제 8 |
문제
Athlete 테이블에서 Kim min-soo 선수의 종목을 Kim Kyoung-Hun 선수의 종목으로 수정하라.
SQL문 1
SELECT * FROM athlete WHERE name='Kim Min-Soo';
|
SQL문 2
UPDATE athlete
SET event = ( SELECT event FROM athlete WHERE name='Kim Kyong-Hun' )
WHERE name='Kim min-soo';
|
SQL문 3
SELECT * FROM athlete WHERE name='Kim Min-Soo';
|
결과 1
no |
code
|
name
|
gender
|
nation_code
|
event
|
1
|
11833
|
Kim Min-Soo
|
M
|
KOR
|
Judo
| |
|
결과 3
no
|
code
|
name
|
gender
|
nation_code
|
event
|
1
|
11833
|
Kim Min-Soo
|
M
|
KOR
|
Taekwondo
| |
|
설명
UPDATE문에도 중첩 질의를 이용할 수 있다. 중첩 질의를 이용하여 데이터를 갱신하면 질의가 복잡하여 실수하기 쉬우므로 WHERE절에 각별히 신경을 써야 한다. 만약 위의 UPDATE문에서 WHERE절이 생략되면 모든 사원의 부서가 수정되는 결과가 발생한다. | |
[출처] 9.데이터 갱신 (큐브리드 공부하기) |작성자 밝은미소