티스토리 뷰

데이터 조회

ORDER BY절이 포함된 질의  


질의 결과를 오름차순이나 내림차순으로 정렬(sorting)하는 경우가 흔히 있다. 사용자가 SELECT문에서 질의 결과의 순서를 명시하지 않으면 DBMS가 레코드들을 검색한 임의의 순서대로 사용자에게 제시된다. ORDER BY 절에서 하나 이상의 컬럼을 사용하여 검색 결과를 정렬할 수 있다. ORDER BY 절은 SELECT문에서 가장 마지막에 사용되는 절이다.

ORDER BY 절의 디폴트 정렬 순서는 오름차순(ASC:ascending)이다. DESC를 지정하여 정렬 순서를 내림차순으로 지정할 수 있다. 널 값도 정렬 결과에 표시된다. 널 값은 오름차순에서 가장 앞에 나타나고, 내림차순에서는 가장 뒤에 나타난다. SELECT절에 명시한 컬럼들을 사용해서 정렬해야 한다.


예제 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
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은 출력 값의 중복을 허용한다.

출처 : http://cafe.naver.com/studycubrid.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=690
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크