[CUBRID] - 데이터 갱신 0 0 2,684

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 테이블이 수정되는 결과가 발생한다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입