티스토리 뷰

데이터 조회


조인  


조인은 두 개의 테이블로부터 연관된 레코드들을 결합한다. 조인의 일반적인 형식은 FROM 절에 두 개 이상의 테이블들이 열거되고, 두 테이블에 속하는 컬럼들을 비교하는 조인 조건이 WHERE 절에 포함된다.


카티션 곱(Cartesian Product)  

예제 48
문제
NATION 테이블과 CODE 테이블의 카티션 곱을 조회하라.

SQL문 1
SELECT *
FROM nation, code;
혹은
SELECT *
FROM nation CROSS JOIN code;


결과 1
no
code
name
continent
capital
s_name
f_name
1
SRB
Serbia
Europe
Beograd
X
Mixed
2
SRB
Serbia
Europe
Beograd
W
Woman
3
SRB
Serbia
Europe
Beograd
M
Man
4
SRB
Serbia
Europe
Beograd
B
Bronze
5
SRB
Serbia
Europe
Beograd
S
Silver

SQL문 2
SELECT COUNT(*) FROM nation;
SELECT COUNT(*) FROM code;
SELECT COUNT(*) FROM nation, code;


결과 2
no COUNT(*)
1
215
1
6
1
1290

설명
카티션 곱은 가능한 모든 행들의 조합을 만든다. NATION 테이블의 레코드가 215개, CODE 테이블의 레코드가 6개 이면 두 테이블의 조합인 카티션 곱의 레코드 수는 215 * 6 = 1290개가 된다.



세타 조인과 동등 조인  

세타 조인의 결과는 조인 조건을 만족하는 레코드들로 이루어진 테이블이다. 세타 조인을 수행하기 위해서 양쪽 테이블의 컬럼이 세타 조인 조건을 만족하는 레코드만 골라낸다. 세타는 [=, <>, <=, <. , >] 중 하나이며 동등 조인은 이 중에서 비교 연산자가 ‘=’인 조인이다.

예제 49
문제
NATION 테이블과 STADIUM 테이블을 조인하여 Nation_Name(국가명), Capital_Name(수도명), Stadium_Name(경기장명)을 출력하는 쿼리 문을 작성하라.

SQL문
SELECT n.name AS "Nation_Name"
     n.capital AS "Capital_Name"
     s.name AS "Stadium_Name"
FROM stadium AS s, nation AS n
WHERE s.nation_code = n.code;


결과
no
nation_name
capital_name
stadium_name
44
Australia
Canberra
Pavilion 2
45
Korea
Seoul
Modern Pentathlon Stadium
46
Korea
Seoul
Royal Bowling Center
47
Korea
Seoul
Changchung Gymnasium
48
Korea
Seoul
Saemaul Sports Hall

설명
두 개의 테이블을 조인할 때 N이나 S와 같은 ALIAS를 사용하면 보다 간단하게 사용할 수 있다.



외부 조인(outer join)  

예제 50
문제
NATION 테이블과 STADIUM 테이블을 조인하여 Nation_Name(국가명), Capital_Name(수도명), Stadium_Name(경기장명)을 출력하는 쿼리 문을 작성하라.

SQL문
SELECT n.name, o.mascot
FROM nation AS n, olympic AS o
WHERE n.name = o.host_nation(+);
혹은 
SELECT n.name, o.mascot
FROM nationAS n LEFT OUTER JOIN olympic AS o ON n.name = o.host_nation


결과
no
n.name
o.mascot
9
Argentina
(NULL)
10
Armenia
(NULL)
11
Aruba
(NULL)
12
Australia
Olly Syd Millie
13
Australia
(NULL)
219
Kenya
(NULL)

