|
데이터 갱신
데이터 삽입
기존의 테이블에 레코드를 삽입할 때 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 |
|
√ 결과
|
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 |
|
√ 결과
|
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 |
|
√ 결과
|
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' |
|
√ 결과
|
NO |
code |
name |
continent’ capital’ |
1 |
KOR |
Korea |
Asia |
2 |
CIA |
Korea |
Asia |
|
√ 설명
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' |
|
√ 결과
|
NO |
code |
name |
continent |
capital’ |
1 |
KOR |
Korea |
Asia |
Seoul |
|
√ 설명
CIA 코드명을 가진 레코드는 예제.5에서 삽입한 레코드이다. |
예제 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 |
|
√ 결과
|
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 |
|
√ 결과
|
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 |
|
√ 결과 2
|
NO |
code |
name |
gender |
nation_code’ Event |
1 |
11833 |
Kim Min-Soo |
M |
KOR |
|
√ 설명
UPDATE문에도 중첩 질의를 이용할 수 있다. 중첩 질의를 이용하여 데이터를 갱신하면 질의가 복잡하여 실수하기 쉬우므로 WHERE절에 각별히 신경을 써야 한다. 만약 위의 UPDATE문에서 WHERE절이 생략되면 모든 athlete 테이블이 수정되는 결과가 발생한다. |
|
|