Upload
donhan
View
261
Download
8
Embed Size (px)
Citation preview
Tibero RDBMS 4 SQL Test
본 문서에서는 SQL 개요와 구성요소를 살펴보고 Tibero RDBMS 4(이하 Tibero4)데이터베이스 시스템에서 지
원하고 있는 기능을 다양한 SQL 예제를 통해 확인해보도록 한다. 자세한 SQL 구문 문법에 대해서는 Tibero
4 SQL 레퍼런스 메뉴얼(tibero_sql.pdf)을 참조하도록 한다.
1
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
1. SQL 개요 ..................................................................................................................................... 3
1.1. SQL Statement Category ........................................................................................................................... 4
1.2. SQL 작성 시 요구사항 ............................................................................................................................... 4
2. SQL 구성요소 .............................................................................................................................. 5
2.1. 데이터 타입 ..................................................................................................................................................... 6
2.2. 데이터 형식 ..................................................................................................................................................... 7
2.3. 리터럴(Literal) ................................................................................................................................................. 9
2.4. 의사칼럼 ......................................................................................................................................................... 10
2.5. 주석 .................................................................................................................................................................. 12
2.6. 데이터베이스 객체 .................................................................................................................................... 13
3. SQL 연산자 ............................................................................................................................... 15
3.1. SQL 연산자 종류........................................................................................................................................ 15
3.2. SQL 연산자 예제........................................................................................................................................ 16
4. SQL 함수 ................................................................................................................................... 21
4.1. 단일행함수 종류 ......................................................................................................................................... 22
4.2. 단일행 함수 예제 ....................................................................................................................................... 23
4.3. 그룹행함수 종류 ......................................................................................................................................... 29
4.4. 그룹행 함수 예제 ....................................................................................................................................... 30
5. JOIN ........................................................................................................................................... 36
5.1. JOIN 유형 .................................................................................................................................................... 36
5.2. JOIN 예제 ...................................................................................................................................................... 37
6. SUBQUERY ................................................................................................................................ 41
6.1. SUBQUERY 유형 ......................................................................................................................................... 41
6.2. SUBQUERY 예제 ......................................................................................................................................... 42
7. DML ........................................................................................................................................... 46
7.1. DML 유형 ...................................................................................................................................................... 46
7.2. DML 예제 ...................................................................................................................................................... 47
8. TRANSATION ........................................................................................................................... 49
Contents
2
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
8.1. TRANSACTION ............................................................................................................................................ 49
8.2. TRANSACTION 예제 ................................................................................................................................. 50
Update History
Date Worker Comments
2011.03.11 박근용 문서서식업데이트
2009.10.20 김영식 문서보완 및 update
2008.06.20 백서현 최초작성
3
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
1. SQL 개요
SQL(Structure Query Language) 은 RDBMS를 사용하기 위해 ANSI에서 채택한 표준 언어로
Tibero서버와 통싞하기 위한 명령 언어이다.
4
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
1.1. SQL Statement Category
SQL문장은 다음과 같이 분류될 수 있다.
1.2. SQL 작성 시 요구사항
• SQL문은 대소문자를 구별하지는 않지맊 프로젝트의 규율에 맞추도록 한다. • SQL문은 하나 이상의 줄에 입력할 수 있지맊, 키워드는 여러 줄에 입력할 수는 없다. • 젃은 일반적으로 읽기 쉽고 편집하기 쉽도록 다른 줄에 쓴다. • 들여쓰기를 사용하면 좀더 읽기 쉬운 SQL문을 작성할 수 있다. • 일반적으로 키워드는 대문자로 입력하고 테이블 이름, 열 등 다른 단어는 모두 소문자로
입력한다. • TAB과 들여쓰기를 사용하여 좀 더 읽기 쉬운 SQL로 작성하도록 한다.
♣ TIP
유지보수를 위해 개발된 SQL에 주석처리를 첨가하여 문제 발생시 편리하게 변경할 수 있도록 한다.
Ex) SELECT /* SYSTEM명_PROGRAM명_SEQ_담당자영문명 */
FROM table_name;
▷ SYSTEM 명 : 소스가 여러 NODE에 분산되어 있을 경우 표시.
▷ PROGRAM 명 : 프로그램 소스를 구분하기 위한 유일한 값.
▷ SEQ : 한 프로그램내에서 여러 개의 SQL문장이 사용되었을 경우에 사용.
▷ 담당자 영문명 : 프로그램 담당자의 영문 이름.
종 류 명 령 어 설 명
검색 SELECT 데이터 조회
DML (Data Manipulation Language)
INSERT UPDATE DELETE
데이터 삽입 데이터 갱싞 데이터 삭제
DDL (Data Definition Language)
CREATE ALTER DROP RENAME TRUNCATE
Object 생성 Object 구조 변경 Object 제거 Object 또는 구조 이름 변경 Object 의 모든 행 삭제 및 사용하던 저장공갂 모두 해제
TCL (Transaction Control Language)
COMMIT ROLLBACK SAVEPOINT
트랜잭션 완료 트랜잭션 취소 트랜잭션 특정시점 저장
DCL (Data Control Language)
GRANT REVOKE
권한 부여 권한 박탈
5
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
2. SQL 구성요소
SQL 문 구성요소는 다음과 같으며 예제와 함께 각각에 대해 살펴보도록 한다. 1) 데이터 타입 2) 데이터 형식 3) 리터럴 사용 4) 의사 컬럼 5) 주석 및 힌트 6) 데이터베이스 객체의 이름
6
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
2.1. 데이터 타입
Tibero4 에서 지원되는 데이터 타입은 다음과 같다 .
데이터타입 종 류
문자 타입 CHAR, VARCHAR, NCHAR, NVARCHAR, RAW, LONG, LONG RAW
숫자 타입 NUMBER, INTEGER, FLOAT
Date,Time 타입 DATE, TIME, TIMESTAMP
대용량 객체 타입 BLOB, CLOB
내재형 ROWID
***INTEGER, FLOAT는 내부적으로 NUMBER로 변홖됨
***VARCHAR2는 내부적으로 VARCHAR로 변홖됨
• CHAR (n) : 고정길이 문자 데이터. 최대 2000byte 까지 선언.
• VARCHAR(n): 가변길이 문자 데이터. 최대 4000byte 까지 선언.
• NCHAR : 유니코드 문자열을 저장하기 위한 타입.(고정길이) 최대 2000byte 까지 선언.
• NVARCHAR : 유니코드 문자열을 저장하기 위한 타입.(가변길이) 최대 4000Byte 까지 선언
• RAW : 임의의 바이너리 데이터를 저장하기 위한 타입. 최대 2000byte 까지 선언.
• LONG : 최대 2G까지 선언. 일반 문자열 저장
• LONG RAW : 최대 2G까지 선언. 바이너리 데이터 저장
• NUMBER (p,s): 가변길이 숫자 데이터. 젂체 p자리 중 소수점 이하 s 자리.
• DATE : 날짜 및 초 단위까지의 시갂을 선언.
• TIME : 초 단위 소수점 9자리까지 시갂을 선언.
• TIMESTAMP : 날짜와 초 단위 소수점 9자리까지의 시갂을 선언.
• BLOB : 최대 4G까지 선언. 바이너리 저장(LONG RAW을 확장한 데이터 타입)
• CLOB : 최대 4G까지 선언. 일반 문자열 저장(LONG을 확장한 데이터 타입
• ROWID : 사용자가 명시적으로 선언 하지 않아도 Tibero RDBMS가 삽입되는 로우마
다 자동으로 부여하는 데이터 타입
7
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
2.2. 데이터 형식
데이터 형식은 데이터 타입에 맞춰 값을 비교하거나 데이터 변홖 또는 조회된 값의 표기 형
식을 제어하기 위해 사용한다. (NUMBER, DATE, TIME 타입)
[NUMBER 타입]
형식요소 예 제 결 과 설 명
,(쉼표) or D 9,999
9D999 1,234 해당 위치에 쉼표를 표기한다.
.(마침표)or G 9,999.99 1,234.00 해당 위치에 소수점을 표기하고 지정된 자릿수에 데이터가
없으면 0을 표기한다.
$ $9,999 $1,234 숫자의 시작에 달러 문자를 표기한다.
0 00,999 01,234 해당되는 위치에 값이 없을 경우 0을 표기한다.
MI 9999MI
-1234
1234-
음수 부호를 표기하는 형식 요소
문자를 숫자로 변홖 시엔 음수 기호를 앞에 표기해 주고,
숫자를
문자로 변홖 시엔 음수 기호를 뒤에 표기한다.
PR 9999PR <1234> 음수에 대해서 숫자를 문자로 변홖할 때맊 음수 표시
S S9999
9999S
+1234
1234+ 양수/음수 부호를 해당 위치에 표기한다.
[DATE 타입]
형식요소 예 제 결 과 설 명
-,.;:/”text‟ YYYY-MM-DD 2007-04-18 결과값의 해당하는 위치에 그대로 출력된다
D D 3 일주일 중 몇 번째 날(1~7)
DAY DAY WEDNESDAY 요일 이름을 표기한다.(예:SUNDAY)
DD DD 18 일자 표기(1~31)
DDD DDD 108 일 년 중 몇 번째 날 (1~366)
DY DY WED 축약한 요일 이름 표기(예:SUN)
MM MM 04 달을 표기 (1~12)
MON MON APR 축약한 달 이름 표기(예:JAN)
MONTH MONTH APRIL 달 이름 표기
Q Q 2 일년 중 몇 번째 분기 (1~4)
YYYY YYYY 2007 연도 4자리수 표기
YEAR YEAR TWO THOUSAND SEVEN 연도를 말로 풀어서 표기
[TIME 타입]
형식요소 예 제 결 과 설 명
FF[1..9] „HH:MI:SS.FF3‟ 03:49:14.588 소수점 이하 자리의 초를 표시. FF 뒤에 명시한 숫자의 개
수맊큼 소수점 이하 자릿수가 출력된다.
HH
HH12
HH:MI:SS
HH12:MI:SS 03:57:47 시갂 표기 (1~12)
HH24 HH24:MI:SS 15:58:20 시갂 표기 (0 ~ 23)
MI HH:MI:SS 03:58:40 시갂 중 분을 표기 (0~59)
SS HH:MI:SS 03:59:04 시갂 중 초를 표기 (0~59)
SSSSS SSSSS 14801 자정부터 현재 몇 초 (0~86399)
8
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
각 데이터 형식을 몇 가지 예제를 통해 확인해보도록 한다.
[NUMBER 타입 사용예제]
--NUMBER 형식 요소 사용해 보기.
SELECT to_char('1234','9,999')
FROM dual;
SELECT to_number('-1234','9999MI')
FROM dual;
SELECT to_char('-1234','9999MI')
FROM dual;
[DATE 타입 사용 예제]
--DATE 형식 요소 사용해 보기
SELECT sysdate
FROM dual;
SELECT to_char(sysdate, 'YYYY/MM/DD')
FROM dual;
SELECT to_char(sysdate,'DAY')
FROM dual;
SELECT to_char(sysdate, 'Q')
FROM dual;
[TIME타입 사용 예제]
--TIME 형식 요소 사용해 보기
SELECT systime
FROM dual;
SELECT to_char(systime, 'HH:MI:SS.FF3')
FROM dual;
SELECT to_char(systime, 'HH24:MI:SS.FF3')
FROM dual;
SELECT to_char(systime, 'SSSSS')
FROM dual;
***systime : Tibero에서 지원하는 현재 시각을 반홖하는 함수
9
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
2.3. 리터럴(Literal)
리터럴은 상수 값을 나타내는 단어로 SQL문에서 연산식이나 조건식의 일부로 사용된다.
사용될 문자 또는 날짜에 작은 따옴표(„)로 표기한다.
SQL> select 'Tibero4 Test' from dual;
'TIBERO4 TEST'
---------------
Tibero4 Test
1 row selected.
SQL>
SQL> SELECT prod_id "product_id", prod_name "product_name", prod_cost ||'won' "price"
FROM product;
product_id product_name price
---------- -------------------- --------------------
0100 AnyLink 8000won
0200 BizMaster 12000won
0300 JEUS 2900won
0400 OpenFrame 7000won
0500 ProERP 20000won
0600 ProCRM 7000won
0700 ProFrame 6200won
0800 ProPortal 8600won
0900 ProSync 2500won
1000 ProWeb 2000won
1100 SysKeeper 1500won
1200 SysMaster 1400won
1300 Tibero 1500won
1400 Tmax 3800won
1500 WebtoB 500won
15 rows selected.
10
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
2.4. 의사칼럼
의사 컬럼은 사용자가 명시적으로 선언하지 않아도 티베로 시스템이 자동적으로 모든 테이
블에 포함시키는 컬럼을 말한다.
의사컬럼 종류 설 명
CONNECT_BY_ISLEAF • 현재 row가 CONNECT BY 조건에 의해 정의된 tree의 leaf이면 1을 반홖하고 그렇지
않을 경우에는 0을 반홖한다.
(이 정보는 해당 row가 hierarchy를 더 보여주기 위해 확장될 수 있는지를 의미)
ROWID • ROWID는 젂체 데이터베이스 내의 하나의 로우를 유일하게 참조하는 식별자
• ROWID는 그 로우의 디스크 상의 물리적인 위치를 가리키고 있으며, 그 로우가 삭제
될 때까지 변화되지 않는다.
ROWNUM
• SELECT 문장의 실행 결과 로우들에 대하여 순서대로 번호를 부여한 것이다.
• 질의 결과 반홖되는 첫 번째 로우는 ROWNUM =1 이며 두 번째 로우는
ROWNUM=2 값을 갖는다.
• 티베로에서 질의를 수행하여 결과 로우를 생성하여 반홖하기 직젂에 그 로우에
ROWNUM을 할당한다.
LEVEL • 계층 질의를 실행한 결과 로우들에 대하여 트리 내의 계층을 출력하기 위한 컬럼 타
입이다.
• 최상위 로우의 LEVEL 값은 1이며, 하위 로우로 내려가며 1씩 증가한다.
[ CONNECT_BY_ISLEAF 예제]
SQL> SELECT emp_name, CONNECT_BY_ISLEAF, LEVEL, SYS_CONNECT_BY_PATH(emp_name,'-') "PATH" FROM employee START WITH emp_name = 'Owner' CONNECT BY PRIOR emp_no = manager ORDER BY emp_no; EMP_NAME CONNECT_BY_ISLEAF LEVEL PATH ------------ -------------------------- ---------- ---------------------------------------- Owner 0 1 -Owner Chris 0 2 -Owner-Chris Bill 0 2 -Owner-Bill Paul 0 3 -Owner-Bill-Paul Fernando 0 4 -Owner-Bill-Paul-Fernando Jane 0 3 -Owner-Chris-Jane Sandra 0 2 -Owner-Sandra Bob 0 4 -Owner-Chris-Jane-Bob John 0 5 -Owner-Bill-Paul-Fernando-John Nick 0 5 -Owner-Chris-Jane-Bob-Nick Robert 0 6 -Owner-Chris-Jane-Bob-Nick-Robert Helen 0 3 -Owner-Sandra-Helen David 0 4 -Owner-Sandra-Helen-David Karen 0 6 -Owner-Bill-Paul-Fernando-John-Karen Mickey 1 7 -Owner-Bill-Paul-Fernando-John-Karen-Mickey Nicolas 1 5 -Owner-Sandra-Helen-David-Nicolas Leonardo 0 7 -Owner-Chris-Jane-Bob-Nick-Robert-Leonardo Luis 0 8 -Owner-Chris-Jane-Bob-Nick-Robert-Leonardo-Luis James 1 2 -Owner-James Joy 1 9 -Owner-Chris-Jane-Bob-Nick-Robert-Leonardo-Luis-Joy 20 rows selected.
11
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[ROWID 예제]
SQL> SELECT rowid, a.* FROM product a; ROWID PROD_ID PROD_NAME PROD_GROUP PROD_COST ---------------------------- ------------ ---------------- ------------------- --------------- AAAAMWAACAAAAFqAAA 0100 AnyLink EAI 8000 AAAAMWAACAAAAFqAAB 0200 BizMaster EAI 12000 …… 15 rows selected.
[ROWNUM 예제]
SQL> SELECT rownum, prod_id, prod_name, prod_cost FROM product;
ROWNUM PROD_ID PROD_NAME PROD_COST
--------------- -------- -------------------- ---------------
1 0100 AnyLink 8000
2 0200 BizMaster 12000
3 0300 JEUS 2900
……
15 rows selected.
[ LEVEL 예제]
SQL> SELECT lpad(' ', 3*LEVEL)||emp_name "NAME", emp_no,manager
FROM employee
START WITH emp_name = 'Owner'
CONNECT BY PRIOR emp_no = manager;
NAME EMP_NO MANAGER
------------------------------ ----------------- ------------
Owner 19953472
Chris 19963077 19953472
Jane 19980185 19963077
Bob 19982915 19980185
Nick 19994601 19982915
Robert 20003969 19994601
Leonardo 20034532 20003969
Luis 20055195 20034532
Joy 20064224 20055195
Bill 19963998 19953472
Paul 19972002 19963998
Fernando 19976229 19972002
John 19992589 19976229
Karen 20027015 19992589
Mickey 20028795 20027015
Sandra 19982201 19953472
Helen 20005012 19982201
David 20018786 20005012
Nicolas 20032813 20018786
James 20063428 19953472
20 rows selected
12
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
2.5. 주석
• SQL문장과 스키마 객체에 대한 주석을 작성할 수 있다.
• HINT를 제외한 주석은 SQL문장의 실행에 영향을 주지 않는다.
• 주석시작 /*, 주석 끝 */으로 표기하고, 따로 공백이나 줄바꿈으로 내용과 구분할 필요는
없다.
• ‟--„로 해당 줄이 주석으로 지정된다.
[주석 사용예제]
SQL> SELECT /* 컬럼을 조회한다.*/
prod_id, prod_name, prod_cost
/* 테이블 */
FROM product ;
PROD_ID PROD_NAME PROD_COST
----------- -------------------- ---------------
0100 AnyLink 8000
0200 BizMaster 12000
0300 JEUS 2900
0400 OpenFrame 7000
0500 ProERP 20000
0600 ProCRM 7000
0700 ProFrame 6200
0800 ProPortal 8600
0900 ProSync 2500
1000 ProWeb 2000
1100 SysKeeper 1500
1200 SysMaster 1400
1300 Tibero 1500
1400 Tmax 3800
1500 WebtoB 500
15 rows selected.
SQL>
13
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
2.6. 데이터베이스 객체
• TABLE : 데이터를 저장하기 위한 가장 기본적인 저장 단위이다.
이 테이블은 행과 열로 구성된 2차원 행렬의 형태를 갖는다.
• INDEX : 테이블과 별도의 저장공갂을 이용하여 그 테이블의 특정 컬럼에 대하여
빠른 검색을 가능하게 하는 데이터 구조이다.
• VIEW : SQL 질의 문장에 대하여 이름을 붙인 것으로, 빈번히 수행되는 질의의 결과를
테이블 형태로 이용할 수 있도록 정의한다
• SEQUENCE : 티베로 데이터베이스에서 유일한 연속적인 값을 생성해 내는 객체이다.
• SYNONYM : 특정 객체에 대하여 정의하는 ALIAS 와 같다.
이 외에 Function, Trigger 등의 다양한 데이터베이스 객체에 대한 부분은 Tibero 4 SQL 레퍼
런스 메뉴얼을 참조하기 바란다.
[객체 사용 예]
-- 테이블 생성 예
SQL> create table test
2 ( deptno number(2),
3 dname varchar2(14),
4 loc varchar2(13),
5 create_date date default sysdate );
Table 'TEST' created.
SQL> describe test;
TABLE 'TEST'
------------------------------------------------------------------------------
COLUMN_NAME TYPE CONSTRAINT
------------------------------------ ---------------- ------------------------
DEPTNO NUMBER(2)
DNAME VARCHAR(14)
LOC VARCHAR(13)
CREATE_DATE DATE
INDEX_NAME TYPE
------------------------------- -------------------------
COLUMN_NAME
---------------------------
SQL>
-- SubQuery 이용 테이블 생성
SQL> create table copy_emp
2 as select * from employee;
Table 'COPY_EMP' created.
14
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
-- SubQuery 이용 테이블 생성(구조맊 복제 할 경우)
SQL> create table copy_emp1
2 as select * from employee where 1=2;
Table 'COPY_EMP1' created.
-- 인덱스 생성 예제
SQL> create index test_deptno_idx on test(deptno);
Index 'TEST_DEPTNO_IDX' created.
SQL>
-- 뷰생성 예제
SQL> create view employee2002
2 as select * from employee
3 where emp_no like '2002%';
View 'EMPLOYEE2002' created.
SQL> select * from employee2002;
EMP_NO EMP_NAME HIREDATE SALARY BONUS DEPT_CD MANAGER
-------- -------------------- -------------------- ---------- ---------- ------- --------
20027015 Karen 2002/07/01 5100 1000 2000 19992589
20028795 Mickey 2002/09/01 4700 2000 2000 20027015
2 rows selected.
SQL>
--SYNONYM 사용 예제
SQL> Create public synonym pub_emp for tibero.employee;
Synonym 'PUB_EMP' created.
SQL> conn tibero1/tmax
Connected to Tibero.
SQL> select * from pub_emp;
EMP_NO EMP_NAME HIREDATE SALARY BONUS DEPT_CD MANAGER
-------- -------------------- -------------------- ---------- ---------- ------- --------
20063428 James 2006/01/25 9800 2400 0000 19953472
19953472 Owner 1995/12/19 10000 1500 1000
….
…..
20064224 Joy 2006/04/25 6100 3000 20055195
20081120 Lolly 2008/06/20 3000 1000 20032813
21 rows selected.
SQL> ls
NAME SUBNAME OBJECT_TYPE
------------------------------------ -------------------- --------------------
0 row selected.
15
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
3. SQL 연산자
SQL 연산자를 예제와 함께 살펴보도록 한다.
3.1. SQL 연산자 종류
연산자 종 류 설 명
산술연산자
+ 설명
- 뺄셈
* 곱셈
/ 나누기
문자열연산자 || 문자열 하나로 연결
집합연산자
UNION 각 결과의 합(중복허용 안 함) (합집합)
UNION ALL
각 결과의 합(중복허용)
INTERSECT 각 결과의 중복되는 부분맊 출력 (교집합)
MINUS 첫 번째 결과에서 두 번째 결과를 뺌 (차집합)
비교연산자
***단일 행 연산자 (결과값이 1개일 경우)
= 같을 때
!= 같지 않을 때
< 왼쪽 값이 오른쪽 값보다 작을 때
> 왼쪽 값이 오른쪽 값보다 클 때
<= 왼쪽 값이 오른쪽 값보다 같거나 작을 때
>= 왼쪽 값이 오른쪽 값보다 같거나 클 때
<> 같지 않을 때
***복수 행 연산자 (결과값이 2개 이상일 경우)
BETWEEN 왼쪽의 값이 오른쪽의 두 값 사이에 졲재하는지 비교
IN 결과값과 일치하는 값이 있는지 비교
ALL Return된 목록의 각각의 값과 비교
ANY Return된 목록의 모든 값과 비교
EXISTS 결과값으로 적어도 1개의 행이 있는지 비교
집합연산자
AND 양 쪽 다 맊족
OR 둘 중에 하나 맊족
NOT 맊족하지 않는 것
기타연산자 LIKE LIKE 다음 비교할 조건에 문자 또는 날짜 등의 패턴을 비교
IS NULL 해당 컬럼의 값이 널인지 아닌지 맊을 비교
16
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
3.2. SQL 연산자 예제
[산술연산자 예제]
-- PRODUCT테이블에서 제품번호, 제품이름, 제품가격, 10% 인상한 제품 가격을 출력하여라.
SQL> SELECT prod_id, prod_name, prod_cost, prod_cost + (prod_cost *0.01) as cost
FROM product ;
PROD_ID PROD_NAME PROD_COST COST
----------- -------------------- -------------- ----------
0100 AnyLink 8000 8080
0200 BizMaster 12000 12120
0300 JEUS 2900 2929
0400 OpenFrame 7000 7070
0500 ProERP 20000 20200
0600 ProCRM 7000 7070
0700 ProFrame 6200 6262
0800 ProPortal 8600 8686
0900 ProSync 2500 2525
1000 ProWeb 2000 2020
1100 SysKeeper 1500 1515
1200 SysMaster 1400 1414
1300 Tibero 1500 1515
1400 Tmax 3800 3838
1500 WebtoB 500 505
15 rows selected.
[문자열연산자 예제]
--RDBMS와 Tibero문자를 연결하여 “RDBMS Tibero”를 출력하여라
SQL> SELECT 'RDBMS '||'Tibero 4'
FROM dual;
'RDBMS'||'TIBERO'
-----------------
RDBMS Tibero 4
1 row selected.
17
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[집합연산자 예제]
--집합 연산자를 사용할 예제 테이블 설명
SQL> SELECT * FROM department;
DEPT_CD DEPT_NAME PDEPT_CD
---------- -------------------- ------------
0000 TmaxSoft
1000 R&D Center 0000
2000 Engineer 0000
3000 Sales 0000
4000 Consultant 0000
5 rows selected.
SQL> SELECT * FROM employee;
EMP_NO EMP_NAME HIREDATE SALARY BONUS DEPT_CD MANAGER
------------ -------------- -------------- ------------- ------------- ------------- -------------
20063428 James 2006/01/25 9800 2400 0000 19953472
19953472 Owner 1995/12/19 10000 1500 1000
19982201 Sandra 1998/07/07 2800 2000 1000 19953472
20005012 Helen 2000/12/08 1000 1000 19982201
20018786 David 2001/03/01 7100 100 1000 20005012
20032813 Nicolas 2003/08/04 7200 1100 1000 20018786
19963998 Bill 1996/11/05 1300 2000 19953472
19972002 Paul 1997/04/11 4200 2000 19963998
19976229 Fernando 1997/05/13 4300 2000 19972002
19992589 John 1999/06/20 2700 400 2000 19976229
20027015 Karen 2002/07/01 5100 1000 2000 19992589
20028795 Mickey 2002/09/01 4700 2000 2000 20027015
19963077 Chris 1996/03/09 1400 1500 3000 19953472
19980185 Jane 1998/05/03 4900 3000 19963077
19982915 Bob 1998/12/29 6900 3000 19980185
19994601 Nick 1999/10/17 3400 3000 19982915
20003969 Robert 2000/05/12 7600 3000 19994601
20034532 Leonardo 2003/09/14 5600 3000 20003969
20055195 Luis 2005/04/01 3200 1500 3000 20034532
20064224 Joy 2006/04/25 6100 3000 20055195
20 rows selected.
--UNION 연산자
SQL> SELECT dept_cd
FROM department
UNION
SELECT dept_cd
FROM employee;
DEPT_CD
-----------
0000
1000
2000
18
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
3000
4000
5 rows selected.
--UNION ALL연산자
SQL> SELECT dept_cd
FROM department
UNION ALL
SELECT dept_cd
FROM employee;
DEPT_CD
-------
0000
1000
…중갂생략…
DEPT_CD
-------
3000
……
25 rows selected.
--INTERSECT 연산자
SQL> SELECT dept_cd
FROM department
INTERSECT
SELECT dept_cd
FROM employee;
DEPT_CD
-------
0000
1000
2000
3000
4 rows selected.
--MINUS 연산자
SQL> SELECT dept_cd
FROM department
MINUS
SELECT dept_cd
FROM employee;
DEPT_CD
-------
4000
1 row selected.
19
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[비교연산자 예제]
-- PRODUCT테이블에서 제품번호가 ‟0130‟인 제품정보를 모두 출력하여라.
SQL> select *
2 from product
3 where prod_id='1300';
PROD_ID PROD_NAME PROD_GROUP PROD_COST
------- -------------------- ---------- ----------
1300 Tibero DBMS 1500
1 row selected.
--EMPLOYEE테이블에서 부서별로 최소 급여를 받는 사원의 사원번호, 이름, 입사일자, 급여, 부서번호
를 출력하여라
SQL> SELECT emp_no, emp_name, hiredate, salary, dept_cd
FROM employee
WHERE salary IN (SELECT MIN(salary)
FROM employee
GROUP BY dept_cd);
EMP_NO EMP_NAME HIREDATE SALARY DEPT_CD
------------ ------------- --------------- ---------- ----------
19963998 Bill 1996/11/05 1300 2000
19963077 Chris 1996/03/09 1400 3000
20005012 Helen 2000/12/08 1000 1000
20063428 James 2006/01/25 9800 0000
4 rows selected.
[논리연산자 예제]
-- PRODUCT테이블에서 제품번호가 ‟0100‟이상이고 제품명이 „Tibero‟인 제품정보를 모두 출력하여라.
SQL> SELECT *
FROM product
WHERE prod_id > '0100'
AND prod_name = 'Tibero';
PROD_ID PROD_NAME PROD_GROUP PROD_COST
----------- -------------------- ----------------- --------------
1300 Tibero DBMS 1500
4 rows selected.
20
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[기타연산자 예제]
--PRODUCT 테이블에서 제품명이 „P‟로 시작하는 제품정보를 모두 출력하여라.
SQL> SELECT *
FROM product
WHERE prod_name LIKE 'P%';
PROD_ID PROD_NAME PROD_GROUP PROD_COST
---------- -------------------- ------------------ --------------
0500 ProERP BA 20000
0600 ProCRM BA 7000
0700 ProFrame FRAME 6200
0800 ProPortal UI 8600
0900 ProSync DBMS 2500
1000 ProWeb UI 2000
6 rows selected.
--EMPLOYEE테이블에서 bonus 가 NULL 인 사원의 모든 정보를 출력하여라.
SQL> SELECT *
FROM employee
WHERE bonus IS NULL;
EMP_NO EMP_NAME HIREDATE SALARY BONUS DEPT_CD MANAGER
------------ ------------ ------------- ------------- ------------- ------------ -----------
20005012 Helen 2000/12/08 1000 1000 19982201
19963998 Bill 1996/11/05 1300 2000 19953472
19972002 Paul 1997/04/11 4200 2000 19963998
19976229 Fernando 1997/05/13 4300 2000 19972002
19980185 Jane 1998/05/03 4900 3000 19963077
19982915 Bob 1998/12/29 6900 3000 19980185
19994601 Nick 1999/10/17 3400 3000 19982915
20003969 Robert 2000/05/12 7600 3000 19994601
20034532 Leonardo 2003/09/14 5600 3000 20003969
20064224 Joy 2006/04/25 6100 3000 20055195
10 rows selected.
21
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
4. SQL 함수
제공되는 함수는 주어짂 인수를 처리하여 결과값을 반홖하는 기능을 수행하여, SELECT문을
갂결하게 맊들어 Data 조작을 쉽고 갂결하게 맊든다.
함수의 종류는 다음과 같다.
1) 단일행 함수 : 행별로 함수가 적용되어 하나의 결과를 RETURN하는 함수
(문자함수, 숫자함수, 날짜함수, 변홖함수, 기타함수)
2) 다중행 함수 : 여러행 또는 테이블 젂체에 대해 함수가 적용되어 하나의 결과를 RETURN
하는 함수(Group함수)
***4장에서 언급된 함수 외에도 Tibero 4에서는 다양한 함수를 지원하고 있으며, 이에 대한
내용은 Tibero 4 SQL 메뉴얼을 참조하도록 한다.
22
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
4.1. 단일행함수 종류
Tibero에서 제공하는 단일행 함수는 다음과 같다.
종 류 명 령 어 설 명
문자 함수
LOWER/UPPER 문자를 모두 소문자로 변경 / 대문자로 변경
INITCAP 첫번째 글자맊 대문자로 변경
CONCAT 두 문자열을 결합한 값을 반홖
INSTR 문자 내의 특정 스트링의 위치를 구함
LENGTH 문자열의 길이를 구함
REPLACE 특정 문자열을 대싞
LPAD/RPAD 왼쪽/오른쪽 문자 자리 채움
SUBSTR 문자열 중 특정 문자 또는 문자열의 일부분을 선택
TRIM 왼쪽 또는 오른쪽 문자를 자름
숫자 함수
ABS(n) 젃대값
CEIL(n) 주어짂 값보다 크지맊 가장 근접하는 최소값을 구하는 함수
MOD(m,n) m을 n으로 나누어 남는 값을 구하는 함수임
ROUND(n,[m]) n값의 반올림을 하는 함수로 m은 소수점 아래 자릿수를
표기함.
TRUNC(n,[m]) n값을 버림하는 함수로 m은 소수점 아래 자릿수를 표기함.
POWER 거듭제곱
SQRT 제곱근
SIGN 양수, 음수, 0인지를 구분
CHR ASCII값에 해당하는 문자를 구함
날짜 함수
MONTHS_BETWEEN 두 날짜 사이의 월수를 계산
ADD_MONTHS 날짜에 월을 더함.
NEXT_DAY 명시된 날짜로부터 다음 요일에 대한 날짜
LAST_DAY 월의 마지막날을 계산
ROUND 날짜를 반올림
TRUNC 날짜를 젃삭
변홖 함수
TO_CHAR 주어짂 date type, number type의 값을 형식에 따라 문자열로
변홖
TO_DATE 주어짂 string type값을 format에 따라 date type값으로
변홖
TO_NUMBER 주어짂 string type값을 숫자형식으로 변홖
TO_TIME 주어짂 string을 형식에 따라 시갂 값으로 변홖
TO_TIMESTAMP 주어짂 string을 형식에 따라 timestamp 타입 값으로 변홖
기타 함수
NVL NULL값을 어떤 특정한 값(실제 값)으로 변홖하는데 사용
NVL2 값이 NULL인 경우와 NULL이 아닌 경우 리턴해 주는 값을 다르게
해주는 함수
NULLIF 두 개의 값을 비교하여 값이 값으면 NULL을 리턴하고 서로 다른
값을 가지면 첫번째 값을 리턴하는 함수
COALESCE 나열된 값을 순차적으로 체크하여 NULL이 아닌 값을 리턴하는 함수
DECODE CASE나 IF-THEN-ELSE-END IF문장의 조건적 조회를 하는 함수
CASE DECODE함수와 동일하나 DECODE에서 지원하지 않는 비교연산자를
사용할 수 있는 함수
23
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
4.2. 단일행 함수 예제
각 함수의 사용법을 예제를 통해 알아본다.
[문자함수 예제]
- LOWER 함수 SQL> SELECT LOWER('TIBERO') FROM dual; LOWER('TIBERO') --------------- tibero 1 row selected. -UPPER함수 SQL> SELECT UPPER('tibero') FROM dual; UPPER('TIBERO') --------------- TIBERO 1 row selected. -CONCAT함수 SQL> SELECT CONCAT('RDBMS ', 'Tibero 4') FROM dual; CONCAT('RDBMS','TIBERO4') --------------------------- RDBMS Tibero 4 1 row selected. -INSTR함수 SQL> SELECT INSTR('World best! Tibero','e') FROM dual; INSTR('WORLDBEST!TIBERO','E') ----------------------------- 8 1 row selected. -LENGTH함수 SQL> SELECT LENGTH('Tibero') FROM dual; LENGTH('TIBERO') ---------------- 6 1 row selected. -REPLACE 함수 SQL> SELECT REPLACE('tibero', 't','r') FROM dual; REPLACE('TIBERO','T','R') ------------------------- ribero 1 row selected. -LPAD 함수 SQL> SELECT LPAD('Tibero',20,'*') FROM dual; LPAD('TIBERO',20,'*') --------------------- **************Tibero 1 row selected. SQL>
24
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[숫자함수 예제]
--ABS합수 SQL> SELECT ABS(-100) FROM dual; ABS(-100) ---------- 100 --CEIL합수 SQL> SELECT CEIL(11.1) FROM dual; CEIL(11.1) ---------- 12 --MOD합수 SQL> SELECT MOD(10,4) FROM dual; MOD(10,4) ---------- 2 --ROUND합수 SQL> SELECT ROUND(11.985, 2) FROM dual; ROUND(11.985,2) --------------- 11.99 --TRUNC합수 SQL> SELECT TRUNC(11.985, 1) FROM dual; TRUNC(11.985,1) --------------- 11.9 --POWER합수 SQL> SELECT POWER(4,2) FROM dual; POWER(4,2) ---------- 16 --SQRT합수 SQL> SELECT SQRT(8) FROM dual; SQRT(8) ---------- 2.82842712 --SIGN합수 (음수이면 -1, 양수이면 1, 0이면 0을 리턴함) SQL> SELECT SIGN(-19) FROM dual; SIGN(-19) ---------- -1 --CHR 합수 SQL> SELECT CHR(65) FROM dual; CHR(65) ------- A
25
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[날짜함수 예제]
--MONTHS_BETWEEN합수
--EMPLOYEE테이블에서 사원번호가 '19963077'인 사원의 현재까지의 근무월수를 계산하여 출력하여라. SQL> SELECT emp_name, hiredate, sysdate, MONTHS_BETWEEN(sysdate, hiredate) m_between
FROM employee WHERE emp_no='19963077';
EMP_NAME HIREDATE SYSDATE M_BETWEEN -------------------- ------------- -------------- --------------- Chris 1996/03/09 2008/06/24 147.493638
1 row selected.
--ADD_MONTHS합수 --EMPLOYEE테이블에서 '19963077'인 사원의 입사일자로 부터 10개월이 지난 후 날짜를 계산하여라.
SQL> SELECT emp_name, hiredate, ADD_MONTHS(hiredate,10) a_month FROM employee WHERE emp_no='19963077';
EMP_NAME HIREDATE A_MONTH -------------------- --------------- --------------
Chris 1996/03/09 1997/01/09 1 row selected.
--NEXT_DAY합수 --오늘 날짜에서 돌아오는 금요일을 계산하여 출력하여라.
SQL> SELECT sysdate, NEXT_DAY(sysdate, 'FRIDAY') n_friday FROM dual;
SYSDATE N_FRIDAY ------------- ------------
2008/06/24 2008/06/27 1 row selected.
--LAST _DAY합수 --이번달의 마지막 날짜를 계산하여 출력하여라
SQL> SELECT LAST_DAY(sysdate) FROM dual;
LAST_DAY(SYSDATE) ----------------- 2008/06/30
-- ROUND합수
SQL> SELECT hiredate, ROUND(hiredate,'MONTH') FROM employee WHERE EMP_NO='20063428'; HIREDATE ROUND(HIREDATE,'MONTH')
------------- -------------------------------- 2006/01/25 2006/02/01
-- TRUNC합수 SQL> SELECT hiredate, TRUNC(hiredate,'MONTH') FROM employee WHERE EMP_NO='19963077';
HIREDATE TRUNC(HIREDATE,'MONTH') ------------- ------------------------------
1996/03/09 1996/03/01
26
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[변홖함수 예제]
-- TO_CHAR합수(날짜변홖)
SQL> SELECT TO_CHAR(sysdate) FROM dual;
TO_CHAR(SYSDATE)
--------------------------------
2008/06/24
-- TO_CHAR합수(숫자변홖)
SQL> SELECT TO_CHAR(prod_cost,'999,999')||'맊원' FROM product;
TO_CHAR(PROD_COST,'999,999')||'
-------------------------------
8,000맊원
12,000맊원
2,900맊원
7,000맊원
20,000맊원
7,000맊원
6,200맊원
8,600맊원
2,500맊원
2,000맊원
1,500맊원
1,400맊원
1,500맊원
3,800맊원
500맊원
-- TO_DATE합수
SQL> SELECT TO_DATE('25/04/2005','DD/MM/YYYY') FROM dual;
TO_DATE('25/04/2005','DD/MM/YYY
-------------------------------
2005/04/25
-- TO_NUMBER합수
SQL> SELECT TO_NUMBER('$35,000.00','$99,999.99') FROM dual;
TO_NUMBER('$35,000.00','$99,999
-------------------------------
35000
-- TO_TIME합수
SQL> SELECT TO_TIME('13:07:33','HH24:MI:SS') FROM dual;
TO_TIME('13:07:33','HH24:MI:SS'
-------------------------------
13:07:33.000000000
-- TO_TIMESTAMP합수
SQL> SELECT TO_TIMESTAMP('13:07:15','HH24:MI:SS.FF') FROM dual;
TO_TIMESTAMP('13:07:15','HH24:M
-------------------------------
2008/06/01 13:07:15.000000000
27
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[기타함수 예제]
-- NVL합수
SQL> SELECT emp_name, salary, NVL(bonus, 0)
FROM employee;
EMP_NAME SALARY NVL(BONUS,0)
-------------------- --------------- ---------------------
James 9800 2400
Owner 10000 1500
Sandra 2800 2000
Helen 1000 0
………
20 rows selected.
-- NVL2합수
SQL> SELECT emp_name, salary, bonus, NVL2(bonus, 'salary+bonus','salary') income
FROM employee;
EMP_NAME SALARY BONUS INCOME
-------------------- ---------- -------------- ---------------
James 9800 2400 salary+bonus
Owner 10000 1500 salary+bonus
Sandra 2800 2000 salary+bonus
Helen 1000 salary
………
20 rows selected.
--NULLIF 합수
SQL> SELECT emp_name, bonus, NULLIF(bonus, 1500)
FROM employee;
EMP_NAME BONUS NULLIF(BONUS,1500)
-------------------- ---------------- ---------------------------
James 2400 2400
Owner 1500
Sandra 2000 2000
Helen
………
20 rows selected.
--COALESCE 합수
--EMPLOYEE테이블에서 사원이름, 보너스 및 급여를 출력하는 데 급여가 NULL이면 보너스를 보너스가 NULL이면
급여를 출력하시오.
SQL> SELECT emp_name, salary,bonus, COALESCE(salary, bonus)
FROM employee;
EMP_NAME SALARY BONUS COALESCE(SALARY,BONUS)
-------------------- ---------------- ------------ ------------------------------
James 9800 2400 9800
Owner 10000 1500 10000
Sandra 2800 2000 2800
Helen 1000 1000
………
20 rows selected.
28
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
-- DECODE합수
--EMPLOYEE테이블에서 입사년도가 1996년에 들어온 입사자는 급여증가율 30%이고,
1999년에 들어온 입사자는 급여증가율이 10%이다. 사원번호, 이름, 급여, 증가된 급여를 출력하여라.
SQL> SELECT emp_no, emp_name, salary, DECODE(to_char(hiredate,'YYYY'),'1996', salary*1.3,
'1999', salary*1.1) d_salary
FROM employee;
EMP_NO EMP_NAME SALARY D_SALARY
------------ -------------------- ---------- --------------
20063428 James 9800
19953472 Owner 10000
19982201 Sandra 2800
20005012 Helen 1000
20018786 David 7100
20032813 Nicolas 7200
19963998 Bill 1300 1690
19972002 Paul 4200
19976229 Fernando 4300
19992589 John 2700 2970
20027015 Karen 5100
20028795 Mickey 4700
……
20 rows selected.
-- CASE합수
--EMPLOYEE테이블에서 입사일이 2000 년 이젂에 들어온 입사자는 급여증가율 30%이고,
2000년 이후에 들어온 입사자는 급여증가율이 10%이다. 사원번호, 이름, 급여, 증가된 급여를 출력하여라.
SQL> SELECT emp_no, emp_name, salary,
CASE WHEN to_number(to_char(hiredate,'YYYY')) < 2000 THEN salary*1.3
WHEN to_number(to_char(hiredate,'YYYY')) >= 2000 THEN salary*1.1
ELSE salary
END d_salary
FROM employee;
EMP_NO EMP_NAME SALARY D_SALARY
------------ -------------------- ---------------- --------------
20063428 James 9800 10780
19953472 Owner 10000 13000
19982201 Sandra 2800 3640
20005012 Helen 1000 1100
20018786 David 7100 7810
20032813 Nicolas 7200 7920
19963998 Bill 1300 1690
19972002 Paul 4200 5460
19976229 Fernando 4300 5590
19992589 John 2700 3510
20027015 Karen 5100 5610
20028795 Mickey 4700 5170
19963077 Chris 1400 1820
……
20 rows selected.
29
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
4.3. 그룹행함수 종류
Tibero에서 제공하는 그룹행 함수는 다음과 같다.
종 류 명 령 어 설 명
그룹 함수
AVG 그룹 내의 모든 로우에 대한 평균
COUNT 해당 그룹의 행의 개수를 반홖
MAX 그룹 내의 모든 로우에 대한 최대 값을 반홖
MIN 그룹 내의 모든 로우에 대한 최소 값을 반홖
STDDEV 그룹 내의 표준편차
SUM 그룹 내의 로우에 대한 합계
VARIANCE 그룹 내의 분산
ROLLUP 주어짂 그룹핑 조건에 따라 ROW들을 그룹화하고 각 그룹에
대해 부분합을 제공
CUBE Group BY 젃에 기술된 조건에 따라 모든 가능한 그룹핑 조합
에 대한 결과를 출력
분석 함수
RANK 그룹 내의 로우를 정렬한 다음 그룹 내의 각 로우에 대한 순
위를 돌려주는 함수
DENSE_RANK 그룹 내의 로우를 정렬한 다음 그룹 내의 각 로우에 대한 순
위를 돌려주는 함수
LAG 그룹 내의 로우를 정렬한 다음 현재 로우에서 offset 갯수맊
큼 앞서 있는 로우에 대한 접근을 제공
LEAD 그룹 내의 로우를 정렬한 다음 현재 로우에서 offset 갯수맊
큼 뒤에 나오는 로우에 대한 접근을 제공
RATIO_TO_REPORT 값들의 집합의 합에 대한 집합의 하나의 값의 비율을 계산
ROW_NUMBER 그룹 내의 로우를 정렬한 다음 각 로우에 유일한 번호를 부
여하여 값 비교
30
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
4.4. 그룹행 함수 예제
각 함수의 사용법을 예제를 통해 알아본다.
자세한 사용법은 Tibero 4 SQL 매뉴얼을 참고하도록 한다.
[그룹함수 예제]
-- AVG합수
SQL> SELECT dept_cd, AVG(salary)
FROM employee
GROUP BY dept_cd
ORDER BY dept_cd;
DEPT_CD AVG(SALARY)
------------ -------------
0000 9800
1000 5620
2000 3716.666667
3000 4887.5
4 rows selected.
-- COUNT합수
SQL> SELECT COUNT(*)
FROM employee;
COUNT(*)
----------
20
1 row selected.
-- MAX합수
SQL> SELECT MAX(salary)
FROM employee;
MAX(SALARY)
-----------
10000
1 row selected.
-- MIN합수
SQL> SELECT MIN(salary)
FROM employee;
MIN(SALARY)
-----------
1000
1 row selected.
31
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
--그룹함수 사용 시, 주의 점
-- select젃에 group 함수를 적용하지 않는 컬럼은 반드시 group by 정의합니다.
SQL> select dept_cd, avg(salary)
2 from employee;
TBR-8038: Expression is not in a GROUP BY clause.
at line 3, column 9:
select dept_cd, avg(salary)
^
SQL> select dept_cd, avg(salary)
2 from employee
3 group by dept_cd;
DEPT_CD AVG(SALARY)
------- -----------
2000 3716.666667
1000 5620
0000 9800
3000 4887.5
4 rows selected.
SQL>
-- STDDEV합수
SQL> SELECT STDDEV(salary)
FROM employee;
STDDEV(SALARY)
--------------
2605.919375090
1 row selected.
-- SUM합수
SQL> SELECT SUM(salary)
FROM employee;
SUM(SALARY)
----------------
99300
1 row selected.
-- VARIANCE합수
SQL> SELECT VARIANCE(salary)
FROM employee;
VARIANCE(SALARY)
----------------
6790815.78947368
1 row selected.
32
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
-- ROLLUP합수
SQL> SELECT dept_cd, sum(salary)
FROM employee
WHERE dept_cd in ('1000', '2000')
GROUP BY ROLLUP (dept_cd);
DEPT_CD SUM(SALARY)
----------- -----------
1000 28100
2000 22300
50400
3 rows selected.
-- CUBE합수
SQL> SELECT
DECODE(GROUPING(dept_cd),1,'ALL',dept_cd) AS dept_cd,
SUM(salary) AS SAL
FROM employee
GROUP BY CUBE(dept_cd)
ORDER BY dept_cd;
DEPT_CD SAL
----------- ------------
0000 9800
1000 28100
2000 22300
3000 39100
ALL 99300
5 rows selected.
33
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[분석함수 예제]
-- DENSE_RANK 합수
--dept_cd별로 salary에 따라 정렬한 다음 그룹 내의 각 로우에 대한 순위를 출력하여라.
SQL> SELECT emp_no, dept_cd, salary, DENSE_RANK()
OVER (PARTITION BY dept_cd ORDER BY salary)
FROM employee;
EMP_NO DEPT_CD SALARY DENSE_RANK()OVER(PARTITIONBYDEP
------------ ---------- -------------- ----------------------------------------------
20063428 0000 9800 1
20005012 1000 1000 1
19982201 1000 2800 2
20018786 1000 7100 3
20032813 1000 7200 4
19953472 1000 10000 5
19963998 2000 1300 1
19992589 2000 2700 2
19972002 2000 4200 3
19976229 2000 4300 4
20028795 2000 4700 5
20027015 2000 5100 6
19963077 3000 1400 1
20055195 3000 3200 2
19994601 3000 3400 3
19980185 3000 4900 4
20034532 3000 5600 5
20064224 3000 6100 6
19982915 3000 6900 7
20003969 3000 7600 8
20 rows selected.
-- LAG 합수
--dept_no별로 salary에 따라 정렬한 다음 현재 로우에서 offset 갯수만큼 앞서 있는 로우에 대한 값을
출력하여라.
SQL> SELECT emp_no, dept_cd, salary, LAG (salary, 2, 0)
OVER (PARTITION BY dept_cd ORDER BY salary) PSAL
FROM employee;
EMP_NO DEPT_CD SALARY PSAL
------------ ---------- -------------- -------------
20063428 0000 9800 0
20005012 1000 1000 0
19982201 1000 2800 0
20018786 1000 7100 1000
20032813 1000 7200 2800
19953472 1000 10000 7100
19963998 2000 1300 0
19992589 2000 2700 0
19972002 2000 4200 1300
19976229 2000 4300 2700
20028795 2000 4700 4200
34
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
20027015 2000 5100 4300
19963077 3000 1400 0
20055195 3000 3200 0
19994601 3000 3400 1400
19980185 3000 4900 3200
20034532 3000 5600 3400
20064224 3000 6100 4900
19982915 3000 6900 5600
20003969 3000 7600 6100
20 rows selected.
-- LEAD 합수
--dept_cd별로 salary에 따라 정렬한 다음 현재 로우에서 offset 갯수만큼 뒤에 나오는 로우에 대한 값을
출력하여라.
SQL> SELECT emp_no, dept_cd, salary, LEAD (salary, 2, 0)
OVER (PARTITION BY dept_cd ORDER BY salary) PSAL
FROM employee;
EMP_NO DEPT_CD SALARY PSAL
------------ ----------- -------------- ------------
20063428 0000 9800 0
20005012 1000 1000 7100
19982201 1000 2800 7200
20018786 1000 7100 10000
20032813 1000 7200 0
19953472 1000 10000 0
19963998 2000 1300 4200
19992589 2000 2700 4300
19972002 2000 4200 4700
19976229 2000 4300 5100
20028795 2000 4700 0
20027015 2000 5100 0
19963077 3000 1400 3400
20055195 3000 3200 4900
19994601 3000 3400 5600
19980185 3000 4900 6100
20034532 3000 5600 6900
20064224 3000 6100 7600
19982915 3000 6900 0
20003969 3000 7600 0
20 rows selected.
35
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
-- RATIO_TO_REPORT 합수
--전체 인원 중 부서별(dept_cd) 인원 대한 비율을 계산하여라.
SQL> SELECT dept_cd, count(*), RATIO_TO_REPORT(count(*)) OVER () RATIO
FROM employee
GROUP BY dept_cd;
DEPT_CD COUNT(*) RATIO
----------- -------------- --------------
2000 6 .3
3000 8 .4
1000 5 .25
0000 1 .05
4 rows selected.
--ROW_NUMBER 합수
--dept_cd별로 salary에 따라 정렬한 다음 각 로우에 유일한 번호를 부여하여 그 값이(RN) 1보다 작거나 같은
로우를 출력하여라.
SQL> SELECT dept_cd, emp_name, salary
FROM(
SELECT dept_cd, emp_name, salary,
ROW_NUMBER() OVER (PARTITION BY dept_cd ORDER BY salary) RN FROM employee )
WHERE RN <= 1;
DEPT_CD EMP_NAME SALARY
----------- -------------------- ----------
0000 James 9800
1000 Helen 1000
2000 Bill 1300
3000 Chris 1400
4 rows selected.
36
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
5. JOIN
5장에서는 기본 JOIN 유형과 ANSI표준을 따르는 JOIN 유형에 대해 예제와 함께 살펴보도
록 한다.
5.1. JOIN 유형
종 류 설 명
기본 JOIN 유형
CARTESIAN PRODUCT 모든 가능한 행들의 JOIN(양쪽 ROW의 개수를 곱한 개수)
EQUI JOIN (=) JOIN조건이 정확히 일치하는 경우에 사용
NON-EQUI JOIN (Between) 테이블의 한 컬럼의 값이 다른 테이블의 컬럼과 컬럼 값의 범위에 해당될 때
사용
OUTER JOIN (+) EQUE JOIN에 사용된 조건에 맊족하지 않는 데이터를 포함시키고자 할 때
사용. 조인시킬 값이 없는 테이블 쪽에 (+)를 위치시킴.
SELF JOIN 하나의 테이블에서 행들을 JOIN하고자 할 경우에 사용. 테이블 Alias가 꼭
필요함.
ANSI표준을 따르는 JOIN 유형 기본 JOIN유형과 문법상의 차이가 있을 뿐 성능상의 이점은 없다.
CROSS JOIN JOIN시 잘못된 조건을 주었을 경우 데이터 매치가 일어나지 않아 모든 행에
JOIN이 일어나는 것. (=CARTESIAN PRODUCT)
NATURAL JOIN 두 테이블에서 똑같은 이름을 가지는 모든 컬럼을 기준으로 JOIN
(=EQUI JOIN)
JOIN ~ USING JOIN시 EQUE JOIN이 일어날 컬럼을 지정한다
JOIN ~ ON 조인조건을 임의로 명시하거나 조인에 참여할 컬럼을 명시하고자 할 때 사용.
LEFT|RIGHT [OUTER JOIN] INNER JOIN에서 출력되지 않은 결과들을 출력(=OUTER JOIN)
37
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
5.2. JOIN 예제
[기본 JOIN 예제]
--CARTESIAN PRODUCT
SQL> SELECT emp_no, emp_name, d.dept_cd, dept_name
FROM employee, department d
order by emp_no;
EMP_NO EMP_NAME DEPT_CD DEPT_NAME
------------ -------------------- ------------- --------------------
……
20064224 Joy 2000 Engineer
20064224 Joy 3000 Sales
20064224 Joy 4000 Consultant
100 rows selected.
--EQUI JOIN
SQL> SELECT emp_no, emp_name, d.dept_cd, dept_name
FROM employee e,department d
WHERE e.dept_cd=d.dept_cd
order by emp_no;
EMP_NO EMP_NAME DEPT_CD DEPT_NAME
------------ -------------------- -------------- --------------------
19953472 Owner 1000 R&D Center
19963077 Chris 3000 Sales
19963998 Bill 2000 Engineer
……
20 rows selected.
--NON-EQUI JOIN
--부서번호 3000번인 사원의 사원번호, 이름, 급여, 등급, 하한값, 상한값을 출력하여라.
SQL> SELECT e.emp_no, e.emp_name, e.salary, sg.sal_grade, sg.low_salary, sg.high_salary
FROM employee e, salary_grade sg
WHERE e.salary BETWEEN sg.low_salary AND sg.high_salary AND e.dept_cd=3000;
EMP_NO EMP_NAME SALARY SAL_GRADE LOW_SALARY HIGH_SALARY
------------ -------------------- ---------- -------------- ---------------- ------------------
19963077 Chris 1400 4 1000 2000
19980185 Jane 4900 2 4001 6000
19982915 Bob 6900 1 6001 8000
……
8 rows selected.
38
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
--OUTER JOIN
SQL> SELECT emp_no, emp_name, d.dept_cd, dept_name
FROM employee e,department d
WHERE e.dept_cd(+)=d.dept_cd
order by emp_no;
EMP_NO EMP_NAME DEPT_CD DEPT_NAME
------------ -------------------- ------------ --------------------
……
20055195 Luis 3000 Sales
20063428 James 0000 TmaxSoft
20064224 Joy 3000 Sales
4000 Consultant
--SELF JOIN
--SELF JOIN하여 관리자를 출력하여라.
SQL> SELECT e.emp_name "Employee",m.emp_name "Manager"
FROM employee e, employee m
WHERE e.manager=m.emp_no;
Employee Manager
-------------------- --------------------
James Owner
Sandra Owner
Bill Owner
……
19 rows selected.
39
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[ANSI 표준을 따르는 JOIN 예제]
--CROSS JOIN
SQL> SELECT emp_no, emp_name, d.dept_cd, dept_name
FROM employee
CROSS JOIN department d;
EMP_NO EMP_NAME DEPT_CD DEPT_NAME
------------ -------------------- ------------ --------------------
……
20064224 Joy 2000 Engineer
20064224 Joy 3000 Sales
20064224 Joy 4000 Consultant
100 rows selected.
--NATURAL JOIN (단, 참조되어지는 컬럼에 table명이나 alias를 사용하면 안 된다.)
SQL> SELECT emp_no, emp_name, dept_name
FROM employee
NATURAL JOIN department;
EMP_NO EMP_NAME DEPT_NAME
------------ -------------------- --------------------
20063428 James TmaxSoft
19953472 Owner R&D Center
19982201 Sandra R&D Center
……
20 rows selected.
--JOIN ~ USING (단, 참조되어지는 컬럼에 table명이나 alias를 사용하면 안 된다.)
SQL> SELECT e.emp_no, e.emp_name, d.dept_name
FROM employee e JOIN department d
USING (dept_cd);
EMP_NO EMP_NAME DEPT_NAME
------------ -------------------- --------------------
20063428 James TmaxSoft
19953472 Owner R&D Center
19982201 Sandra R&D Center ……
20 rows selected.
--JOIN ~ ON
SQL> SELECT e.emp_name "Employee", m.emp_name "Manager"
FROM employee e JOIN employee m
ON (e.manager=m.emp_no);
Employee Manager
-------------------- --------------------
James Owner
Sandra Owner
Bill Owner
……
40
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
19 rows selected.
-- LEFT|RIGHT OUTER JOIN
SQL> SELECT e.emp_no, e.emp_name, d.dept_cd, d.dept_name
FROM department d
LEFT OUTER JOIN employee e
ON(e.dept_cd=d.dept_cd);
EMP_NO EMP_NAME DEPT_CD DEPT_NAME
----------- -------------------- ------------ --------------------
…..
20055195 Luis 3000 Sales
20064224 Joy 3000 Sales
4000 Consultant
21 rows selected.
41
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
6. SUBQUERY
6장에서는 SUBQUERY의 유형과 예제를 통해 SUBQUERY에 대한 이해를 돕고자 한다.
6.1. SUBQUERY 유형
종 류 설 명
단일행 SUBQUERY
SELECT 문장으로부터 오직 하나의 행맊을 검색하는 질의
(단일행 비교 연산자: =, >, >=, <, <=, <>, !=)
다중행 SUBQUERY
SELECT 문장으로부터 하나 이상의 행을 검색하는 질의
(복수행 비교 연산자: IN, NOT IN, ANY, ALL, EXISTS)
다중열 SUBQUERY
(pairwise SUBQUERY) SELECT 문장으로부터 하나 이상의 열을 검색하는 질의
From절에서의 SUBQUERY
(INLINE VIEW)
From젃에 기술한 subquery
Scalar SUBQUERY
하나의 Coulmn값맊을 리턴하는 subquery
한 개의 column값보다 맋은 값이 리턴될 경우 error를 리턴함.
Correlated SUBQUERY
MIAN-QUERY젃에 사용된 테이블이 SUBQUERY젃에 다시 재사용되는 경우의
SUBQUERY
(SUBQUERY의 결과가 한 행씩 MAIN으로 리턴되는 방식으로 처리되므로
내부적으로 성능을 저하시킴. 따라서 잘 사용하지 않음.)
42
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
6.2. SUBQUERY 예제
[단일행 SUBQUERY 예제]
--EMPLOYEE테이블에서 부서코드 1000번 부서에서 평균 salary보다 높은 해당부서 사원의 사원번호, 사원이름,
salary, 부서코드를 출력하여라.
SQL> SELECT emp_no, emp_name, salary, dept_cd
FROM employee
WHERE salary > (SELECT AVG(salary)
FROM employee
WHERE dept_cd='1000') AND dept_cd='1000';
EMP_NO EMP_NAME SALARY DEPT_CD
----------- -------------------- ---------- ----------
19953472 Owner 10000 1000
20018786 David 7100 1000
20032813 Nicolas 7200 1000
3 rows selected.
[다중행 SUBQUERY 예제]
--EMPLOYEE테이블에서 부서별 가장 맋은 급여를 받는 사원의 사원번호, 사원이름, salary, 부서코드를 출력하여라.
SQL> SELECT emp_no, emp_name, salary, dept_cd
FROM employee
WHERE salary IN (SELECT MAX(salary)
FROM employee
GROUP BY dept_cd);
EMP_NO EMP_NAME SALARY DEPT_CD
------------ -------------------- ----------- -------------
20027015 Karen 5100 2000
20003969 Robert 7600 3000
19953472 Owner 10000 1000
20063428 James 9800 0000
4 rows selected.
--EMPLOYEE테이블에서 2000번 부서의 최소급여를 받는 사원보다 맋은 급여를 받는 사원의 사원번호, 이름, 입사
일자, 급여, 부서코드를 출력하여라. 단, 2000번 부서는 제외한다.
SQL> SELECT emp_no, emp_name, hiredate, salary, dept_cd
FROM employee e
WHERE dept_cd!='2000' AND salary > ANY (SELECT MIN(salary)
FROM employee
WHERE dept_cd='2000');
또는,
SQL> SELECT emp_no, emp_name, hiredate, salary, dept_cd
FROM employee e
WHERE dept_cd!='2000' AND salary > ANY (SELECT salary
FROM employee
WHERE dept_cd='2000');
EMP_NO EMP_NAME HIREDATE SALARY DEPT_CD
43
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
------------ -------------------- ---------------- ------------- ----------
20064224 Joy 2006/04/25 6100 3000
20055195 Luis 2005/04/01 3200 3000
20034532 Leonardo 2003/09/14 5600 3000
……
13 rows selected.
--EMPLOYEE테이블에서 2000번 부서의 최고급여를 받는 사원보다 맋은 급여를 받는 사원의 사원번호, 이름, 입사
일자, 급여, 부서코드를 출력하여라. 단, 2000번 부서는 제외한다.
SQL> SELECT emp_no, emp_name, hiredate, salary, dept_cd
FROM employee e
WHERE dept_cd!='2000' AND salary > ALL (SELECT MAX(salary)
FROM employee
WHERE dept_cd='2000');
또는,
SQL> SELECT emp_no, emp_name, hiredate, salary, dept_cd
FROM employee e
WHERE dept_cd!='2000' AND salary > ALL (SELECT salary
FROM employee
WHERE dept_cd='2000');
EMP_NO EMP_NAME HIREDATE SALARY DEPT_CD
------------ -------------------- ---------------- ------------- ----------
20064224 Joy 2006/04/25 6100 3000
20034532 Leonardo 2003/09/14 5600 3000
20003969 Robert 2000/05/12 7600 3000
19982915 Bob 1998/12/29 6900 3000
20032813 Nicolas 2003/08/04 7200 1000
20018786 David 2001/03/01 7100 1000
19953472 Owner 1995/12/19 10000 1000
20063428 James 2006/01/25 9800 0000
8 rows selected.
--EMPLOYEE테이블에서 적어도 한 명의 사원으로부터 보고를 받을 수 있는 사원의 사원번호, 이름, 입사일자, 부서
코드를 출력하여라. 단, 사원번호순으로 정렬하여라
SQL> SELECT emp_no, emp_name, hiredate, dept_cd
FROM employee e
WHERE EXISTS (SELECT *
FROM employee
WHERE e.emp_no=manager)
ORDER BY emp_no;
EMP_NO EMP_NAME HIREDATE DEPT_CD
------------ -------------------- ------------------ -------------
19953472 Owner 1995/12/19 1000
19963077 Chris 1996/03/09 3000
19963998 Bill 1996/11/05 2000
19972002 Paul 1997/04/11 2000
19976229 Fernando 1997/05/13 2000
19980185 Jane 1998/05/03 3000
44
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
19982201 Sandra 1998/07/07 1000
19982915 Bob 1998/12/29 3000
19992589 John 1999/06/20 2000
19994601 Nick 1999/10/17 3000
20003969 Robert 2000/05/12 3000
20005012 Helen 2000/12/08 1000
20018786 David 2001/03/01 1000
20027015 Karen 2002/07/01 2000
20034532 Leonardo 2003/09/14 3000
20055195 Luis 2005/04/01 3000
16 rows selected.
[다중열 SUBQUERY 예제(=(=PAIRWISE SUBQUERY)]
--EMPLOYEE테이블에서 부서별로 최소급여를 받는 사원의 정보를 사원번호, 이름, 급여, 부서코드를 출력하여라.
단, 부서코드별로 정렬한다.
SQL> SELECT emp_no, emp_name, salary, dept_cd
FROM employee e
WHERE (dept_cd, salary) IN (SELECT dept_cd, MIN(salary)
FROM employee
GROUP BY dept_cd)
ORDER BY dept_cd;
EMP_NO EMP_NAME SALARY DEPT_CD
------------ -------------------- ----------- -----------
20063428 James 9800 0000
20005012 Helen 1000 1000
19963998 Bill 1300 2000
19963077 Chris 1400 3000
4 rows selected.
[FROM젃의 SUBQUERY 예제(=INLINE VIEW)]
--EMPLOYEE테이블과 DEPARTMENT테이블에서 업무가 Sales인 사원의 이름, 부서명을 출력하여라.
SQL> SELECT e.emp_name, d.dept_name
FROM (SELECT dept_cd, dept_name
FROM department
WHERE dept_name='Sales') d, employee e
WHERE d.dept_cd=e.dept_cd; EMP_NAME DEPT_NAME
-------------------- --------------------
Chris Sales
Jane Sales
Bob Sales
Nick Sales
Robert Sales
Leonardo Sales
Luis Sales
Joy Sales
8 rows selected.
45
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
[Scalar SUBQUERY 예제]
--Scalar SUBQUERY를 이용하여 부서이름에 따라 사원번호와 이름을 정렬하시오.
SQL> SELECT emp_no, emp_name
FROM employee e
ORDER BY (SELECT dept_name
FROM department d
WHERE e.dept_cd=d.dept_cd); EMP_NO EMP_NAME
------------ --------------------
19963998 Bill
19972002 Paul
19976229 Fernando
19992589 John
20027015 Karen
20028795 Mickey
19953472 Owner
19982201 Sandra
……
20 rows selected.
[Correlated SUBQUERY 예제]
--각 부서의 평균급여보다 맋이 받는 사원정보를 출력하여라.
SQL> SELECT emp_name, salary, dept_cd
FROM employee e
WHERE salary > (SELECT avg(salary)
FROM employee
WHERE dept_cd=e.dept_cd); EMP_NAME SALARY DEPT_CD
-------------------- ---------- ------------
Owner 10000 1000
David 7100 1000
Nicolas 7200 1000
Jane 4900 3000
Bob 6900 3000
Robert 7600 3000
Leonardo 5600 3000
Joy 6100 3000
Paul 4200 2000
Fernando 4300 2000
Karen 5100 2000
Mickey 4700 2000
12 rows selected.
46
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
7. DML
DML(Data Manipulation Language)명령은 데이터를 입력, 수정, 삭제하는 SQL명령어이다.
7.1. DML 유형
DML의 유형과 각 구문 문법 다음과 같다
종 류 설 명
INSERT 테이블에 새로운 행 추가
UPDATE 테이블의 행 내용을 변경
DELETE 테이블의 행 삭제
[INSERT 구문 Syntax]
INSERT INTO table_name [(column1[.cloumn2, . . .])]
VALUES (value1[,value2, . . .]);
[UPDATE 구문 Syntax]
UPDATE table_name
SET column1=value1 [, column2= value2, . . . ]
[WHERE condition];
[DELETE 구문 Syntax]
DELETE [FROM] table_name
[WHERE condition];
47
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
7.2. DML 예제
[INSERT 예제]
--모든 column에 대해 값을 갖는 새로운 행을 삽입.
SQL> DESC employee
TABLE INFO
COLUMN_NAME TYPE CONSTRAINT
------------------------------ ------------------ --------------------------------
EMP_NO VARCHAR(8) NOT NULL
PRIMARY KEY
EMP_NAME VARCHAR(20)
HIREDATE DATE
SALARY NUMBER(8,3)
BONUS NUMBER(8,3)
DEPT_CD VARCHAR(4)
MANAGER VARCHAR(8)
INDEX INFO
INDEX_NAME TYPE COLUMN_NAME
------------------------------ ----------------- ------------------------------
EMPLOYEE_PK NORMAL EMP_NO
SQL> INSERT INTO employee
VALUES ('20081120','Lolly' ,TO_DATE('2008-06-20', 'YYYY-MM-DD'),3000,'','1000','20032813');
1 row inserted.
--특정 column에맊 값을 넣어 새로운 행을 삽입. (이 경우라도. NOT NULL제약조건이 있는 열은 반드시 포함되어야
합)
SQL> INSERT INTO employee (emp_no, emp_name, hiredate, dept_cd)
VALUES ('20083311','Angel' ,TO_DATE('2008-07-13', 'YYYY-MM-DD'), '0000');
1 row inserted.
--치홖변수(&, &&)를 사용하여 값을 추가하는 방법
SQL> INSERT INTO department (dept_cd, dept_name)
VALUES (&department_id, &department_name);
Input value for department_id: 5000
Input value for department_name: 'Marketing'
1 row inserted.
--기졲의 테이블로부터 값을 가져와 테이블에 추가(VALUES 젃에 Subquery를 사용하여 행을 삽입)
SQL> CREATE TABLE employee_0000(emp_no, emp_name, hiredate)
AS SELECT emp_no, emp_name, hiredate
FROM employee
WHERE 1=2;
Table created.
48
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
SQL> INSERT INTO employee_0000
SELECT emp_no, emp_name, hiredate
FROM employee
WHERE dept_cd=0000;
2 rows inserted.
[UPDATE 예제]
--Insert예제에서 삽입한 행 emp_no가 „20083311‟인 사원의 부서코드를 0000에서 1000으로 변경해보자.
SQL> UPDATE employee
SET dept_cd = '1000'
WHERE emp_no='20083311';
1 row updated.
--Merge를 이용한 Row 삽입 및 갱싞. 즉, Merge하고자 하는 Source테이블의 row를 읽어 target테이블에
match되는 행이 있을 경우 새로운 값으로 UPDATE를 수행하고,없을 경우 새로운 행으로 INSERT를 수행.
--사원번호가 „20081120‟인 사원의 보너스 금액이 졲재하면 update, 없으면 insert
SQL> MERGE INTO employee d
USING(SELECT emp_name,salary,dept_cd
FROM employee
WHERE emp_no='20081120') s
ON(d.emp_name=s.emp_name)
WHEN MATCHED THEN
UPDATE SET d.bonus= d.bonus+s.salary*0.1
WHEN NOT MATCHED THEN
INSERT (d.emp_name,d.bonus) VALUES(s.emp_name,s.salary*0.1);
***Merge문장 : 여러 Data Source로부터 다양한 Data를 수집해서 작업을 수행하는 Data Warehousing
작업에 적합함.
[DELETE 예제]
--Insert예제에서 삽입한 행 emp_no가 „20083311‟인 사원과 „20081120‟사원의 정보를 삭제하여라.
SQL> DELETE employee
WHERE emp_no='20083311' OR emp_no='20081120';
2 rows deleted.
49
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
8. TRANSATION
Tibero는 TRANSACTION이라고 하는 논리적인 작업 단위를 나누어 데이터의 일관성을 보장
한다.
8.1. TRANSACTION
TRANSACTION은 첫 번째 DML문을 실행하였을 때 시작된다.
• 트랜잭션 정상 종료 : COMMIT/ROLLBACK의 명령어를 사용 했을 때, DDL이나 DCL 문장 사용 했을때
• 트랜잭션 비정상 종료 : 사용자에 의한 tbSQL의 비정상 종료 또는 시스템의 비정상적인 종료. ROLLBACK처리
Transaction 제어 명령어의 종류는 다음과 같다.
종 류 설 명
COMMIT 데이터 변경 내용을 영구히 저장하고 현재 트랜잭션을 종료.
SAVEPOINT 트랜잭션 내에 저장 위치를 표시
ROLLBACK 데이터 변경 내용을 버리고 트랜잭션을 종료.
ROLLBACK TO SAVEPOINT_NAME 현재 트랜잭션을 지정된 (SAVEPOINT_NAME) 저장 위치로
돌아가, 그 이젂의 데이터 변경내용을 버리고 트랜잭션을 종료
50
Tibero RDBMS 4 SQL Test
© 2011 Tibero Co., Ltd. All Rights Reserved.
8.2. TRANSACTION 예제
[TRANSACTION 예제]
SQL> SELECT * FROM product;
PROD_ID PROD_NAME PROD_GROUP PROD_COST
----------- -------------------- ----------------- --------------
0100 AnyLink EAI 8000
0200 BizMaster EAI 12000
0300 JEUS MW 2900
0400 OpenFrame FRAME 7000
0500 ProERP BA 20000
0600 ProCRM BA 7000
0700 ProFrame FRAME 6200
0800 ProPortal UI 8600
0900 ProSync DBMS 2500
1000 ProWeb UI 2000
1100 SysKeeper ETC 1500
1200 SysMaster ETC 1400
1300 Tibero DBMS 1500
1400 Tmax MW 3800
1500 WebtoB MW 500
15 rows selected.
SQL> UPDATE product SET prod_cost =2000 WHERE prod_name = 'Tibero'; 트랜잭션 시작
1 row updated.
SQL> SAVEPOINT SV1; 트랜잭션 저장 SV1
savepoint created.
SQL> INSERT INTO product (prod_id) VALUES ('1600');
1 row inserted.
SQL> SAVEPOINT SV2; 트랜잭션 저장 SV2
savepoint created.
SQL> INSERT INTO product (prod_id) VALUES ('1700');
1 row inserted.
SQL> rollback to SV2; SV2 이후 작업 무시
rollback succeeded.
SQL> rollback to SV1; SV1 이후 작업 무시
SQL> rollback to SV2;
TBR-21008: Savepoint 'SV2' was not found. ROLLBACK/COMMIT 이 되면 SAVEPOINT 는 삭제된다
Information Intelligence, Tibero
Click to sub Title