설명
외부 조인은 조인 조건의 양쪽 컬럼 중 하나가 NULL인 경우도 결과 테이블에 나타낼 때 사용한다. 외부 조인을 사용하려면 WHERE절에서 (+) 기호를 사용하거나 OUTER JOIN절을 사용하면 되고 만약에 LEFT인지 RIGHT인지 구분하고자 한다면 널 값이 있는 곳에 (+) 기호를 두고 사용하며 된다. 그리고 현재 큐브리드에서는 FULL OUTER JOIN은 지원하지 않는다.



자체 조인(self join)  

예제 51
문제
NATION 테이블에서 NATION_NAME(국가명)과 CAPITAL(수도명)이 같은 쿼리를 출력하게 하라.

SQL문
SELECT b.code, a.name, b.capital
FROM nation AS a, nation AS b
WHERE a.name = b.capital


결과
NO
Nation_Name
Capital_Name
1
DJI
Djibouti
2
LUX
Luxembourg
3
MON
Monaco
4
SMR
San Marino
5
SIN
Singapore

설명
한 테이블에 속하는 레코드를 동일한 테이블에 속하는 레코드와 조인하는 것을 자체 조인이라 한다. 실제로는 한 테이블이 접근되지만 FROM 절에서 두 테이블이 참조 되는 것처럼 하기 위해 각각의 테이블에 대해 ALIAS를 지정해야 한다.



조인과 ORDER BY의 결합  

예제 52
문제
NATION 테이블과 STADIUM 테이블을 조인하여 Nation_Name(국가명), Capital_Name(수도명), Stadium_Name(경기장명)을 출력하는 쿼리 문을 작성하라.

SQL문
SELECT n.name AS "Nation_Name"
     n.capital AS "Capital_Name"
     s.name AS "Stadium_Name"
FROM stadium AS s, nation AS n
WHERE s.nation_code = n.code
ORDER BY Stadium_Name, Nation_Name DESC;


결과
no
Nation_Name
Capital_Name
Stadium_Name
1
Spain
Madrid
A-17 motorway circuit
16
United States of America
Washington.D.C
Alexander Memorial Coliseum
17
Greece
Athens
Ano Liossia
18
Greece
Athens
Ano Liossia Olympic Hall
19
Greece
Athens
Athens Olympic Stadium

설명
Stadium_Name을 오름차순으로 정렬한 후, Capital_Name을 내림차순으로 정렬한다.



세 개 이상의 테이블 조인  

예제 53
문제
한국 국적의 선수들의 성별, 스포츠 종목과 획득 메달을 출력하는 쿼리를 작성하라.

SQL문
SELECT a.nation_code, a.name, e.gender, e.sports, r.medal
FROM event AS e, athlete AS a, record AS r
WHERE e.code=r.event_code AND
a.code=r.athlete_code AND a.nation_code='KOR';


결과
no
a.nation_code
a.name
a.gender
e.sports
r.medal
1
KOR
Chun Byung-Kwan
M
Weightlifting
G
2
KOR
Kang Cho-Hyun
W
Shooting
S
3
KOR
Hwang Young-Cho
M
Athletics
G
4
KOR
Lee Eun-Chul
M
Shooting
G
5
KOR
Lee Bong-Ju
M
Athletics
S

설명
세 개의 테이블을 조인할 때에는 두 개의 조인 조건식을 AND로 연결한다.



중첩 질의  


일부 질의들은 데이터베이스에서 어떤 값들을 검색한 후에 이를 비교 조건에서 사용한다. 이런 질의들은 중첩 질의를 사용해서 편리하게 표현할 수 있다. 중첩 질의는 외부 질의의 WHERE절에 포함되는 SELECT문을 말하며 부 질의(Sub_Query)라고 한다.


한 개의 스칼라 값이 반환되는 경우  

예제 54
문제
Park Jae-Hong과 같은 국가인 모든 선수들의 이름과 종목을 조회하라.

SQL문 1
SELECT name, nation_code, event
FROM athlete
WHERE name='Park Jae-Hong';


결과 1
no
name
nation_code
event
1
Park Jae-Hong
KOR
Baseball

