[CUBRID] - 데이터 갱신 0 1,528

by 문학청년 [CUBRID 노하우/팁/자료] 큐브리드 cubrid 데이터갱신 [2009.11.13 18:20:10]


본 문서는 CUBRID(큐브리드)의 데이터 삽입, 수정, 삭제에 대해 설명합니다.


 


데이터 갱신


데이터 삽입

기존의 테이블에 레코드를 삽입할 때 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 테이블이 수정되는 결과가 발생한다.