컬렉션 명
|
설명
|
타입 정의
|
입력 데이터
|
저장 데이터
|
SET
|
중복을 허용하지 않는 합집합
|
col_name SET VARCHAR(20)
col_name SET (int, VARCHAR(20)) |
{'c','c','c','b','b', 'a'}
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'} |
{'a','b','c'}
{0,1,2,3,'a','b','c'} |
MULTISET
|
중복을 허용하는 합집합
|
col_name MULTISET VARCHAR(20)
col_name MULTISET (int, VARCHAR(20)) |
{'c','c','c','b','b', 'a'}
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'} |
{'a','b','b','c','c','c'}
{0,1,2,2,3,3,3,'a','b','b', 'c','c','c'} |
LIST(=SEQUENCE)
|
중복을 허용하고, 데이터 입력 순서대로 저장하는 합집합
|
col_name LIST VARCHAR(20)
col_name LIST (int, VARCHAR(20)) |
{'c','c','c','b','b', 'a'}
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'} |
{'c','c','c','b','b','a'}
{3,3,3,2,2,1,0,'c','c', 'c','b','b','a'} | |
|
LIST(=SEQUENCE)
LIST의 요소는 중복을 허용하고 여러 종류의 데이터 타입을 가질 수 있고, 다른 클래스의 인스턴스를 가질 수도 있으며 원소들의 순서가 의미가 있는 타입이다.
정의
|
컬렉션 값의 예
|
SEQUENCE INTEGER
|
{20. 40, 60, 80}
|
LIST CHAR(5)
|
{ ‘aaa’, ‘bbbb’, ‘ccccc’ }
| |
|
예제 1 |
문제
학번(sno), 이름(sname), 학과(sclass), 수강 과목(subjects)를 컬럼으로 갖는 학생 테이블(student)를 생성하라. 수강 과목은 LIST(VHARCAR) 타입을 이용하라.
테이블 생성 SQL문
CREATE TABLE STUDENT (
sno INT,
sname VARCHAR(20),
sclass VARCHAR(30),
subject LIST(VARCHAR(20))
);
INSERT INTO student VALUES ( 1, 'Susan', 'Computer', { 'JAVA', 'C' } );
INSERT INTO student VALUES ( 2, 'Michel', 'Computer', { 'Algorithm', 'Structure', 'File System' } );
INSERT INTO student VALUES ( 3, 'Brown', 'History', { } );
SELECT * FROM student;
|
결과 테이블
no
|
sno
|
sname
|
sclass
|
subject
|
1
|
1
|
Susan
|
Computer
|
{JAVA, C}
|
2
|
2
|
Michel
|
Computer
|
{Algorithm, Structure, File System}
|
3
|
3
|
Brown
|
History
|
{}
| |
|
| |
SET
SET의 요소는 중복된 값을 입력하면 큐브리드는 자동으로 중복된 값을 제거하며 여러 종류의 데이터 타입을 가질 수 있고, 다른 클래스의 인스턴스를 가질 수도 있다.
정의
|
입력 데이터
|
저장 데이터
|
SET VARCHAR(10)
|
{ ‘golf’, ‘scuba’, ‘golf’ }
|
{ ‘golf’, ‘scuba’ }
| |
|
예제 2 |
문제
학번(sno), 이름(sname), 학과(sclass), 수강 과목(subjects)를 컬럼으로 갖는 학생 테이블(student)를 생성하라. 수강 과목은 SET(VHARCAR) 타입을 이용하라.
테이블 생성 SQL문
CREATE TABLE student (
sno INT,
sname VARCHAR(20),
sclass VARCHAR(30),
subject SET(VARCHAR(20))
);
INSERT INTO student VALUES ( 1, 'Susan', 'Computer', { 'JAVA', 'C', 'JAVA' } );
INSERT INTO student VALUES ( 2, 'Michel', 'Computer', { 'Algorithm', 'Structure', 'File System' } );
INSERT INTO student VALUES ( 3, 'Brown', 'History', { 'Rome', 'Rome' } );
SELECT * FROM student;
|
결과 테이블
no
|
sno
|
sname
|
sclass
|
subject
|
1
|
1
|
Susan
|
Computer
|
{C, JAVA}
|
2
|
2
|
Michel
|
Computer
|
{Algorithm, File System, Structure}
|
3
|
3
|
Brown
|
History
|
{Rome}
| |
|
| |
MULTISET
MULTISET 타입은 SET 타입과 유사하지만 중복을 허용하는 집합을 나타낼 때 사용한다. 하지만 원소들의 순서는 중요하지 않다.
정의
|
컬렉션 값의 예
|
MULTISET INTEGER
|
{ 10, 20, 10, 80 }
|
MULTISET CHAR(5)
|
{ ‘aaa’, ‘bbbb’, ‘ccccc’ }
| |
|
예제 3 |
문제
학번(sno), 이름(sname), 학과(sclass), 수강 과목(subjects)를 컬럼으로 갖는 학생 테이블(student)를 생성하라. 수강 과목은 MULTISET(VHARCAR) 타입을 이용하라.
테이블 생성 SQL문
CREATE TABLE STUDENT (
sno INT,
sname VARCHAR(20),
sclass VARCHAR(30),
subject MULTISET(VARCHAR(20))
);
INSERT INTO student VALUES ( 1, 'Susan', 'Computer', { 'JAVA', 'C', 'JAVA' } );
INSERT INTO student VALUES ( 2, 'Michel', 'Computer', { 'Algorithm', 'Structure', 'File System' } );
INSERT INTO student VALUES ( 3, 'Brown', 'History', { 'Rome', 'Rome' } );
SELECT * FROM student;
|
결과 테이블
no
|
sno
|
sname
|
sclass
|
subject
|
1
|
1
|
Susan
|
Computer
|
{C, JAVA, JAVA}
|
2
|
2
|
Michel
|
Computer
|
{Algorithm, File System, Structure}
|
3
|
3
|
Brown
|
History
|
{Rome, Rome}
| |
|
| |
| |
상속(Inheritance)
상속은 객체 관계 개념에서 유용한 것 중 하나이다. 상속은 부모 테이블에서 생성된 컬럼과 메소드들을 자식 테이블에서 재사용할 수 있게 한다. 큐브리드는 다중 상속을 지원함으로써 강력한 재사용성을 제공하고, 다중 상속 간의 충돌 문제를 해결할 수 있는 방법을 제공한다.
예제 4 |
문제
이름(name), 나이(age), 성별(sex) 컬럼을 가진 PEOPLE 테이블을 생성하라.
테이블 생성 SQL문
CREATE TABLE people (
name VARCHAR(20),
age INT,
sex CHAR(1)
);
|
| |
예제 5 |
문제
PEOPLE 테이블을 상속 받고, 학번(sno), 학과(sclass), 수강 과목(subject) 컬럼을 가진 student 테이블을 생성하라.
테이블 생성 및 데이터 삽입 SQL문
-- student 테이블 생성 SQL문
CREATE TABLE student UNDER people (
sno INT,
sclass VARCHAR(30),
subject MULTISET(VARCHAR(20))
);
-- student 테이블에 데이터 삽입 SQL문 >
INSERT INTO student VALUES ('Michel', 21, 'M', 1, 'Computer', {'JAVA',' C'});
INSERT INTO student VALUES ('Susan', 20, 'F', 2, 'History', {'Rome'});
-- student 테이블 생성 SQL문 >
SELECT * FROM student;
|
결과 테이블
no
|
name
|
age
|
sex
|
sno
|
sclass
|
subject
|
1
|
Michel
|
21
|
M
|
1
|
Computer
|
{ JAVA, C }
|
2
|
Susan
|
20
|
F
|
2
|
History
|
{ Rome }
| |
|
설명
위의 INSERT문을 보면 PEOPLE 테이블의 컬럼 값들이 입력된 것을 알 수 있다. 이처럼 UNDER 키워드를 이용하여 테이블을 상속받을 수 있다.
| |
예제 6 |
문제
PEOPLE 테이블을 상속 받고, 교번(pno), 학과(pclass), 담당 과목(subject), 월급(salary) 컬럼을 가진 professor 테이블을 생성하라.
테이블 생성 및 데이터 삽입 SQL문
-- professor 테이블 생성 SQL문
CREATE TABLE professor UNDER people (
pno INT,
pclass VARCHAR(30),
subject VARCHAR(20),
salary INT
);
-- professor 테이블에 데이터 삽입 SQL문
INSERT INTO professor VALUES ('Jackson', 54, 'M', 1, 'Computer', 'JAVA', 5000000);
-- professor 테이블 출력 SQL문
SELECT * FROM professor;
|
결과 테이블
no
|
name
|
age
|
sex
|
pno
|
pclass
|
subject
|
salary
|
1
|
Jackson
|
54
|
M
|
1
|
Computer
|
JAVA
|
5000000
| |
|
설명
위의 INSERT문을 보면 Student 테이블과 마찬가지로 PEOPLE 테이블의 컬럼 값들이 입력된 것을 알 수 있다.
| |
예제 7 |
문제
PEOPLE 테이블을 삭제하고 professor 테이블을 조회하라.
테이블 생성 및 데이터 삽입 SQL문
-- people 테이블 삭제 SQL문
DROP FROM people;
-- professor 테이블 출력 SQL문
SELECT * FROM professor;
|
결과 테이블
no
|
pno
|
pclass
|
subject
|
salary
|
1
|
1
|
Computer
|
JAVA
|
5000000
| |
|
설명
People 테이블을 삭제하면 해당 테이블을 상속 받고 있는 테이블들과의 상속 관계는 사라지므로 people 테이블의 이름(name), 나이(age), 성별(sex) 컬럼도 조회되지 않는다.
| |
|
컴포지션(Composition)
컴포지션은 객체 관계형 데이터베이스의 중요한 특징 중 하나이다. 테이블은 특정 테이블의 객체를 하나의 컬럼으로 가지고 있을 수 있기 때문에 별도의 조인 연산이 필요 없게 된다.
예제 8 |
문제
국가 코드(code), 국가 명(name), 대륙 명(continent), 수도 명(capital) 컬럼을 가진 국가 테이블(info_nation)을 생성하고 이름(name), 소속 국가(nation_code) 컬럼을 가진 사람 테이블(info_people)을 생성하고 각각의 데이터를 입력한 후 두 테이블을 조인하여 이름(name), 국가 명(name), 대륙 명(continent), 수도 명(capital) 컬럼 순으로 출력하는 쿼리문을 작성하라.
SQL문
-- info_nation 테이블 생성 SQL문
CREATE TABLE info_nation (
code CHAR(3),
name VARCHAR(20),
continent VARCHAR(20),
capital VARCHAR(20)
);
-- info_nation 테이블에 데이터 삽입 SQL문
INSERT INTO info_nation VALUES('KOR', 'Korea', 'Asia', 'Seoul');
INSERT INTO info_nation VALUES('ITA', 'Italy', 'Europe', 'Rome');
-- info_people 테이블 생성 SQL문
CREATE TABLE info_people (
NAME VARCHAR(20),
nation_code CHAR(3)
);
-- info_people 테이블에 데이터 삽입 SQL문
INSERT INTO info_people VALUES ('Park Ji-Sung', 'KOR');
INSERT INTO info_people VALUES ('Susan', 'ITA');
-- info_people 테이블 출력 SQL문
SELECT p.name, n.name, n.continent, n.capital
FROM info_nation n, info_people p
WHERE n.code = p.nation_code;
|
결과 테이블
no
|
name
|
name
|
continent
|
capital
|
1
|
Park Ji-Sung
|
Korea
|
Asia
|
Seoul
|
2
|
Susan
|
Italy
|
Europe
|
Rome
| |
|
| |
예제 9 |
문제
이름(name), info_nation 테이블 객체 컬럼을 가진 사람 테이블(info_people_ref)을 생성하고 각각의 데이터를 입력한 후 해당 객체를 참조하여 이름(name), 국가 명(name), 대륙 명(continent), 수도 명(capital) 컬럼 순으로 출력하는 쿼리 문을 작성하라.
SQL문
-- info_people_ref 테이블 생성 SQL문
CREATE TABLE info_people_ref (
name VARCHAR(20),
info_nation info_nation
);
-- info_people_ref# 테이블에 데이터 삽입 SQL문
INSERT INTO info_people_ref VALUES ('Park Ji-Sung',
(SELECT info_nation.IDENTITY FROM info_nation WHERE code='KOR'));
INSERT INTO info_people_ref VALUES ('Susan',
(SELECT info_nation.IDENTITY FROM info_nation WHERE code='ITA'));
-- info_people_ref 테이블 출력 SQL문
SELECT name, info_nation.name, info_nation.continent, info_nation.capital
FROM info_people_ref;
|
결과 테이블
no
|
name
|
info_nation.name
|
info_nation.continent
|
info_nation.capital
|
1
|
Park Ji-Sung
|
Korea
|
Asia
|
Seoul
|
2
|
Susan
|
Italy
|
Europe
|
Rome
| |
|
설명
위의 INSERT문을 보면 code=’KOR’인 레코드의 OID 값을 SELECT 하여 해당 객체 컬럼에 삽입하는 것을 볼 수 있다. 이렇게 삽입된 객체 컬럼은 아래 결과 테이블 SELECT문처럼 별도로 조인할 필요가 없이 해당 객체의 국가 명(name)과 대륙 명(continent), 수도 명(capital)을 바로 참조하여 SELECT 할 수 있다.
| |
출처 : http://cafe.naver.com/studycubrid.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=702 |