문자형 상수, 연산자, 함수
예제 11 |
문제
CODE 테이블을 이용하여 'Hello, world!'를 대문자와 소문자로 표현하라.
SQL문
SELECT UPPER('Hello, world!') AS "UPPER"
LOWER('Hello, world!') AS "LOWER"
FROM code;
|
결과
no
|
UPPER
|
LOWER
|
1
|
HELLO,WORLD!
|
hello,world!
|
2
|
HELLO,WORLD!
|
hello,world!
|
3
|
HELLO,WORLD!
|
hello,world!
|
4
|
HELLO,WORLD!
|
hello,world!
|
5
|
HELLO,WORLD!
|
hello,world!
|
6
|
HELLO,WORLD!
|
hello,world!
| |
|
설명
UPPER/LOWER 함수는 모든 소문자 ASCII 또는 ISO 8859-1 라틴 문자를 대문자/소문자로 변환한 형태의 문자열을 반환한다.
| |
예제 12 |
문제
DB_ROOT 테이블을 이용하여 'Hello, world!'를 대문자와 소문자로 표현하라.
SQL문
SELECT UPPER('Hello, world!') AS "UPPER"
LOWER('Hello, world!') AS "LOWER"
FROM db_root;
|
결과
no
|
UPPER
|
LOWER
|
1
|
HELLO,WORLD!
|
hello,world!
| |
|
설명
DB_ROOT 테이블은 단 하나의 레코드만을 가지고 있는 테이블이며, 본 예제와 같이 간단한 연산이나 함수를 적용할 때 유용하게 사용할 수 있다. CUBRID 2008 R3.0 버전부터 FROM 이하 절의 생략이 가능해져 위의 질의는 다음과 같이 표현이 가능하다.
SELECT UPPER('Hello, world!') AS "UPPER"
LOWER('Hello, world!') AS "LOWER" ;
|
| |
예제 13 |
문제
SUBSTR을 사용하여 문자열 'CUBRID'의 부분 문자열을 조회하되, 3번째 바이트부터 4바이트, 3번째 바이트부터 10바이트, 뒤에서 세 번째 바이트부터 3바이트를 각각 조회하라.
SQL문
SELECT SUBSTR('CUBRID', 3, 4),
SUBSTR('CUBRID', 3, 10),
SUBSTR('CUBRID', -3, 3)
FROM db_root;
|
결과
no
|
SUBSTR('CUBRID',3,4)
|
SUBSTR('CUBRID',-3,3)
|
SUBSTR('CUBRID', 1,-1)
|
1
|
BRID
|
RID
|
NULL
| |
|
설명
SUBSTR 함수는 문자열의 일부를 반환하는 함수로써 SUBSTR(컬럼, 시작 바이트, 바이트 크기)의 형식을 지닌다. 시작 바이트는 1부터 시작되며, 두 번째 컬럼처럼 문자열의 전체 길이가 10바이트 미만인데도 10바이트를 요청하면 컬럼이 가지고 있는 크기까지만 반환한다. 또한 시작 바이트가 음수 값을 가지면 뒤에서부터 시작 바이트를 찾아내며 바이트 크기가 0이면 빈 문자열을 반환한다. 마지막으로 바이트 크기가 음수이면 NULL 값을 반환한다.
| |
예제 14 |
문제
다음은 문자열 'United Arab Emirates' 중 문자열 'Arab' 의 위치를 반환하는 쿼리 문을 작성하라.
SQL문
SELECT INSTR('United Arab Emirates', 'Arab', 1) AS INSTR_1,
INSTR('United Arab Emirates', 'Arab',8) AS INSTR_2,
INSTR('United Arab Emirates', 'Arab',9) AS INSTR_3
FROM db_root;
|
결과
no
|
INSTR_1
|
INSTR_2
|
INSTR_3
|
1
|
8
|
8
|
0
| |
|
설명
INSTR 함수는 POSITION 함수와 유사하게 한 스트링 내에서 다른 스트링의 위치를 반환하는 함수이나, 탐색을 시작할 위치를 지정할 수 있다. INSTR_3의 경우 시작할 위치를 해당 문자열의 위치보다 뒤에 설정하였기 때문에 0으로 출력된다.
| |
숫자형 상수, 연산자, 함수
예제 15 |
문제
15 나누기 2, 15 나누기 2.0 값을 조회하라.
SQL문
SELECT 15/2, 15/2.0
FROM db_root;
|
결과
no
|
15/2
|
15/2.0
|
1
|
7
|
7.500000000
| |
|
설명
소수점이 없는 숫자 상수는 INTEGER 타입으로 간주한다. 2.0과 같이 소수점을 사용하면 NUMERIC 타입으로 간주한다.
| |
예제 16 |
문제
123.456을 소수점 첫째 자리에서 반올림한 값, 둘째 자리에서 반올림한 값, 십의 자리에서 반올림한 값을 각각 구하라.
SQL문
SELECT ROUND(123.456, 0), ROUND(123.456, 1), ROUND(123.456, -1)
FROM db_root;
|
결과
no
|
ROUND(123.456,0)
|
ROUND(123.456,1)
|
ROUND(123.456,-1)
|
1
|
123.000
|
123.500
|
160.000
| |
|
설명
결과 테이블의 첫 번째 컬럼과 두 번째 컬럼은 모두 소수점 첫째 자리에서 반올림한 값을 의미한다. 내림한 값을 구하려면 TRUNC 함수를 사용한다.
| |
예제 17 |
문제
5를 3으로 나눈 나머지, 2의 3승, 임의의 정수를 각각 구하라.
SQL문
SELECT MOD(5, 3), POWER(2, 3), RAND(), RANDOM()
FROM db_root;
|
결과
no
|
MOD(5,3)
|
POWER(2,3)
|
RAND()
|
RANDOM()
|
1
|
2
|
8
|
19169
|
24432
| |
|
설명
RANDOM/RAND 함수는 구간 [ 0, 231]에서 균일 분포(uniform distribution) 임의 값을 정수로 반환한다. RAND 함수는 출력하는 행의 개수와 상관없이 한 개의 구문에서는 한 개의 값을 생성하고, RANDOM 함수는 출력하는 행마다 다른 값을 생성한다.
| |
날짜형 연산자, 함수
예제 18 |
문제
시스템의 현재 날짜, 현재 시간, 현재 날짜와 시간을 구하라.
SQL문
SELECT SYSDATE, SYSTIME, SYSTIMESTAMP, SYSDATETIME
FROM db_root;
혹은
SELECT SYS_DATE, SYS_TIME, SYS_TIMESTAMP, SYSDATETIME
FROM db_root;
|
결과
no
|
SYSDATE
|
SYSTIME
|
SYSTIMESTAMP
|
SYSDATETIME
|
1
|
2009-10-28
|
10:57:58
|
2009-10-28 10:57:58
|
2009-10-28 10:57:58
| |
|
설명
TIMESTAMP는 허용되는 값의 범위가 GMT로 1970년 1월 1일 0시 0분 0초부터 2038년 1월 19일 03시 14분 07초로 다소 제한적이지만 DATETIME은 0001년 01월 01일 0시 0분 0초부터 9999년 12월 31일 23시 59분 59초까지로 제한 범위가 매우 크다.
| |
예제 19 |
문제
시스템의 현재 날짜와 현재 날짜에서 180일 후의 날짜를 구하라.
SQL문
SELECT SYSDATE, SYSDATE + 180
FROM db_root;
|
결과
no
|
SYSDATE
|
SYSDATE+180
|
1
|
2009-10-28
|
2010-04-26
| |
|
| |
예제 20 |
문제
현재 날짜에서 1년이 지난 날짜를 조회하라
SQL문
SELECT ADD_MONTHS(SYSDATE, 12)
FROM db_root;
|
결과
no
|
ADD_MONTHS(SYS_DATE,12)
|
1
|
2010-10-28
| |
|
설명
ADD_MONTHS 함수는 주어진 날짜에 개월을 더한 날짜를 반환한다. 계산된 날짜가 해당 월의 마지막 날보다 크면 마지막 날이 반환된다. 그 외에는 같은 날이 반환된다.
| |
예제 21 |
문제
OLYMPIC 테이블에서 1988년 이후에 개최한 국가와 개최 날짜를 조회하라.
SQL문
SELECT host_nation, opening_date
FROM olympic
WHERE EXTRACT(YEAR FROM opening_date) >= 1988;
|
결과
no
|
host_nation
|
opening_date
|
1
|
Greece
|
2004-08-13
|
2
|
Australia
|
2000-09-15
|
3
|
USA
|
1996-07-19
|
4
|
Spain
|
1992-07-25
|
5
|
Korea
|
1988-09-17
| |
|
설명
EXTRACT 함수는 DATE나 DATETIME, TIMSTAMP 형의 데이터에서 연(YEAR), 월(MONTH), 일(DAY), 시(HOUR), 분(MINUTE), 초(SECOND))의 값을 꺼내어 사용 한다.
| |
데이터 타입 변환 함수
예제 22 |
문제
STADIUM 테이블의 AREA 컬럼의 값을 정수로 형 변환(소수 -> 정수)하여 조회하라.
SQL문
SELECT nation_code, CAST(area AS INT)
FROM stadium;
|
결과
no
|
nation_code
|
CAST(are AS INT)
|
1
|
GRE
|
7024
|
2
|
GRE
|
21000
|
3
|
GRE
|
12800
|
4
|
GRE
|
27000
|
5
|
GRE
|
23000
|
6
|
GRE
|
86300
|
7
|
GRE
|
20000
|
8
|
GRE
|
54700
|
9
|
GRE
|
31000
|
10
|
GRE
|
9000
| |
|
설명
실제로 출력해보면 소수 자리까지 출력이 되겠지만 INT형으로 변환하여 출력하였기 때문에 소수점은 생략됐다.
| |
예제 23 |
문제
CAST 함수를 이용하면 VARCHAR와 CHAR의 차이를 확인해 볼 수 있다. 아래의 SQL문과 결과 테이블을 참고하라.
SQL문
SELECT CHAR_LENGTH(CAST('큐브리드' AS CHAR(10))) AS CAST_CHAR,
CHAR_LENGTH(CAST('큐브리드' AS VARCHAR(10))) AS CAST_VARCHAR
FROM db_root;
|
결과
no
|
CAST_CHAR
|
CAST_VARCHAR
|
1
|
10
|
8
| |
|
설명
사용하는 문자 세트가 2바이트 완성형(ko_KR.euckr)인 경우 한글 1글자는 2바이트를 사용하므로 위의 예에서 8은 '큐브리드'를 저장하기 위해 사용하는 실제 바이트 수이다.
사용하는 문자 세트가 UTF-8 인 경우 한글 1글자가 3바이트를 사용하게 되어 문자열 ‘큐브리드’의 저장을 위해 총 12바이트가 필요하다.
| |
예제 24 |
문제
OLYMPIC 테이블의 OPENING_DATE(개최일)을 다양한 유형의 날짜로 조회하라.
SQL문 1
SELECT TO_DATE('2007-08-09', 'YYYY-MM-DD') AS "NORMAL",
TO_DATE('AUG/09/2007', 'MON/DD/YYYY', 'En_US') AS "ENG",
TO_DATE('2007-8월-9', 'YYYY-MONTH-DD', 'Ko_KR') AS "KOR"
FROM db_root;
|
결과 1
no
|
NORMAL
|
ENG
|
KOR
|
1
|
2007-08-09
|
2007-08-09
|
2007-08-09
| |
|
SQL문 2
SELECT TO_DATETIME('10:15:20 2009/06/15', 'HH:MI:SS YYYY/MM/DD') AS NORMAL
FROM db_root
|
결과 2
no
|
NORMAL
|
1
|
2009-06-15 10:15:20.000
| |
|
설명
TO_DATE 함수는 문자형 데이터로부터 날짜 형 데이터로 데이터 타입을 변환하는 데 사용된다. 응용 프로그램에서 입력 받은 문자열 데이터를 큐브리드의 날짜형 컬럼에 입력할 때 유용하다. (TO_DATETIME, TO_TIMESTAMP 함수와 사용 방법 동일)
| |
예제 25 |
문제
OLYMPIC 테이블의 OPENING_DATE(개최일)을 다양한 유형의 날짜로 조회하라.
SQL문
SELECT opening_date,
TO_CHAR(opening_date, 'YYYYMMDD') AS "YYYYMMDD",
TO_CHAR(opening_date, 'YYYY-MON') AS "YYYY-MON",
TO_CHAR(opening_date, 'MM"월" DD"일" "("DY")"', 'Ko_KR') AS "MM월 DD일 (DY)"
FROM db_root;
|
결과
no
|
opening_date
|
YYYYMMDD
|
YYYY-MON
|
MM월DD일(DY)
|
1
|
2004-08-13
|
20040813
|
2004-AUG
|
08월13일(금)
|
2
|
2000-09-15
|
20000915
|
2000-SEP
|
09월15일(금)
|
3
|
1996-07-19
|
19960719
|
1996-JUL
|
07월19일(금)
|
4
|
1992-07-25
|
19920725
|
1992-JUL
|
07월25일(토)
|
5
|
1988-09-17
|
19880917
|
1988-SEP
|
09월17일(토)
| |
|
설명
TO_CHAR 함수는 TO_DATE 함수와 반대로 날짜 데이터 타입을 문자열로 바꾸는 기능을 제공한다. 기본적으로 날짜 및 시간에 붙여 쓰는 구분자 { -, /, ', ., ;, : } 외의 기호를 구분자로 사용하려면 네 번째 컬럼과 같이 이중따옴표(")로 감싸주어야 한다. TO_CHAR 함수는 DATE형 뿐만 아니라, TIME, TIMESTAMP 타입에도 적용할 수 있다.
| |
예제 26 |
문제
HISTORY 테이블의 VARCHAR 타입의 SCORE 컬럼을 숫자 형으로 바꾸어 출력하라.
SQL문
SELECT TO_NUMBER(score)
FROM history
WHERE unit='score';
|
결과
no
|
TO_NUMBER(score)
|
1
|
8893
|
2
|
124
|
3
|
125
|
4
|
144
|
5
|
596
| |
|
| |
기타 연산자, 함수
예제 27 |
문제
OLYMPIC 테이블에서 MASCOT가 NULL인 컬럼의 내용을 'None'으로 바꾸어 HOST_YEAR, HOST_NATION 컬럼과 같이 출력하라.
SQL문
SELECT host_year, host_nation, NVL(mascot, 'None')
FROM olympic;
|
결과
no
|
host_year
|
host_nation
|
mascot
5
|
1988
|
Korea
|
HODORI
|
6
|
1984
|
USA
|
Sam
|
7
|
1980
|
USSR
|
Misha
|
8
|
1976
|
Canada
|
Amik
|
9
|
1972
|
Germany
|
Waldi
|
10
|
1968
|
Mexico
|
None
|
11
|
1964
|
Japan
|
None
|
12
|
1960
|
Italy
|
None
|
13
|
1956
|
Australia
|
None
|
14
|
1952
|
Finland
|
None
|
| |
|
설명
NVL 함수는 첫 번째 매개변수가 NULL 값이면 두 번째 매개변수를 반환하는 함수이다.
| |
예제 28 |
문제
OLYMPIC 테이블에서 MASCOT가 NULL이면 'YES'를 NULL이 아니면 'NO' 를 출력하는 컬럼을 추가하라.
SQL문
SELECT host_year, host_nation, NVL2(mascot, 'YES', 'NO')
FROM olympic;
|
결과
no
|
host_year
|
host_nation
|
Null Value Check
|
5
|
1988
|
Korea
|
YES
|
6
|
1984
|
USA
|
YES
|
7
|
1980
|
USSR
|
YES
|
8
|
1976
|
Canada
|
YES
|
9
|
1972
|
Germany
|
YES
|
10
|
1968
|
Mexico
|
NO
|
11
|
1964
|
Japan
|
NO
|
12
|
1960
|
Italy
|
NO
|
13
|
1956
|
Australia
|
NO
|
14
|
1952
|
Finland
|
NO
| |
|
설명
NVL2 함수는 첫 번째 매개변수가 NULL 값이 아니면 두 번째 매개변수로, NULL 값이면 세 번째 매개변수를 반환하는 함수이다.
| |
예제 29 |
문제
OLYMPIC 테이블에서 HOST_CITY가 'Seoul' 인 것만 Local Number(지역번호)를 '02' 설정하는 쿼리 문을 작성하라.
SQL문
SELECT host_city, DECODE(host_city, 'Seoul', '02', 'Others') AS "Local Number"
FROM olympic;
|
결과
no
|
host_year
|
host_nation
|
1
|
Athens
|
Others
|
2
|
Sydney
|
Others
|
3
|
Atlanta
|
Others
|
4
|
Barcelona
|
Others
|
5
|
Seoul
|
02
|
6
|
Los Angeles
|
Others
|
7
|
Moscow
|
Others
|
8
|
Montrea
|
l Others
|
9
|
Munich
|
Others
|
10
|
Mexico City
|
Others
| |
|
설명
DECODE 함수는 첫 번째 매개변수와 두 번째 매개변수를 비교하여 같으면 세 번째 매개변수를, 거짓이면 네 번째 매개변수를 반환하는 함수이다.
| |
예제 30 |
문제
PARTICIPANT 테이블에서 GOLD 수가 30개 이상인 국가의 레벨을 1, GOLD 수가 20개 이상인 국가의 레벨을 2, GOLD 수가 20개 미만인 국가의 레벨을 3 으로 표현하는 컬럼을 추가하여 조회하라. (단, GOLD 수가 15개 이상인 국가만 출력함.)
SQL문
SELECT host_year, nation_code, gold
CASE WHEN gold >= 30 THEN 1,
WHEN gold >= 20 THEN 2
WHEN gold < 20 THEN 3
END AS LEVEL
FROM olympic;
|
결과
no
|
host_year
|
nation_code
|
gold
|
level
|
1
|
2004
|
JPN
|
16
|
3
|
2
|
2004
|
AUS
|
17
|
3
|
3
|
2004
|
RUS
|
27
|
2
|
4
|
2004
|
CHN
|
32
|
1
|
5
|
2004
|
USA
|
36
|
1
|
6
|
2000
|
RUS
|
32
|
1
|
7
|
2000
|
USA
|
37
|
1
|
8
|
2000
|
AUS
|
16
|
3
|
9
|
2000
|
CHN
|
28
|
2
|
10
|
1996
|
CHN
|
16
|
3
| |
|
설명
CASE절은 WHEN <표현식> THEN <값>의 형식을 반복하여 조건 별로 값을 반환한다. WHEN절에서 모든 조건을 만족하지 않을 때는 ELSE절의 값을 반환한다.
CASE절은 END로 마감 해야 한다.
| |
예제 31 |
문제
PARTICIPANT 테이블에서 NATION_CODE가 'KOR' 또는 'JPN' 인 GOLD 컬럼을 출력하라.
SQL문
SELECT host_year, nation_code,
FROM olympic
WHERE nation_code IN ('KOR', 'JPN');
|
결과
no
|
host_year
|
nation_code
|
gold
|
1
|
2004
|
JPN
|
16
|
2
|
2000
|
JPN
|
5
|
3
|
1996
|
JPN
|
3
|
4
|
1992
|
JPN
|
3
|
5
|
1988
|
JPN
|
4
|
6
|
2004
|
KOR
|
9
|
7
|
2000
|
KOR
|
8
|
8
|
1996
|
KOR
|
7
|
9
|
1992
|
KOR
|
12
|
10
|
1988
|
KOR
|
12
| |
|
설명
IN 함수는 소괄호 안에 나열된 값들의 집합에서 컬럼의 값이 존재하면 참을 반환하는 함수이다. IN 함수는 OR 연산자로 바꾸어 표현할 수 있다.
| |
예제 32 |
문제
ATHLETE 테이블에서 성이 Hong인 운동 선수를 조회하라.
SQL문
SELECT name, gender, nation_code, event
FROM athlete
WHERE NAME LIKE 'Hong %';
|
결과
no
|
name
|
gender
|
nation_code
|
event
|
1
|
Hong Sung Sik
|
M
|
KOR
|
Boxing
|
2
|
Hong Jeong-Ho
|
W
|
KOR
|
Handball
|
3
|
Hong Cha Ok
|
W
|
KOR
|
Table Tennis
|
4
|
Hong Sung-Heon
|
M
|
KOR
|
Baseball
| |
|
설명
LIKE 함수를 사용할 때 '%' 문자는 문자열 내에서 와일드카드 문자로 사용된다. 물론 문자열의 앞에서도 사용이 가능하며, WHERE절의 문자열 내에서 '%'를 기호로 사용하려면 역슬래쉬(''를 앞에 붙인 후 ESCAPE ''를 추가하면 된다.
| |
예제 33 |
문제
HISTORY 테이블에서 HOST_YEAR 컬럼의 내용이 '20__' 형태인 것을 출력하라.
SQL문
SELECT athlete, host_year
FROM history
WHERE TO_CHAR(host_year) LIKE '20__';
|
결과
no
|
athlete
|
host_year
|
1
|
Phelps Michael
|
2004
|
2
|
Peirsol Aaron
|
2004
|
3
|
Hackett Grant
|
2004
|
4
|
Thorpe Ian
|
2000
|
5
|
Thorpe Ian
|
2004
|
6
|
Van Den Hoogenband Pieter
|
2000
| |
|
설명
'_' 문자는 한 글자를 의미하는 와일드카드 문자이다. 한글과 영문 모두 한 글자를 의미하는 것으로서 한 바이트를 의미하는 것은 아니다. 참고로 HOST_YEAR 컬럼의 데이터 타입이 INT 형이기 때문에 문자 형으로 변환하여 '_' 와일드 카드를 활용하여 조회하였다.
| |
출처 : http://cafe.naver.com/studycubrid.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=688 |