예제 36 |
문제
CODE 테이블의 모든 레코드를 오름차순과 내림차순으로 각각 정렬하여 조회하라.
SQL문 1
SELECT *
FROM code
WHERE ORDER BY f_name
|
결과 1
no
|
s_name
|
f_name
|
1
|
X
|
Mixed
|
2
|
W
|
Woman
|
3
|
M
|
Man
|
4
|
B
|
Bronze
|
5
|
S
|
Silver
|
6
|
G
|
Gold
| |
|
SQL문 2
SELECT *
FROM code
WHERE ORDER BY f_name DESC;
|
결과 2
no
|
s_name
|
f_name
|
1
|
W
|
Woman
|
2
|
S
|
Silver
|
3
|
X
|
Mixed
|
4
|
M
|
Man
|
5
|
G
|
Gold
|
6
|
B
|
Bronze
| |
|
설명
오름차순으로 정렬할 때 ASC는 생략 할 수 있다.
| |
예제 37 |
문제
CODE 테이블에서 먼저 s_name을 오름차순으로 정렬한 뒤, 이후에 f_name을 내림차순으로 정렬하여 조회하라.
SQL문
SELECT *
FROM code
WHERE ORDER BY s_name, f_name ;
혹은
SELECT *
FROM code
WHERE ORDER BY 1, 2 DESC;
|
결과
no
|
s_name
|
f_name
|
1
|
B
|
Bronze
|
2
|
G
|
Gold
3
|
M
|
Man
|
4
|
S
|
Silver
|
5
|
W
|
Woman
|
6
|
X
|
Mixed
|
| |
|
설명
ORDER BY 절에 여러 컬럼을 나열할 수 있다. 단 SELECT 절에 나타나는 컬럼들만 나열할 수 있다. 컬럼 단위로 오름차순과 내림차순을 별도로 지정할 수 있다. 두 번째 SQL문과 같이 ORDER BY 절에 이름대신 SELECT절에 나타나는 컬럼의 순서를 기술해도 좋다. 만약 ORDER BY절에 숫자로 컬럼 들을 지정하여 정렬할 때, ‘SELECT *'와 같이 SELECT 절에 와일드카드 문자를 명시하면 테이블 생성 문에서 기술한 순서대로 적용된다.
| |
예제 38 |
문제
CODE 테이블에서 f_name을 오름차순으로 정렬하여 조회하되, 정렬 이전의 순서와 정렬 이후의 순서를 함께 조회하라.
SQL문
SELECT ROWNUM, ORDERBY_NUM(), D.*
FROM code AS D
WHERE ORDER BY f_name;
|
결과
no
|
ROWNUM
|
ORDERBY_NUM()
|
s_name
|
f_name
|
1
|
4
|
1
|
B
|
Bronze
|
2
|
6
|
2
|
G
|
Gold
|
3
|
3
|
3
|
M
|
Man
|
4
|
1
|
4
|
X
|
Mixed
|
5
|
5
|
5
|
S
|
Silver
|
6
|
2
|
6
|
W
|
Woman
| |
|
설명
큐브리드에서는 ORDERBY_NUM 함수를 제공한다. 이 함수는 SELECT문에 ORDER BY절이 나타나지 않으면 사용할 수 없다. ROWNUM 컬럼은 데이터를 정렬하기 이전에 추출된 테이블에 대해서 순서를 매기는 반면에, ORDERBY_NUM 함수는 추출한 데이터를 정렬한 이후에 순서를 매긴 값을 반환한다.
| |
예제 39 |
문제
PARTICIPANT 테이블에서 GOLD 컬럼을 내림차순 정렬하여 출력하고, 정렬된 데이터의 3행부터 5행까지의 쿼리를 구하라.
SQL문 1
SELECT nation_code, gold
FROM participant ORDER BY gold DESC;
|
결과 1
no
|
nation_code
|
gold
|
1
|
URS
|
55
|
2
|
EUN
|
45
|
3
|
USA
|
44
|
4
|
USA
|
37
|
5
|
USA
|
37
|
6
|
GDR
|
37
| |
|
SQL문 2
SELECT nation_code, gold
FROM participant ORDER BY gold DESC
FOR ORDERBY_NUM() BETWEEN 2 AND 4;
|
결과 2
no
|
nation_code
|
gold
|
2
|
EUN
|
45
|
3
|
USA
|
44
|
4
|
USA
|
37
| |
|
| |
|
집단 함수
다음 절에서 설명한 함수와는 달리 데이터베이스에서 검색된 여러 레코드들의 집단에 적용되는 함수가 집단 함수이다. 집단 함수는 SELECT절과 HAVING절에만 나타날 수 있다. COUNT, MIN, MAX는 숫자형 컬럼과 비 숫자형 컬럼에 모두 적용할 수 있지만, SUM과 AVG는 숫자형 컬럼에만 적용할 수 있다. COUNT(*)를 제외하고는 모든 집단 함수들이 널 값을 제거한 후 남아있는 값에 대해서 집단 함수의 값을 구한다. COUNT(*)는 널이나 중복된 값이 나타나는 것에 상관없이 한테이블의 모든 행들의 총 개수를 구하는 반면에 COUNT(컬럼)은 해당 컬럼에서 널 값이 아닌 값의 개수를 구한다.
집단 함수
|
기능
|
COUNT
|
레코드의 개수
|
SUM
|
값의 합
|
AVG
|
값의 평균
|
MAX
|
값의 최대값
|
MIN
|
값의 최소값
|
VARIANCE
|
값의 분산
|
STDDEV
|
값의 표준편차
| |
|
기본 집단 함수
예제 40 |
문제
NATION_CODE 테이블에서 각 국가별 경기장 수를 출력하는 쿼리문을 작성하라.
SQL문
SELECT nation_code, COUNT(name) AS CITY_COUNT
FROM stadium
GROUP BY nation_code;
|
결과
no
|
nation_code
|
city_count
|
1
|
AUS
|
29
|
2
|
ESP
|
27
|
3
|
GRE
|
27
|
4
|
KOR
|
32
|
5
|
USA
|
26
| |
|
설명
같은 국가 코드에 대해 도시의 개수를 구한다.
| |
예제 41 |
문제
PARTICIPANT 테이블에서 1996년과 2004년 사이 한국의 금메달 평균, 합계, 대회 참가 회수를 출력하는 쿼리문을 작성하라.
SQL문
SELECT AVG(gold), SUM(gold), COUNT(gold) <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /> FROM participant WHERE nation_code='KOR' and host_year between 1996 and 2004;
|
결과
no
|
AVG(gold)
|
SUM(gold)
|
COUNT(gold)
|
1 |
8 |
24 |
3 | |
|
설명
GOLD의 평균, 합계, 레코드 개수를 구한다.
| |
예제 42 |
문제
PARTICIPANT 테이블에서 GOLD의 최소 값과 최대 값을 구하라.
SQL문
SELECT MIN(gold), MAX(gold)
FROM participant;
|
결과
no
|
MIN(gold)
|
MAX(gold)
|
1
|
0
|
55
| |
|
| |
GROUP BY 절을 포함한 집단 함수
GROUP BY 절에 사용된 컬럼에 동일한 값을 갖는 레코드들이 각각 하나의 그룹으로 묶인다. 이 때 사용된 컬럼을 그룹화 컬럼(grouping column)이라고 한다. GROUP BY 절에 사용되는 컬럼은 집단 함수에 사용되지 않은 컬럼이어야 한다. 각 그룹에 대하여 결과 테이블에 하나의 레코드가 생성된다. 따라서 SELECT 절에는 각 그룹마다 하나의 값을 갖는 컬럼, 집단 함수, 그룹화에 사용된 컬럼만 나타날 수 있다. 만일 SELECT 절에 집단 함수가 포함되어 있고, GROUP BY 절이 없는 경우에는 SELECT 절에 집단 함수에서 참조되지 않는 컬럼이 나타날 수 없다.
예제 43 |
문제
PARTICIPANT 테이블에서 역대 국가들의 GOLD(금메달)를 획득한 최소 개수와 최대 개수를 구하라. 단, GOLD를 20개 보다 많이 획득한 나라에서만 조회하라.
SQL문
SELECT nation_code, MIN(gold), MAX(gold)
FROM participant
WHERE gold > 20
GROUP BY nation_code;
|
결과
no
|
nation_code
|
MIN(gold)
|
MAX(gold)
|
1
|
CHN
|
28
|
32
|
2
|
EUN
|
45
|
45
|
3
|
GDR
|
37
|
37
|
4
|
GER
|
33
|
33
|
5
|
RUS
|
26
|
32
|
6
|
URS
|
55
|
55
|
7
|
USA
|
26
|
55
| |
|
| |
HAVING 절을 포함한 집단 함수
때로는 어떤 조건을 만족하는 그룹들에 대해서만 집단 함수를 적용할 수 있다. 각 그룹마다 하나의 값을 갖는 컬럼을 사용하여 각 그룹이 만족해야 하는 조건을 명시한다. HAVING 절은 그룹화 컬럼과 같은 값을 갖는 컬럼들의 그룹에 대한 조건을 나타내고, 이 조건을 만족하는 그룹들만 질의 결과에 나타난다. HAVING 절에 나타나는 컬럼은 반드시 GROUP BY 절에 나타나거나 집단 함수에 포함되어야 한다. WHERE 절과 비슷하지만 WHERE 절은 레코드들을 걸러내고, HAVING 절은 그룹들을 걸러낸다는 점이 다르다.
예제 44 |
문제
PARTICIPANT 테이블에서 한국과 일본의 GOLD(금메달)를 획득한 최소 개수와 최대 개수를 구하라.
SQL문
SELECT nation_code, MIN(gold), MAX(gold)
FROM participant
GROUP BY nation_code
HAVING nation_code IN('KOR', 'JPN');
|
결과
no
|
nation_code
|
MIN(gold)
|
MAX(gold)
|
1
|
JPN
|
3
|
16
|
2
|
KOR
|
7
|
12
| |
|
| |
예제 45 |
문제
PARTICIPANT 테이블에서 GOLD(금메달)를 획득한 최대 개수와 최소 개수의 차가 10 이상만 출력되도록 쿼리 문을 작성하라.
SQL문
SELECT nation_code, MIN(gold), MAX(gold)
FROM participant
GROUP BY nation_code
HAVING MAX(gold) - MIN(gold) >= 10;
|
결과
no
|
nation_code
|
MIN(gold)
|
MAX(gold)
|
1
|
AUS
|
3
|
17
|
2
|
CHN
|
5
|
32
|
3
|
ESP
|
1
|
13
|
4
|
GBR
|
1
|
11
|
5
|
GER
|
13
|
33
|
6
|
JPN
|
3
|
16
|
7
|
NED
|
2
|
12
| |
|
| |
예제 46 |
문제
PARTICIPANT 테이블에서 GOLD(금메달)를 획득한 최대 개수와 최소 개수의 차가 10 이상만 출력하게 하고 GOLD의 합계를 내림차순으로 정렬하라.
SQL문
SELECT nation_code, MIN(gold), MAX(gold), SUM(gold)
FROM participant
GROUP BY nation_code
HAVING MAX(gold) - MIN(gold) >= 10
ORDER BY SUM(gold) DESC;
|
결과
no
|
nation_code
|
MIN(gold)
|
MAX(gold)
|
SUM(gold)
|
1
|
CHN
|
5
|
32
|
97
|
2
|
GER
|
13
|
33
|
79
|
3
|
AUS
|
3
|
17
|
52
|
4
|
JPN
|
3
|
16
|
31
|
5
|
ESP
|
1
|
13
|
25
| |
|
| |
예제 47 |
문제
PARTICIPANT 테이블에서 역대 국가들의 GOLD(금메달)를 획득한 최소 개수와 최대 개수, 평균을 구하라. 단, GOLD를 20개 이상 획득한 나라여야 하며 해당 국가 전체의 GOLD(금메달) 최소 개수와 최대 개수, 평균도 같이 나타내어야 한다.
SQL문
SELECT nation_code, MIN(gold), MAX(gold)
FROM participant
WHERE gold > 20
GROUP BY nation_code WITH ROLLUP; |
결과
no |
nation_code |
MIN(gold) |
MAX(gold) |
AVG(gold) |
1 |
CHN |
28 |
32 |
30 |
2 |
EUN |
45 |
45 |
45 |
3 |
GDR |
37 |
37 |
37 |
4 |
GER |
33 |
33 |
33 |
5 |
RUS |
26 |
32 |
28 |
6 |
URS |
55 |
55 |
55 |
7 |
USA |
36 |
44 |
38 |
8 |
(NULL) |
26 |
55 |
36 |
설명
WITH ROLLUP은 GROUP BY에 의한 결과 레코드의 전체에 대한 집계결과를 포함하여 출력한다.
|
| | | | |
집합 연산
집합 연산을 적용하려면 두 테이블이 합집합과 호환성을 가져야 한다. UNION(합집합), DIFFERENCE(차집합), INTERSECT(교집합)에서는 입력 테이블과 결과 테이블에서 중복된 레코드가 배제된다. UNION ALL(합집합), DIFFERENCE ALL(차집합), INTERSECT ALL(교집합)에서는 입력 테이블과 테이블에 중복된 레코드가 허용된다.
예제 48 |
문제
STADIUM 테이블에서 NATION_CODE(국가)가 ‘KOR' 인 것과 ADDRESS가 ‘Busan, Korea'인 쿼리 문을 작성하라
SQL문
SELECT nation_code, address
FROM stadium
WHERE nation_code='KOR'
UNION
SELECT nation_code, address
FROM stadium
WHERE address ='Busan, Korea';
|
결과
no
|
nation_code
|
address
|
1
|
KOR
|
Busan, Korea
|
2
|
KOR
|
Daegu, Korea
|
3
|
KOR
|
Daejeon, Korea
|
4
|
KOR
|
Goyang, Gyeonggi-do, Korea
|
5
|
KOR
|
Gwacheon, Gyeonggi-do, Korea
|
6
|
KOR
|
Gwangju, Korea
| |
|
설명
UNION 대신 한 개의 SELECT문을 사용하면서 WHERE절에 OR 연산자를 사용해도 같은 결과를 얻을 수 있다.
| |
예제 49 |
문제
STADIUM 테이블에서 NATION_CODE(국가)가 ‘KOR' 인 것과 ADDRESS가 ‘Busan, Korea'인 쿼리 문을 조회하라
SQL문
SELECT nation_code, address
FROM stadium
WHERE nation_code='KOR'
UNION ALL
SELECT nation_code, address
FROM stadium
WHERE nation_code='Busan, Korea';
|
결과
no
|
nation_code
|
address
|
4
|
KOR
|
Seoul, Korea
|
5
|
KOR
|
Seoul, Korea
|
6
|
KOR
|
Goyang, Gyeonggi-do, Korea
|
7
|
KOR
|
Gwacheon, Gyeonggi-do, Korea
|
8
|
KOR
|
Seoul, Korea
|
9
|
KOR
|
Seoul, Korea
| |
|
설명
위의 예제와 비슷하지만 UNION ALL은 출력 값의 중복을 허용한다.
| |
예제 50 |
문제
STADIUM 테이블에서 NATION_CODE(국가)가 ‘KOR' 인 것 중 ADDRESS가 ‘Busan, Korea'인 레코드를 제외한 나머지를 출력하는 쿼리 문을 작성하라
SQL문
SELECT nation_code, address
FROM stadium
WHERE nation_code='KOR'
DIFFERENCE
SELECT nation_code, address
FROM stadium
WHERE nation_code='Busan, Korea'; |
결과
no |
nation_code |
address |
1 |
KOR |
Daegu, Korea |
2 |
KOR |
Daejeon, Korea |
3 |
KOR |
Goyang, Gyeonggi-do, Korea |
4 |
KOR |
Gwacheon, Gyeonggi-do, Korea |
5 |
KOR |
Gwangju, Korea |
6 |
KOR |
Hanam, Gyeonggi-do, Korea |
7 |
KOR |
Seongnam, Gyeonggi-do, Korea |
8 |
KOR |
Seoul, Korea |
9 |
KOR |
Siheung, Gyeonggi-do, Korea |
10 |
KOR |
Suwon, Gyeonggi-do, Korea | |
|
설명
위의 예제와 비슷하지만 UNION ALL은 출력 값의 중복을 허용한다.
| | |