SQL문 2
SELECT name, nation_code, event
FROM athlete
WHERE nation_code = 'KOR';


결과 2
no
name
nation_code
event
1
Chung So-Young
KOR
Badminton
2
Chung Min-Tae
KOR
Baseball
3
Chung Jae-Hun
KOR
Archery
4
Chung Hoon
KOR
Judo
5
Chun Byung-Kwan
KOR
Weightlifting
6
Chong Tae-Hyon
KOR
Baseball
7
Choi Mi-Soon
KOR
Hockey

SQL문 3
SELECT name, nation_code, event
FROM athlete
WHERE nation_code =

(SELECT nation_code FROM athlete WHERE name='Park Jae-Hong');


결과 3
NO
NAME
NATION_CODE
EVENT
1
Chung So-Young
KOR
Badminton
2
Chung Min-Tae
KOR
Baseball
3
Chung Jae-Hun
KOR
Archery
4
Chung Hoon
KOR
Judo
5
Chun Byung-Kwan
KOR
Weightlifting
6
Chong Tae-Hyon
KOR
Baseball
7
Choi Mi-Soon
KOR
Hockey

설명
2번과 3번의 실행 결과는 같다.



한 개의 컬럼으로 이루어진 테이블이 반환되는 경우  

중첩 질의의 결과로 한 개의 컬럼으로 이루어진 다수의 레코드들이 반환될 수 있다. 외부 질의의 WHERE절에서 IN, ANY(SOME), ALL, EXISTS와 같은 연산자를 사용해야 한다. 키워드 IN은 한 컬럼이 값들의 집합에 속하는가를 테스트할 때 사용한다. 만일 한 컬럼이 값들의 집합에 속하는 하나 이상의 값들과 어떤 관계를 갖는가를 테스트 하는 경우에는 ANY를 사용하고, 만일 한 컬럼이 값들의 집합에 속하는 모든 값들과 어떤 관계를 갖는가를 테스트하는 경우에는 ALL을 사용한다.

예제 55
문제
NATION 테이블에서 나라 이름(NAME)‘Korea’ 또는 ‘America’ 로 끝나는 국가코드(CODE) 명을 가지고  STADIUM 테이블의 NATION_CODE NAME을 출력하는 쿼리 문을 작성하라

SQL문
SELECT nation_code, name
FROM stadium
WHERE nation_code
IN (SELECT  code FROM nation WHERE name LIKE '%Korea' OR name LIKE '%America');


결과
no
nation_code
name
16
USA
Clark-Atlanta-University
17
USA
Atlanta-Fulton-Country-Stadium
18
USA
Atlanta-Beach
19
USA
Alexander-Memorial-Coliseum
20
KOR
Modern-Pentathlon-Stadium
21
KOR
Royal-Bowling-Center



여러 컬럼으로 이루어진 테이블이 반환되는 경우  

중첩 질의의 결과로 여러 컬럼들로 이루어진 테이블이 반환되는 경우에는 EXISTS 연산자를 사용하여 중첩 질의의 결과가 빈 테이블인지 여부를 검사한다. 중첩 질의의 결과가 빈 테이블이 아니면 참이 되고, 그렇지 않으면 거짓이 된다. NOT EXISTS는 EXISTS의 반대로 테스트 한다고 생각하면 된다.

예제 56
문제
NATION 테이블의 NATION_CODE가 KOR 또는 USA인 STADIUM 테이블의 NATION_CODE와 NAME을 출력하는 쿼리문을 작성하라.

SQL문
SELECT nation_code, name
FROM stadium

WHERE EXISTS
(SELECT code, name
FROM nation
WHERE code IN ('KOR', 'USA')) ;


결과
no
nation_code
name
16
USA
Clark-Atlanta-University
17
USA
Atlanta-Fulton-Country-Stadium
18
USA
Atlanta-Beach
19
USA
Alexander-Memorial-Coliseum
20
KOR
Modern-Pentathlon-Stadium
21
KOR
Royal-Bowling-Center



