단순 데이터 조회
테이블 내의 모든 테이터를 조회하려면 WHERE절 없이 SELECT-FROM절만을 사용한다. [예제 1]은 SELECT절에 모든 컬럼을 나열한 예를 보여준다. 모든 컬럼을 일일이 기재하기가 번거로우면 [예제 1]처럼 ‘*’를 와일드카드 문자로 이용할 수 있다. 그러나 ‘c’로 시작하는 컬럼들을 조회하기 위해 ‘P*’와 같은 형식을 SELECT절에 사용할 수는 없다. 원하는 컬럼만 선택해서 조회하려면 [예제 2]와 같이 필요한 컬럼만 SELECT절에 명시할 수 있다
예제 1 |
문제
CODE 테이블의 모든 테이터를 조회하라.
SQL문
SELECT s_name, f_name
FROM code
혹은
SELECT * FROM code
|
결과
no
|
s_name
|
f_name
|
1
|
X
|
Mixed
|
2
|
W
|
Woman
|
3
|
M
|
Man
|
4
|
B
|
Bronze
|
5
|
S
|
Silver
|
6
|
G
|
Gold
| |
|
설명
와일드카드 문자 ‘*’를 사용하면 결과 테이블의 컬럼들은 테이블을 생성할 때 명시한 순서대로 나타난다.
| |
예제 2 |
문제
CODE 테이블에서 s_name 컬럼만 조회하라.
SQL문
결과
no
|
s_name
|
1
|
X
|
2
|
W
|
3
|
M
|
4
|
B
|
5
|
S
|
6
|
G
| |
|
설명
테이블의 컬럼 중 일부만 선택할 때에는 SELECT절에 컬럼 이름을 나열한다. 이 때 결과 테이블의 컬럼들은 SELECT 절에 나열한 순서대로 나타난다.
| |
DISTINCT를 이용한 중복 제거
결과 테이블에 중복된 행이 나타나지 않게 하려면 [예제 3]과 같이 DISTINCT를 사용한다. 결과 테이블에 행들이 많기 때문에 전부 나타나지는 않았다. DISTINCT를 사용하지 않은 [결과 1] 을 보면 중복된 데이터가 보인다. DISTINCT를 사용한 [결과 2]는 NATION_CODE와 ADDRESS가 같은 행이 한 번씩만 나타난다. [SQL문 1]과 [SQL문 2]의 결과 테이블뿐만 아니라 행의 순서도 다르다. 질의에서 행의 순서를 별도로 지정하지 않으면 DMBS가 자동으로 순서를 지정하여 결과 테이블을 생성한다.
예제 3 |
문제
CODE 테이블에서 s_name 컬럼만 조회하라.
SQL문 1
SELECT nation_code, address
FROM stadium
WHERE nation_code='KOR'
|
결과 1
no
|
nation_code
|
address
|
17
|
KOR
|
Seoul,Korea
|
18
|
KOR
|
Seoul,Korea
|
19
|
KOR
|
Seoul,Korea
|
20
|
KOR
|
Suwon,Gyeonggi-do,Korea
|
21
|
KOR
|
Busan,Korea
|
22
|
KOR
|
Siheung,Gyeonggi-do,Korea
|
23
|
KOR
|
Seoul,Korea
|
24
|
KOR
|
Seoul,Korea
|
25
|
KOR
|
Seoul,Korea
|
26
|
KOR
|
Suwon,Gyeonggi-do,Korea
| |
|
SQL문 2
SELECT DISTINCT nation_code, address
FROM stadium
WHERE nation_code='KOR'
|
결과 2
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
|
7
|
KOR
|
Hanam,Gyeonggi-do,Korea
|
8
|
KOR
|
Seongnam,Gyeonggi-do,Korea
|
9
|
KOR
|
Seoul,Korea
|
10
|
KOR
|
Siheung,Gyeonggi-do,Korea
| |
|
설명
결과 테이블에서 중복된 레코드들이 한 번씩만 나타나게 하려면 DISTINCT 키워드를 사용한다.
| |
컬럼에 별칭을 사용한 질의
일반적으로 SQL문을 수행할 때 컬럼 이름이 너무 길면 번거롭기 때문에, 테이블을 설계할 때 컬럼 이름을 약어로 줄여서 표기하는 경우가 많다. (예, DEPARTMENT_NUMBER -> DEPTNO). 조회할 때는 이해하기 좋게 하기 위하여 컬럼 이름을 다른 이름(별칭)으로 바꾸어서 출력할 수도 있다. 별칭은 영문 및 한글 모두 가능하며 띄어쓰기가 필요할 때에는 큰 따옴표(“)로 묶어주어야 한다. 컬럼 이름에 별칭을 지정할 때에는 키워드 AS를 사용하며, AS는 생략할 수 있다.
예제 4 |
문제
CODE 테이블에서 s_name와 f_name 컬럼을 조회하되 결과 테이블의 컬럼 이름을 각각 “약자”, “용어”로 출력하라.
SQL문
SELECT s_name AS "약자", f_name AS "용어"
FROM CODE
혹은
SELECT s_name "약자", f_name "용어"
FROM CODE
|
결과
no
|
약자
|
용어
|
1
|
X
|
Mixed
|
2
|
W
|
Woman
|
3
|
M
|
Man
|
4
|
B
|
Bronze
|
5
|
S
|
Silver
|
6
|
G
|
Gold
| |
|
설명
결과 테이블에서 중복된 레코드들이 한 번씩만 나타나게 하려면 DISTINCT 키워드를 사용한다.
| |
WHERE절을 포함한 질의
WHERE절은 데이터를 조회할 때 조회 조건에 해당한다. FROM절에 열거한 테이블에 속하는 컬럼과 상수, 연산자를 사용해서 표현한다. 상수 중 문자형과 날짜형은 작은 따옴표(‘)로 묶어서 사용해야 한다. 숫자형은 작은따옴표 없이 사용해야 한다. WEHRE절에서 사용할 수 있는 표현식은 아래와 같은 사항들을 포함한다.
|
|
a. |
비교 연산자 =, <=>, !=, <>, <, <=, >=, IS NULL, IS NOT NULL, BETWEEN… AND |
|
|
b. |
부울 연산자 AND, OR, NOT, XOR |
|
|
c. |
IN, NOT IN, ANY(SOME), ALL |
비교 연산자와 부울 연산자 등이 결합된 복잡한 표현식 형태도 가능하다.
예제 5 |
문제
STADIUM 테이블에서 ADDRESS가 ‘Seoul, Korea’인 NAME과 CODE를 조회하라.
SQL문
SELECT name, code
FROM stadium
WHERE address='KOR'
|
결과
no
|
name
|
code
|
1
|
Modern_Pentathlon_Stadium
|
30073
|
2
|
Royal_Bowling_Center
|
30072
|
3
|
Changchung_Gymnasium
|
30071
|
4
|
Saemaul_Sports_Hall
|
30070
|
5
|
Dongdaemun_Stadium
|
30069
|
6
|
Hwarang_Archery_Field
|
30066
|
7
|
Olympic_Swimming_Pool
|
30065
|
8
|
Olympic_Tennis_Courts
|
30064
|
9
|
Olympic_Gymnastics_Hall
|
30063
|
10
|
Olympic_Weightlifting_Gymnasium
|
30062
| |
|
| |
예제 6 |
문제
PARTICIPANT 테이블에서 GOLD(금메달)이 32개 이상인 NATION_CODE와 GOLD를 조회하라.
SQL문
SELECT nation_code, gold
FROM participant
WHERE gold >= 32
|
결과
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
| |
|
설명
숫자 형 상수에는 작은 따옴표(‘)를 사용하지 않는다.
| |
예제 7 |
문제
PARTICIPANT 테이블에서 GOLD(금메달)이 30개 이상이고 국가 코드가 USA인 HOST_YEAR, NATION_CODE, GOLD을 조회하라..
SQL문
SELECT host_year, nation_code, gold
FROM participant
WHERE gold > 30 AND nation_code='USA'
|
결과
no
|
host_year
|
nation_code
|
gold
|
1
|
2004
|
USA
|
36
|
2
|
2000
|
USA
|
37
|
3
|
1996
|
USA
|
44
|
4
|
1992
|
USA
|
37
|
5
|
1988
|
USA
|
36
| |
|
설명
부울 연산자를 이용해 WHERE절에 나타나는 표현식을 복잡한 형태로 나타낼 수 있다. 두 조건이 모두 참일 때 참이 되는 AND 연산자, 두 조건 중에 하나라도 참이면 참인 OR 연산자, 조건의 반대 결과를 돌려주는 NOT 연산자를 적절히 사용할 수 있다.
| |
예제 8 |
문제
PARTICIPANT 테이블에서 GOLD(금메달)이 20개 이상이고, 30개 이하인 NATION_CODE와 GOLD를 조회하라.
SQL문
SELECT nation_code, gold
FROM participant
WHERE gold BETWEEN 20 AND 30
|
결과
no
|
nation_code
|
gold
|
1
|
RUS
|
27
|
2
|
CHN
|
28
|
3
|
GER
|
20
|
4
|
RUS
|
26
| |
|
설명
BETWEEN … AND 형식의 표현식은 >= … AND … <= 형식으로 표현할 수 있다.
| |
널 값
널 값은 값이 ‘알려지지 않음’, ‘적용할 수 없음’을 나타낸다. [예제 1]과 [예제 3]의 결과 테이블에 나타나는 NULL은 값이 ‘NULL’인 문자열이나 값이 ''인 빈 문자열과는 의미가 다르다. (빈 문자열을 NULL과 같은 의미로 사용하는 DBMS도 있다.) WHERE절에서 NULL 값을 비교하기 위해서는 = 연산자 대신에 ‘IS’를 사용해야 한다. 널 값은 연산자나 함수를 거쳐도 역시 널 값으로 나타난다. 알려지지 않은 값에 연산을 수행한 결과는 알려지지 않은 값이기 때문이다.
예제 9 |
문제
SQL문 1
SELECT host_year, host_nation, mascot
FROM olympic
WHERE mascot IS NULL
|
결과 1
no
|
host_year
|
host_nation
|
mascot
|
1
|
1968
|
Mexico
|
NULL
|
2
|
1964
|
Japan
|
NULL
|
3
|
1960
|
Italy
|
NULL
|
4
|
1956
|
Australia
|
NULL
|
5
|
1952
|
Finland
|
NULL
|
6
|
1948
|
England
|
NULL
|
7
|
1936
|
Germany
|
NULL
|
8
|
1932
|
USA
|
NULL
|
9
|
1928
|
Netherlands
|
NULL
|
10
|
1924
|
France
|
NULL
| |
|
SQL문 2
SELECT host_year, host_nation, mascot
FROM olympic
WHERE mascot = NULL
|
결과 2
no
|
host_year
|
host_nation
|
mascot
|
(NULL)
|
(NULL)
|
(NULL)
|
(NULL)
| |
|
설명
큐브리드에서는 NULL값을 가진 행은 ‘=’ 연산자로 검사할 수 없다.
| |
ROWNUM 컬럼
SELECT문을 이용한 질의 조회 결과는 결과 테이블로 나타난다. 질의 결과 테이블은 데이터베이스에 저장되어 있는 실제 테이블에서 값을 추출한 메모리상의 임시 테이블로서 실제 테이블과는 다르다. 예를 들어, SELECT * FROM NATION문으로 모든 데이터를 조회하면 데이터베이스에 있는 DEPARTMENT 테이블로부터 값을 메모리로 복사한 임시 테이블을 출력 결과로 보여준다. 이러한 결과 테이블에는 자동으로 행들의 순서가 매겨지는데 그 순서를 ROWNUM 컬럼이 가지고 있다. (ROWNUM은 큐브리드의 내장 함수지만 뒤에 괄호 ()가 붙지 않기 때문에 컬럼으로 부르기로 한다.) ROWNUM 컬럼은 출력되는 행들이 너무 많이 나타나지 않게 하는 데에도 유용하다. ROWNUM 컬럼 대신에 INST_NUM() 함수를 사용할 수도 있다.
예제 10 |
문제
NATION 테이블에서 NAME(국가)와 CAPITAL(수도)를 조회하되 5개만 보이게 하라.
SQL문
SELECT name, capital
FROM nation
WHERE ROWNUM <= 5
혹은
SELECT name, capital
FROM nation
WHERE ROWNUM BETWEEN 1 AND 5
혹은
SELECT name, capital
FROM nation
WHERE INST_NUM() <= 5
|
결과
no
|
name
|
capital
|
1
|
Serbia
|
Beograd
|
2
|
Kiribati
|
Tarawa
|
3
|
Serbia-and-Montenegro
|
Beograd
|
4
|
Timor-Leste
|
Dili
|
5
|
Zimbabwe
|
Harare
| |
|
|
|
출처 : http://cafe.naver.com/studycubrid.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=687 |