상관 중첩 질의(correlated nested query)  

중첩 질의의 WHERE절에서 외부 질의에 선언된 테이블의 일부 컬럼을 참조하는 질의를 상관 중첩 질의라 한다. 상관 중첩 질의는 외부 질의를 만족하는 각 레코드가 구해진 후 중첩 질의가 수행된다. 따라서 상관 중첩 질의는 외부 질의를 만족하는 레코드 수만큼 여러 번 수행할 수 있다.

예제 57
문제
PARTICIPANT 테이블에서 GOLD(금메달) 획득 수가 평균 이상인 NATION_CODE(국가 코드)와 GOLD(금메달 수)를 출력하는 쿼리 문을 작성하라.

SQL문
SELECT nation_code, gold
FROM participant
WHERE gold >= (SELECT AVG(gold) FROM participant);


결과
no
nation_code
gold
1
UAE
1
2
DOM

1

 

3
CMR
1
4
ISR
1
5
BAH
1
6
BEL
1
7
AZE
1
8
ZIM 
1
...

설명
동일한 테이블 안에서 중첩하여 질의를 사용함으로써 컬럼의 값을 비교하여 해당되는 값을 출력할 수 있다.



FROM절에 내포된 질의  


FROM절에 열거하는 테이블을 내포된 질의로 표현할 수 있다. WHERE절의 조건식에 관계 연산자로 길게 표현되면 질의를 이해하기 어려울 수 있다. 이런 경우에는 FROM절에서 먼저 조건문을 적용하고, 그 결과 테이블을 조인하면 이해하기가 쉬워진다. 한 SELECT문의 FROM절에 내포된 SELECT문을 인라인 뷰(inline view)라고도 한다.

예제 58
문제
NATION 테이블과 ATHLETE 테이블에서 종목 명(EVENT)이 Taekwondo인 쿼리를 작성하라. (출력 컬럼 : 대륙 명(CONTINENT), 나라 명(NATION_NAME), 선수 명(NAME), 종목 명(EVENT))

SQL문
SELECT n.continent, n.name, a.name, a.event FROM nation n,
     (SELECT nation_code, name, event FROM athlete) AS a 
WHERE n.code = a.nation_code AND a.event='Taekwondo';


결과
no
continent
nation_code
name
event
25
Americas
Cuba
Labrada_Diaz_Yy
Taekwondo
26
Asia
Iran
Karami_Yossef
Taekwondo
27
Asia
Korea
Jang_Ji_Won
Taekwondo
28
Asia
Korea
Hwang_yung_Sun
Taekwondo
29
Asia
Taiwan
Huang_Chih_Hsiung
Taekwondo

30

 

Asia

Taiwan

 

Chu_Mu_Yen

 

Taekwondo

 

31
Asia

Taiwan

 

Chen_Shih_Hsin

 

Taekwondo

 



예제 59
문제
CONTINENT가 Asia인 NATION_NAME과 STADIUM_NAME을 출력하는 쿼리 문을 작성하라.

SQL문
SELECT n.name AS nation_name, s.name AS stadium_name FROM
     (SELECT code, name, continent FROM nation) AS n,
     (SELECT nation_code, name FROM stadium AS s 
WHERE N.CODE=S.NATION_CODE AND n.continent = 'Asia'


결과
no
nation_name
stadium_name
1
Korea
Modern Pentathlon Stadium
2
Korea
Royal Bowling Center
3
Korea
Changchung Gymnasium
4
Korea
Saemaul Sports Hall
5
Korea
Dongdaemun Stadium
6
Korea
Wondang Ranch
7
Korea
Seoul Equestrian Park
    [출처] 11.조인, 중첩 질의, FROM 절에 내포된 질의 (큐브리드 공부하기) |작성자 밝은미소

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크