DB2 SQL

168
© 2009 IBM Corporation DB2 SQL Baek, Jong Hwan – DB2 SQL 27 March 2011

description

Baek, Jong Hwan – DB2 SQL 27 March 2011. DB2 SQL. IBM Presentation Template Full Version. Agenda. SQL 및 SELECT 문의 구조 SELECT 구문 작성 Single-Row 함수 Multi-Row 함수 집합 연산자 조인 서브쿼리 Data Definition Language Data Manipulation Language 계층구조. SQL 및 SELECT 문의 구조. 1. DDL 과 DML 이란 ? - PowerPoint PPT Presentation

Transcript of DB2 SQL

Page 1: DB2 SQL

© 2009 IBM Corporation

DB2 SQL

Baek, Jong Hwan – DB2 SQL

27 March 2011

Page 2: DB2 SQL

© 2009 IBM Corporation2

Agenda

- SQL 및 SELECT 문의 구조

- SELECT 구문 작성

- Single-Row 함수

- Multi-Row 함수

- 집합 연산자

- 조인

- 서브쿼리

- Data Definition Language

- Data Manipulation Language

- 계층구조

IBM Presentation Template Full Version

Page 3: DB2 SQL

© 2009 IBM Corporation3

SQL 및 SELECT 문의 구조

1. DDL 과 DML 이란 ?

2. SELECT 문 구조

3. SELECT 문에 대한 연산 순서

4. BASIC SELECT 문

5. WHERE 절

6. GROUP BY 절

7. HAVING 절

8. ORDER BY 절

Page 4: DB2 SQL

© 2009 IBM Corporation4

1. DDL 과 DML 이란 ?

DDL 은 Data Definition Language 의 약자로 , Database 의 Schema 를 생성 , 변경 , 삭제하는 Database 정의 언어입니다 . DDL 은 Table 생성에 필요한 제약조건의 생성 , 변경 및 삭제 그리고 속성의 정의 등 다양한 Schema 세부 내용을 정의를 할 수 있습니다 . 생성할 문장은 CREATE, ALTER, DROP, TRUNCATE, COMMENT 등으로 시작합니다 .

DML 이란 Data Manipulation Language 의 약어로 SELECT, INSERT, DELETE 그리고 UPDATE 문장을 통틀어 칭합니다 . 자료의 조작을 위해 필요한 DML 을 항목별로 확인하면 다음과 같습니다 .

Page 5: DB2 SQL

© 2009 IBM Corporation5

2. SELECT 문 구조

Page 6: DB2 SQL

© 2009 IBM Corporation6

3. SELECT 문에 대한 연산 순서

Page 7: DB2 SQL

© 2009 IBM Corporation7

4. BASIC SELECT 문

가장 간단한 형태로 SELECT 구문은 반드시 다음을 포함해야 합니다 .

보여줄 Column 들을 구체화하는 SELECT 절

SELECT 절에 리스트 된 Column 을 포함하는 Table 들을 구체화 할 FROM 절

SQL> SELECT *

FROM employees;

Page 8: DB2 SQL

© 2009 IBM Corporation8

5. WHERE 절

Table 로 부터 추출한 전체 Data 중 필요한 Data 만 여과하는 조건절입니다 . 특정 값을 입력할 수 있으며 또는 Sub-Query 를 사용한 세부 집합을 이용할 수도 있습니다 .

SQL> SELECT empno, lastname, job, workdept

FROM employee

WHERE workdept = ‘A00’ ;

SQL> SELECT empno, lastname, job, workdept

FROM employee

WHERE workdept = (SELECT deptno

FROM department

WHERE deptname ='PLANNING' AND deptno ='B01')

Page 9: DB2 SQL

© 2009 IBM Corporation9

6. GROUP BY 절

GROUP BY 절은 해당 Row 들이 Table 에서 어떻게 그룹화되는지 보여줍니다 . GROUP

화하여 Data 를 보기 위해서는 일반적으로 GROUP 함수를 사용해야 합니다 .

GROUP 함수

하나의 테이블에 있는 row 들을 몇 개의 그룹 집단으로 분류하기 위해 GROUP BY 절을 사용하며 , GROUP 에 대한 요약 정보를 확인하기 위해서 GROUP 함수를 사용합니다 .

GROUP 함수는 SELECT list 뿐만 아니라 , ORDER BY 및 HAVING 절에도 나타날 수 있습니다 .

GROUP 함수에 대한 data type 은 CHARACTER, VARCHAR, SMALLINT, DECIMAL,

INTEGER, NUMBER 그리고 DATE 등에서 사용할 수 있습니다 .

Page 10: DB2 SQL

© 2009 IBM Corporation10

7. HAVING 절

HAVING 절은 GROUP 함수를 통해 그룹화 된 집단들의 조건을 제어합니다 . 예를 들면 ,

부서별 봉급이 50000 이상인 경우에 해당하는 부서별 사원번호를 추출해야 할 경우에 각 부서별로 그룹화 후 해당 부서별 봉급이 50000 이상인 행 (row) 를 가져오는 것입니다 .

SQL> SELECT firstnme, workdept, AVG(salary)

FROM employee

GROUP BY workdept

HAVING AVG(salary) > 50000

Page 11: DB2 SQL

© 2009 IBM Corporation11

8. ORDER BY 절

쿼리 결과에서 추출된 행 (row) 의 순서가 아직 정의되지 안을 경우 , ORDER BY 절을 이용해서 행 (row) 을 정렬하는데 사용할 수 있습니다 . 만약 ORDER BY 절이 사용되지 않는다면 정렬 순서가 정해지지 않게 됩니다 .

다수의 컬럼들을 쿼리 결과 집합으로 정렬할 수 있습니다 . 정렬작업에 있어서의 제약사항은 주어진 Table 의 컬럼수에 한정된다는 것입니다 . ORDER BY 절에서 해당 컬럼들에 대한 구분자는 ( , ) 입니다 .

오름차순 (ASC) 또는 내림차순 (DESC) 으로 정렬을 할 수 있습니다 .

SQL> SELECT lastname, salary

FROM employee

ORDER BY empno, salary DESC;

Page 12: DB2 SQL

© 2009 IBM Corporation12

SELECT 구문 작성

1. Writing SQL Statements

2. Column Alias & Table Alias

3. Display Table Structure

4. Arithmetic Expressions ( 산술 연산자 )

5. Concatenation Operator

6. Duplicate Rows

1) Eliminating Duplicate Rows (distinct 처리 )

7. Using the WHERE Clause

8. Character Strings and Dates

9. Comparison Conditions

Page 13: DB2 SQL

© 2009 IBM Corporation13

SELECT 구문 작성

10. Other Comparison Conditions

1) BETWEEN Condition

2) IN Condition

3) NOT IN 의 함정4) LIKE Condition

11. NULL VALUE 정의

12. EXISTS 술어 사용

13. GROUP BY 절

14. 그룹함수

15. GROUP BY with ROLLUP and CUBE Operators

16. ROLLUP Operator

17. CUBE Operator

1) CUBE Operator: Example

Page 14: DB2 SQL

© 2009 IBM Corporation14

SELECT 구문 작성

18. Composite Columns

1) Composite Columns: Example

19. HAVING 절1) Review of the HAVING Clause

20. ORDER BY 절 (Descending, Ascending)

1) Sorting in Descending Order

2) Sorting by Column Alias

3) Sorting by Multiple Columns

21. 논리 연산자1) AND 연산자2) OR 연산자3) NOT 연산자

Page 15: DB2 SQL

© 2009 IBM Corporation15

1. Writing SQL Statements

다음의 간단한 Rule 과 Guideline 을 사용하면 쉽게 SQL 문을 작성하고 편집할 수 있습니다 .

SQL 문들은 하나 이상의 Line 으로 구성될 수 있습니다 .

SELECT, FROM 등과 같은 구성 단어들은 두줄에 걸쳐서 사용할 수 없습니다 .

각 절들은 가독성과 편집의 편의성을 위해 Line 을 구분하여 작성합니다 .

핵심 구성 단어 (SELECT, FROM, ...) 등은 주로 대문자를 사용하여 , 나머지는

소문자를 사용하여 기입합니다 .

Page 16: DB2 SQL

© 2009 IBM Corporation16

2. Column Alias & Table Alias

컬럼명이 길거나 테이블명이 길어서 또는 다른 이유 때문에 테이블이나 컬럼에 별명 (Alias) 를 지정하기도 합니다 . 하지만 Alias 의 지정이 필수사항은 아니며 어떤 경우에 Alias 를 사용하는것이 유익한지 알아 보겠습니다 .

Table Column 명을 가상의 이름으로 바꾸고 싶을 때 사용합니다 .

Column 별 계산식이 많을 때 사용합니다 .

Alias 명의 가독성을 높이기 위해 space 를 사용할 경우 “ “을 사용합니다 .

Page 17: DB2 SQL

© 2009 IBM Corporation17

2. Column Alias & Table Alias

SQL> SELECT name, job, salary + comm as pay

FROM staff

WHERE (salary + comm) < 50000

ORDER BY pay;

SQL> SELECT empno, job

FROM employee, emp

WHERE employee.empno = emp.empno;

1 라인 근처 오류 :

SQL0203N 컬럼 “ empno" 에 대한 참조가 앰비규어스합니다 .

empno, job 컬럼이 employee, emp 두 테이블에 동일하게 있습니다 .

Page 18: DB2 SQL

© 2009 IBM Corporation18

3. Display Table Structure

조회 할 테이블의 속성을 파악 해야 할 일들이 종종 발생합니다 . 예를 들면 A Table 과 B Table

간의 데이터를 JOIN 하기 위해 해당 테이블 컬럼의 데이터 타입이 동일한지 , 삽입 데이터의 최대 크기가 몇 자리 인지 등등 많은 이유로 Table 의 속성을 확인하게 됩니다 .

Page 19: DB2 SQL

© 2009 IBM Corporation19

4. Arithmetic Expressions ( 산술 연산자 )

SELECT 문을 사용하다 보면 연산할 일이 많이 발생합니다 . 예를 들면 , 기본급에 보너스를

포함한 금액을 보고 싶을 경우 , 다음과 같이 ‘ salary + comm’ 으로 표현합니다 . 또한 현재일

기준으로 근무 일수를 구할 경우에도 사용할 수 있습니다 . 즉 , 산술 연산자는 decimal type

뿐만 아니라 , date type 등 여러 목적으로 사용 가능 합니다 .

산술 연산자는 FROM 절을 제외한 모든 절에 사용 가능 합니다 .

SQL> SELECT salary, salary + 300, salary + comm FROM employee;

Page 20: DB2 SQL

© 2009 IBM Corporation20

5. Concatenation Operator

Concatenation Operator 는 컬럼 또는 문자열을 다른 컬럼과 연관시켜 하나의 컬럼으로 보이게

합니다 . 주로 ‘컬럼명 || 컬럼명’ 형태로 사용하게 됩니다 .

SQL> SELECT firstnme||' '||midinit||' '||lastname as full_name

FROM employee

FETCH FIRST 5 ROWS ONLY"

위의 예제는 컬럼 firstnme, midinit, lastname 등을 연관지어 하나의 컬럼으로 보이게 만들었으며 , 이 세 컬럼을 full_name 라는 Alias 를 주어

조회하고 있습니다 . full_name Alias 의 사용은 SELECT 절의 가독성을 훨씬 높이는 효과가 있습니다 .

Page 21: DB2 SQL

© 2009 IBM Corporation21

6. Duplicate Rows

관련된 Table 의 정보를 조회할 때 몇 천건의 중복된 Data 가 한 번에 조회될 때 , 중복되지 않은 유일한 Data 값만 보기를 원할 경우가 있습니다 . 이럴 경우 사용합니다 .

1) Eliminating Duplicate Rows (distinct 처리 )

SQL> SELECT bonus FROM employee WHERE bonus = 400;

SQL> SELECT distinct bonus FROM employee WHERE bonus = 400;

Page 22: DB2 SQL

© 2009 IBM Corporation22

7. Using the WHERE Clause

WHERE 절은 Table 에 있는 Data 에 일정 조건을 추가함으로써 조건에 부합하는 Data 만 검색 합니다 . 예를 들어 설명하면 , employee Table 의 전체 Data 42 건 중 WHERE bonus =

400 조건에 부하는 7 의 Data 만 검색합니다 .

SQL> SELECT count(*)

FROM employee;

SQL> SELECT count(*)

FROM employee

WHERE bonus = 400;

Page 23: DB2 SQL

© 2009 IBM Corporation23

8. Character Strings and Dates

WHERE 절에는 숫자 상수를 제외한 문자열 및 Date 데이터를 검색하기 위해 작은 따옴표로 감싸야 합니다 . 또한 검색어의 모든 문자열은 대 , 소문자가 구분됩니다 . 예를 들어 해당 Table 의 Data 는 ‘ FIELDREP’ 인데 , WHERE 조건절에서 ‘ fieldrep’ 로 조회한다면 Data 를 전혀 검색할 수 없습니다 .

SQL> SELECT job FROM employee1 WHERE job = 'fieldrep';

SQL> SELECT job FROM employee1 WHERE job = 'FIELDREP';

Page 24: DB2 SQL

© 2009 IBM Corporation24

8. Character Strings and Dates

날짜와 관련한 데이터를 조회할 때는 해당 데이터의 Date Format 을 명확히 알아야 합니다 . 아래의 구문과 같이 잘못된 Format 인 ‘일 - 월 - 연’ 으로 검색을 하면 ‘날짜 시간 값의 문자열 표현 구문이 올바르지 않습니다 .’ 라는 오류 메시지를 받게 됩니다 .

SQL> SELECT empno, birthdate FROM employee WHERE birthdate = '28-03-1976'1 라인 근처 오류 :SQL0180N 날짜 시간 값의 문자열 표현 구문이 올바르지 않습니다 .

SQL> SELECT empno, birthdate FROM employee WHERE birthdate = '1976-03-28';

Page 25: DB2 SQL

© 2009 IBM Corporation25

9. Comparison Conditions

WHERE 절에서 주로 사용하는 비교 연산자 입니다 .

SQL> SELECT FIRSTNME||MIDINIT||LASTNAME as Full_name FROM employee WHERE birthday = '1963-08-24' => birthday 가 1963년 8 월 24 일생 직원을 검색합니다 .

WHERE salary >= 152750 => salary 가 152,750 이상에 해당하는 직원을 검색합니다 .

WHERE lastname <> 'HAAS' => lastname 이 ‘ HASS’ 가 아닌 직원을 검색합니다 .

Page 26: DB2 SQL

© 2009 IBM Corporation26

10. Other Comparison Conditions

1) BETWEEN Condition

첫번째 조건과 두번째 조건 사이에 존재하는 모든 값을 검색합니다 . 예를 들면 , 생일이 1976년 3 월 28 일에서 2002년 3 월 28 일인 직원을 모두 조회할 경우 “ between ‘1976-03-28’ and ‘2002-03-28’” 으로 검색할 수 있습니다 .

SQL> SELECT empno, birthdate

FROM employee

WHERE birthdate between '1976-03-28' and '2002-03-28';

Page 27: DB2 SQL

© 2009 IBM Corporation27

10. Other Comparison Conditions

2) IN Condition

IN 조건은 어떤 Data Type 에서도 사용 할 수 있으며 , 범위 검색이 아니라 지정한 값에 대한 검색입니다 . 그리고 문자열 검색 또는 날짜 검색일 경우 '' 으로 검색 데이터를 감싸야 합니다 .

SQL> SELECT empno, firstnme, midinit, lastname FROM employee WHERE firstnme in ('DANIEL','MAUDE','REBA')

SQL> SELECT empno, firstnme, midinit, lastname FROM employee WHERE firstnme = 'DANIEL' OR firstnme = 'MAUDE' OR firstnme = 'REBA'

Page 28: DB2 SQL

© 2009 IBM Corporation28

3) NOT IN 의 함정

NOT IN 연산자는 IN 연산자의 반대 개념으로 알고 있습니다 . 그럼 다음의 예제를 보겠습니다 .

SQL> SELECT firstnme, midinit, lastname FROM employee WHERE midinit is null;

SQL> SELECT firstnme, midinit, lastname FROM employee WHERE midinit = 'S';

SQL> SELECT firstnme, midinit, lastname FROM employee1 WHERE midinit in ( NULL,'S');

10. Other Comparison Conditions

SQL 문 을 보 시 면 Null 검 색 을

하지만 , 검색에 해당하는 Data 를

가 져 오 지 못 하 고 있 습 니 다 . 그

이유는 NULL 은 항상 IS NULL 또는

IS NOT NULL 로 비교되어야 하기

때문입니다 . 즉 midinit = NULL

이란 조건은 항상 false 를 return

합니다 .

NOT IN 연산자에 NULL 이 포함되면

어떠한 경우 일지라도 한 건도 Data

를 검색하지 못합니다 . 왜 그럴까에

대한 답은 아래의 SQL 문을 풀어보면

쉽게 알 수 있습니다 .

Page 29: DB2 SQL

© 2009 IBM Corporation29

10. Other Comparison Conditions

3) LIKE Condition

LIKE 검색은 와일드카드 조회를 할 경우 많이 사용합니다 . 검색 조건에는 문자열 또는 숫자들에 사용할 수 있습니다 . 조건절에서 ‘ _’ 를 사용할 경우 한글자에 대한 와일드카드이고 , 해당 검색 다음에 ‘ %’ 는 검색어 다음의 와일드카드 입니다 .

SQL> SELECT firstnme, midinit, lastname FROM employee WHERE firstnme like 'D_____';

SQL> SELECT firstnme, midinit, lastname FROM employee WHERE firstnme like 'D%';

Page 30: DB2 SQL

© 2009 IBM Corporation30

11. NULL VALUE 정의

Null 값은 사용할 수 없는 값 , 할당이 안 된 값 , 미지의 값을 의미합니다 . Null 값에 대해서 이해하는 것이 무척 애매할 수 있어 예를 들어 설명하겠습니다 . ‘A’ 회사에 신입사원이 입사를 하여 연수를 받고 있다면 , 분명 사번은 할당 받을 것입니다 . 하지만 연수원 신분이므로 아직 담당부서를 배정 받지는 못했을 것입니다 . 이럴 경우 그 신입사원의 직원 Table 에 있는 담당 부서의 값은 Null 값으로 남겨두고 , 향후 부서를 배정받을 경우 정보를 갱신하게 됩니다 .

Null 값에 대한 조회는 is Null 또는 is not Null 로 합니다 .

SQL> SELECT firstnme, midinit, lastname

FROM employee

WHERE midinit is null

SQL> SELECT firstnme, midinit, lastname

FROM employee

WHERE midinit is not null;

Page 31: DB2 SQL

© 2009 IBM Corporation31

12. EXISTS 술어 사용

Main Query 가 Sub Query 의 결과 값의 존재 유무에 대한 체크만 할 경우 사용합니다 . EXISTS 술어는 부속 조회의 응답 집합에 하나 이상의 행을 포함하면 참이 되고 , 행을 포함하지 않으면 거짓이 됩니다 . EXISTS 술어의 경우 조회 데이터에 대한 참 , 거짓만 구별하고 데이터를 보여 주는 것이 아니므로 일반적으로 수행속도에 유리합니다 .

SQL> UPDATE employee SET deptno = '' WHERE deptno = 'E21';

SQL> commit;

SQL> SELECT empno, firstnme, midinit, lastname, workdept FROM employee X WHERE NOT EXISTS ( SELECT 1 FROM dept WHERE X.workdept = workdept ) ORDER BY empno;

Page 32: DB2 SQL

© 2009 IBM Corporation32

13. GROUP BY 절

GROUP BY 절은 검색할 데이터에 대한 그룹화 작업을 위해 필요한 절입니다 . 대부분의 경우

GROUP 함수와 함께 사용을 합니다 .

SQL> SELECT workdept, AVG(salary + bonus) as total

FROM employee

GROUP BY workdept;

Page 33: DB2 SQL

© 2009 IBM Corporation33

14. 그룹 함수

그룹함수는 전체 데이터를 특정 기준에 따라 Grouping 을 해야 할 때 사용하는 함수입니다 . 일반 함수와는 다르게 그룹 집합에 대한 주어진 결과값을 다룹니다 .

다음은 부서별 연봉의 평균을 조회한 내용입니다 .

SQL> SELECT workdept, AVG(salary + bonus) as total

FROM employee

GROUP BY workdept;

Page 34: DB2 SQL

© 2009 IBM Corporation34

15. GROUP BY with ROLLUP and CUBE Operators

ROLLUP 과 CUBE 를 활용하게 되면 많은 소계항목과 합계를 단순하게 작성할 수 있습니다 .

먼저 첫번째 예제인 ROLLUP 을 활용한 데이터 검색을 보면 , DEPTNO, JOB 별로 연봉의 합계 그리고 각 부서 직원의 연봉합계 , 전 직원의 연봉합계를 한번에 확인할 수 있습니다 .

SQL> SELECT workdept, job, sum(salary+bonus) total_sal

FROM employee

GROUP BY ROLLUP(workdept, job)

ORDER BY workdept, total_sal, job

SQL> SELECT workdept, job, sum(salary+bonus) total_sal

FROM employee

WHERE workdept is not null

GROUP BY CUBE(workdept, job)

ORDER BY workdept, jobROLLUP 과 다르게 각 부서와 상관없이 JOB 별 합계를 보여주고 있는 점입니다 .

Page 35: DB2 SQL

© 2009 IBM Corporation35

16. ROLLUP Operator

ROLLUP 연산자는 통계와 요약정보를 작성하는데 사용되는데 , 주로 GROUP BY 절과 함께 사용하여 소계와 합계를 동시에 보여줍니다 . ROLLUP 연산자는 소계 작성에 필요한 컬럼들이 많을 경우 특히 유용합니다 .

SQL> SELECT workdept, job, sum(salary)

FROM employee

WHERE workdept is not null

GROUP BY ROLLUP(workdept, job)

ORDER BY workdept, job;

Page 36: DB2 SQL

© 2009 IBM Corporation36

17. CUBE Operator

CUBE 연산자는 모든 합계 함수 즉 , AVG, SUM, MAX, MIN 그리고 COUNT 등에 사용할 수 있습니다 . ROLLUP 연산자가 가능한 소계 조합을 작성하는데 반해 , CUBE 연산자는 cross-tabular 보고서를 작성하기 위해서 사용하는 결과 집합을 생성하는데 사용됩니다 . 또한 GROUP BY 절에서 구체적으로 그룹지을 수 있는 가능한 모든 소계 집합를 작성합니다 .

SQL> SELECT workdept, job, sum(salary)

FROM employee

WHERE workdept is not null

GROUP BY CUBE(workdept, job)

ORDER BY workdept, job

Page 37: DB2 SQL

© 2009 IBM Corporation37

19. HAVING 절

HAVING 절은 GROUP BY 에 의해서 그룹화 된 데이터들을 그룹별로 제약하기 위해 사용합니다 . 다음의 예는 부서별 연봉이 제일 작은 직원을 조회하고 그 직원들 중 연봉이 $50000 이하인 직원만 조회합니다 . 이 경우 부서별로 그룹핑을 하여 제일 작은 연봉을 받는 사람을 검색한 후 그 연봉이 $50000 인 직원을 조회합니다 .

SQL> SELECT workdept, min(salary + bonus) as total_sal

FROM employee

GROUP BY workdept

HAVING min(salary + bonus ) <= 50000;

HAVING 절은 다음의 절차로 조회가 진행됩니다 .

조회할 Data 를 그룹핑합니다 .

그룹핑 후 그룹함수를 적용합니다 .

HAVING 절의 제약조건에 맞는 Data 들을 보여 줍니다 .

Page 38: DB2 SQL

© 2009 IBM Corporation38

20. ORDER BY 절 (Descending, Ascending)

ORDER BY 절을 이용하여 조회된 데이터들에 대한 오름차순 또는 내림차순 정렬을 할 수 있습니다 . ORDER BY 절의 형식은 ‘ ORDER BY column1 [desc/asc]’ 입니다 .

1) 내림차순 / 오름차순 정렬

기본적으로 ORDER BY 컬럼명이 나올 경우 기본값으로 ASC 가 반영됩니다 . 그렇지 않고 내림차순 정렬을 필요로 할 경우 DESC 구문을 사용합니다 .

SQL> SELECT empno, firstnme, midinit, lastname, workdept, job FROM employee WHERE workdept = 'A00' AND job not in ('CLERK') ORDER BY empno;

SQL> SELECT empno, firstnme, midinit, lastname, workdept, job FROM employee WHERE workdept = 'A00' AND job not in ('CLERK') ORDER BY empno desc;

Page 39: DB2 SQL

© 2009 IBM Corporation39

20. ORDER BY 절 (Descending, Ascending)

2) 컬럼 별칭으로 정렬

컬럼에 대한 별칭을 사용하여 정렬을 할 수 있습니다 .

SQL> SELECT empno||firstnme||midinit||lastname as FullName, workdept, job FROM employee WHERE workdept = 'A00' AND job not in ('CLERK') ORDER BY FullName;

Page 40: DB2 SQL

© 2009 IBM Corporation40

20. ORDER BY 절 (Descending, Ascending)

3) 다중 컬럼 정렬» 다중 컬럼 정렬

다중 컬럼에 대한 오름차순 / 내림차순 정렬을 개별적으로 수행할 수 있습니다 .

SQL> SELECT empno, birthdate, workdept FROM employee ORDER BY empno, birthdate desc, workdept;

Page 41: DB2 SQL

© 2009 IBM Corporation41

21. 논리 연산자

논리 연산자는 두 개의 결과 집합에 대하여 참 , 거짓을 나타내는 연산자 입니다 . 예를 들면 , A

조건을 만족하고 B 조건을 만족하지 않을 경우 , AND 조건은 ‘거짓’ OR 조건은 ‘참’이 됩니다 .

Page 42: DB2 SQL

© 2009 IBM Corporation42

21. 논리 연산자

1) AND 연산자

선택된 두 개의 조건 (workdept, job) 이 모두 참이어야 합니다 . 다음의 예를 보면 deptno가 ‘ A00’ 이고 job 이 ‘ CLERK’ 인 직원을 조회할 경우 , 두 조건에 모두 만족하는 직원만 조회를 합니다 .

SQL> SELECT empno, firstnme, midinit, lastname, workdept, job FROM employee WHERE workdept = 'A00' AND job = 'CLERK';

< AND 조건의 True/False/Null 에 대한 Metrics >

Page 43: DB2 SQL

© 2009 IBM Corporation43

21. 논리 연산자

2) OR 연산자

선택된 조건들 중에서 참인 것 하나만 있으면 참이 됩니다 . 즉 , 부서번호와 JOB 등 두 개의 조건 중 하나만 일치하면 참이 됩니다 .

SQL> SELECT empno, firstnme, midinit, lastname, workdept, job FROM employee WHERE workdept = 'ABS' OR job = 'CLERK';

< OR 조건의 True/False/Null 에 대한 Metrics >

Page 44: DB2 SQL

© 2009 IBM Corporation44

21. 논리 연산자

3) NOT 연산자

해당 하는 조건이 아닌 것만 참이 됩니다 . 예를 들면 , NOT MANAGER 이면 MANAGER가 아닌 직원들을 조회합니다 .

SQL> SELECT empno, firstnme, midinit, lastname, workdept, job FROM employee WHERE workdept = 'A00' AND job not in ('CLERK');

< NOT 조건의 True/False/Null 에 대한 Metrics >

Page 45: DB2 SQL

© 2009 IBM Corporation45

Single-Row 함수

1. 함수의 정의

2. 단일행 데이터 변환함수1) LOWER

2) UPPER

3) INITCAP

4) CONCAT

5) SUBSTR

6) LENGTH

7) INSTR

8) LPAD | RPAD

9) TRIM

10) REPLACE

11) ROUND

12) TRUNC

13) MOD

Page 46: DB2 SQL

© 2009 IBM Corporation46

Single-Row 함수

2. 단일행 데이터 변환함수14) SYSDATE

15) 산술연산을 사용한 날짜처리16) LAST_DAY

17) ROUND

18) TRUNC

19) VARCHAR2 또는 CHAR TYPE 을 NUMBER TYPE 으로 변환함수20) VARCHAR2 또는 CHAR TYPE 을 DATE TYPE 으로 변환함수21) NUMBER TYPE 을 VARCHAR2 TYPE 으로 변환하기 위한 함수22) NVL

23) NULLIF

24) COALESCE

25) CASE

26) DECODE

Page 47: DB2 SQL

© 2009 IBM Corporation47

1. 함수의 정의

DB2 에서 제공하는 함수들은 SQL 의 기능을 더욱 다양하게 사용할 수 있게 합니다 . 또한

데이터 타입의 변환 , 데이터 포맷의 변경 , 개별 데이터 변환 , 데이터 계산 등 활용범위가

다양합니다 . 함수의 분류는 여러가지 기준으로 할 수 있으나 , 여기서는 크게 단일 데이터

변화함수와 다중 데이터 변환함수로 분류하여 설명하겠습니다 .

Page 48: DB2 SQL

© 2009 IBM Corporation48

2. 단일행 데이터 변환함수

단일 데이터 변환함수는 주로 데이터 아이템들을 조작하기 위해 사용하는데 , 하나이상의

argument 들을 받아서 하나의 값으로 return 합니다 . 사용되는 영역은 변수 , 컬럼명 , 상수

등 입니다 .

단일 데이터 변환함수의 특징은

쿼리를 할 때 SELECT list 에 나타난 Data 개별을 변환하는데 사용됩니다 .

하나의 입력 값에 대해서 하나의 결과값을 반환합니다 .

SELECT, WHERE, ORDER BY 절에 주로 사용합니다 .

Page 49: DB2 SQL

© 2009 IBM Corporation49

2. 단일행 데이터 변환함수

1) LOWER

SQL> SELECT lower('ABCDEFG') FROM sysibm.sysdummy1; 1 --------abcdefg

Page 50: DB2 SQL

© 2009 IBM Corporation50

2. 단일행 데이터 변환함수

2) UPPER

SQL> SELECT upper('abcdefg') FROM sysibm.sysdummy1 ;

1 --------ABCDEFG

Page 51: DB2 SQL

© 2009 IBM Corporation51

2. 단일행 데이터 변환함수

3) INITCAP

SQL> SELECT initcap('abcdefg')FROM sysibm.sysdummy1

1 --------Abcdefg

Page 52: DB2 SQL

© 2009 IBM Corporation52

2. 단일행 데이터 변환함수

4) CONCAT

SQL> SELECT concat('abce','zyx') FROM sysibm.sysdummy1; 1 --------abcezyx

Page 53: DB2 SQL

© 2009 IBM Corporation53

2. 단일행 데이터 변환함수

5) SUBSTR

SQL> SELECT substr('ABCDEFGHI',4,2) FROM sysibm.sysdummy1;

1 ---DE

Page 54: DB2 SQL

© 2009 IBM Corporation54

2. 단일행 데이터 변환함수

6) LENGTH

SQL> SELECT length('ABCDEFGHI') FROM sysibm.sysdummy1;

1------------- 9

Page 55: DB2 SQL

© 2009 IBM Corporation55

2. 단일행 데이터 변환함수

7) INSTR

SQL> select instr('abcdkfdkfbc','bc',3,1) 2 from sysibm.sysdummy1;

1----------- 10

SQL> select instr('abcdkjkabc','abc',1,2) 2 from dual;

1----------- 8

Page 56: DB2 SQL

© 2009 IBM Corporation56

2. 단일행 데이터 변환함수

8) LPAD | RPAD

SQL> SELECT lpad('ABCDEFGHI',10,'$') FROM sysibm.sysdummy1;

1 ------------$ABCDEFGHI

SQL> SELECT rpad('ABCDEFGHI',10,'$') FROM sysibm.sysdummy1;

1 ------------ABCDEFGHI$

Page 57: DB2 SQL

© 2009 IBM Corporation57

2. 단일행 데이터 변환함수

9) TRIM

SQL> SELECT trim('D' FROM 'DISNEYWORLD') FROM sysibm.sysdummy1;

1 -------------ISNEYWORL

Page 58: DB2 SQL

© 2009 IBM Corporation58

2. 단일행 데이터 변환함수

10) REPLACE

SQL> SELECT replace('ABCDEFGHI','AB','ZY') FROM sysibm.sysdummy1;

1 -----------ZYCDEFGHI

Page 59: DB2 SQL

© 2009 IBM Corporation59

2. 단일행 데이터 변환함수

11) ROUND

SQL> SELECT round(123.456,2) AS 1, round(123.456,0) AS 2, round(123.456,-2) AS 3 FROM dual; 1 2 3------ ------ ------123.46 123 100

Page 60: DB2 SQL

© 2009 IBM Corporation60

2. 단일행 데이터 변환함수

12) TRUNC

SQL> SELECT trunc(123.4567,2), trunc(123.4567), trunc(123.4567,-2) FROM sysibm.sysdummy1;

1 2 3------------------ ------------------- ---------------------- 123.45 123 100

Page 61: DB2 SQL

© 2009 IBM Corporation61

2. 단일행 데이터 변환함수

13) MOD

SQL> SELECT mod(304556, 304050) FROM sysibm.sysdummy1 ;

1------------- 506

SQL> SELECT mod(12329.03439, 10000) FROM sysibm.sysdummy1;

1------------- 2329

Page 62: DB2 SQL

© 2009 IBM Corporation62

2. 단일행 데이터 변환함수

14) SYSDATE

SQL> SELECT sysdate FROM sysibm.sysdummy1 ; 1 ----------------------2011-03-16 11:18:18

Page 63: DB2 SQL

© 2009 IBM Corporation63

2. 단일행 데이터 변환함수

15) 산술연산을 사용한 날짜처리

SQL> SELECT lastname, trunc(sysdate-hiredate), sysdate+30, trunc((sysdate-hiredate)/7), trunc((sysdate-hiredate)/365) FROM employee FETCH FIRST 5 ROWS ONLY;

Page 64: DB2 SQL

© 2009 IBM Corporation64

2. 단일행 데이터 변환함수

16) LAST_DAY

SQL> SELECT last_day(sysdate) FROM sysibm.sysdummy1 ;

1 ------------------------2011-03-31 14:30:32

Page 65: DB2 SQL

© 2009 IBM Corporation65

2. 단일행 데이터 변환함수

17) ROUND

SQL> SELECT round(SYSDATE,'MONTH') FROM sysibm.sysdummy1;

1 ------------------------2011-04-01 00:00:00

Page 66: DB2 SQL

© 2009 IBM Corporation66

2. 단일행 데이터 변환함수

18) TRUNC

SQL> SELECT trunc(SYSDATE,'MONTH') FROM sysibm.sysdummy1;

1 ------------------------2011-03-01 00:00:00

Page 67: DB2 SQL

© 2009 IBM Corporation67

2. 단일행 데이터 변환함수

19) VARCHAR2 또는 CHAR TYPE 을 NUMBER TYPE 으로 변환함수

SQL> SELECT to_number(to_char(sysdate,'YYYYMMDD')) FROM sysibm.sysdummy1;

1------------------------------------- 20110317

Page 68: DB2 SQL

© 2009 IBM Corporation68

2. 단일행 데이터 변환함수

20) VARCHAR2 또는 CHAR TYPE 을 DATE TYPE 으로 변환함수

SQL> SELECT to_date('2010-04-23','YYYY-MM-DD') FROM sysibm.sysdummy1;

1 ------------------------------2010-04-23 00:00:00.000000

Page 69: DB2 SQL

© 2009 IBM Corporation69

2. 단일행 데이터 변환함수

21) NUMBER TYPE 을 VARCHAR2 TYPE 으로 변환하기 위한 함수

SQL> SELECT to_char(salary) FROM staff FETCH FIRST 5 ROWS ONLY;

1 ---------------------------------98357.5 78171.25 77506.75

SQL> SELECT to_char(sysdate,'YYYY-MM-DD') FROM dual;

1 ------------------------------------------2011-03-17

Page 70: DB2 SQL

© 2009 IBM Corporation70

2. 단일행 데이터 변환함수

22) NVL

SQL> SELECT empno, nvl(deptno, ' 부서없음 ') FROM employee FETCH FIRST 5 ROWS ONLY

EMPNO 2 ------- --------------000010 A00 ....000090 E11 000100 부서없음 000110 A00 000120 A00

10 개의 행이 검색되었습니다 .

Page 71: DB2 SQL

© 2009 IBM Corporation71

2. 단일행 데이터 변환함수

23) NULLIF

SQL> SELECT deptno, nullif(workdept, 'A00') FROM employee WHERE workdept is not null

FETCH FIRST 5 ROWS ONLY

DEPTNO 2 ------------- ----A00 B01 B01 C01 C01 E01 E01 D11 D11 D21 D21 E11 E11 A00 A00 C01 C01

Page 72: DB2 SQL

© 2009 IBM Corporation72

2. 단일행 데이터 변환함수

24) COALESCE

SQL> select deptno, midinit, coalesce(deptno, midinit, 'AAAAA') 2 from employee1;

DEPTNO 2 ------- ------A00 I A00B01 L B01 A AE01 B E01D11 F D11D21 D D21E11 W E11E21 Q E21A00 G A00A00 A00 M M AAAAA....

Page 73: DB2 SQL

© 2009 IBM Corporation73

2. 단일행 데이터 변환함수

25) CASE

SQL> SELECT lastname, job, salary, case job when 'CLERK' then salary*2 when 'MANAGER' then salary*1.5 else salary end FROM employee;

Page 74: DB2 SQL

© 2009 IBM Corporation74

2. 단일행 데이터 변환함수

26) DECODE

SQL> SELECT lastname, job, salary, case job when 'CLERK' then salary*2 when 'MANAGER' then salary*1.5 else salary end, decode(job, 'CLERK',salary*2,'MANAGER',salary*1.5,salary) FROM employee

Page 75: DB2 SQL

© 2009 IBM Corporation75

Multi-Row 함수

1. Multi-Row 함수란 ?

2. Group Functions Syntax

3. Group Functions

1) AVC Functions

2) SUM Functions

3) MIN Functions

4) MAX Functions

5) COUNT Function

6) DISTINCT Keyword

4. Group Functions and Null Values

5. Using the NVL Function with Group Functions

6. GROUP BY 절 사용

7. Having 절 사용

Page 76: DB2 SQL

© 2009 IBM Corporation76

1. Multi-Row 함수란 ?

single-row 함수와 다르게 그룹 함수는 그룹 별 한 개의 결과 값을 갖습니다 . 예를 들면 , 전체 학년 중 학급별 1 등의 점수를 보고싶을 경우 그룹 함수로 학급 집합으로 나눈다움 그 학급에 해당하는 1 등의 점수를 보여주면 됩니다 . 또 다른 예는 부서별 연봉을 가장 많이 받는 직원을 보고싶을 경우도 생각할 수 있습니다 .

SQL> SELECT B.deptno, B.empno, A.tot

FROM ( SELECT deptno, max(salary) tot

FROM employee1

WHERE deptno is not null

GROUP BY deptno ) A,

employee1 B

WHERE A.tot = B.salary

AND B.deptno = A.deptno;

Page 77: DB2 SQL

© 2009 IBM Corporation77

2. Group Functions Syntax

그룹 함수를 사용할 경우 거의 모든 경우 GROUP BY 절을 함께 사용해야 합니다 . 그럼 GROUP BY 절을 어떻게 사용하는 지 확인합니다 . WHERE 절에서 여과된 Data 에 대하여 GROUP BY 절에 나열한 컬럼별로 그룹화가 이루어 집니다 .

Page 78: DB2 SQL

© 2009 IBM Corporation78

3. Group Functions

1) AVC Functions

SQL> SELECT round(avg(salary),2), max(salary), min(salary), sum(salary) FROM employee1 WHERE job = 'MANAGER';

1 2 3 4---------------- ------------- ------------- ----------------- 88142.14 98250.00 72250.00 616995

Page 79: DB2 SQL

© 2009 IBM Corporation79

3. Group Functions

2) SUM Functions

SQL> SELECT deptno, sum(salary+bonus) as tot FROM employee1 GROUP BY deptno;

DEPTNO TOT------- ------------------------------------------------A00 358350B01 95050...E01 80975E11 320040 285420

Page 80: DB2 SQL

© 2009 IBM Corporation80

3. Group Functions

3) MIN Functions

SQL> SELECT deptno, min(salary+bonus) as tot FROM employee1 GROUP BY deptno DEPTNO TOT------- -------------------...E01 80975E11 35640 32340

Page 81: DB2 SQL

© 2009 IBM Corporation81

3. Group Functions

4) MAX Functions

SQL> SELECT deptno, max(salary+bonus) as tot FROM employee1 GROUP BY deptno

DEPTNO TOT------- ---------------------------A00 153750B01 95050...E11 90350 86650

Page 82: DB2 SQL

© 2009 IBM Corporation82

3. Group Functions

5) COUNT Function

SQL> SELECT deptno, count(empno) as tot FROM employee1 GROUP BY deptno DEPTNO TOT------- -------------A00 5...E01 1E11 7 6

Page 83: DB2 SQL

© 2009 IBM Corporation83

3. Group Functions

6) DISTINCT Keyword

SQL> SELECT count(distinct deptno)FROM employee1;1------------- 7

SQL> SELECT ‘’’’||distinct deptno||’’’’ FROM employee1;DEPTNO -------A00 B01 C01 D11 D21 E01 E11 ‘’

Page 84: DB2 SQL

© 2009 IBM Corporation84

4. Group Functions and Null Values

그룹함수는 일반적으로 null 값 제외한 데이터 만 처리합니다 . 예를들어 바로 앞 슬라이드 를 보면 distinct 로 부서를 구별했을 때 , 총 8 개의 데이터가 나옴을 확인할 수 있습니다 . 하지만 count 함수를 사용해서 확인한 내용을 보면 총 데이터 건 수가 7 개로 확인됨을 알 수 있습니다 .

SQL> SELECT count(deptno) FROM employee1; 1 ------------- 36

SQL> SELECT deptno FROM employee1;

DEPTNO ------------ A00 ... E11

42 개의 행이 검색되었습니다 .

Page 85: DB2 SQL

© 2009 IBM Corporation85

5. Using the NVL Function with Group Functions

SQL> SELECT count(deptno) FROM employee1;

1------------- 36

SQL> SELECT count(nvl(deptno,0)) FROM employee1;

1------------- 42

Page 86: DB2 SQL

© 2009 IBM Corporation86

6. GROUP BY 절 사용

특정 Table 에 있는 Data 들을 그룹화 하기 위해서는 GROUP BY 절을 사용해야 합니다 .

이럴 경우 보통 그룹함수를 사용하여 그룹별 요약값을 확인하게 됩니다 .

GROUP BY 절을 사용하기 위해선 다음 유의사항이 있습니다 .

SELECT 구문에서 그룹함수를 사용할 경우 그룹화 된 집단의 요약값만 확인할 수 있습니다 .

그룹함수와 함께 검색하기 위해 SELECT list 에 서술한 column 들은 GROUP BY

절에도 또한 서술해야 합니다 .

GROUP BY 절에서는 Column Alias 를 사용할 수 없습니다 .

GROUP BY 절은 기본적으로 오름차순 정렬을 수행하며 , 내림차순 정렬일 해야 할 경우 해당 Column 뒤에 ‘ desc’ 를 표기해야 합니다 .

GROUP BY 절에 있는 컬럼이 SELECT 절에 있을 필요는 없습니다 .

Page 87: DB2 SQL

© 2009 IBM Corporation87

6. GROUP BY 절 사용

SQL> SELECT deptno, trunc(avg(salary),2) as sal FROM employee1 GROUP BY deptno ORDER BY sal;

DEPTNO SAL-------------- ------------------------------------E11 45305.71 47086.66D21 51240D11 58783.63A00 70850C01 77222.5E01 80175B01 94250

8 개의 행이 검색되었습니다 .

Page 88: DB2 SQL

© 2009 IBM Corporation88

7. Having 절 사용

그룹함수로 그룹화 한 집단에 대한 제약 조건이 필요할 경우 HAVING 절을 사용하여 제약합니다 . 아래 내용으로 설명하면 , job 이 ‘ %NAG%’ 가 아닌 job 별로 그룹화 한 다음 job

별 salary 합계가 45000 초과하는 데이터를 보이는 것입니다 .

SQL> SELECT job, sum(salary) as pay

FROM employee1

WHERE job not like '%NAG%'

GROUP BY job

HAVING sum(salary) > 45000

ORDER BY pay;

Page 89: DB2 SQL

© 2009 IBM Corporation89

집합 연산자

1. 집합 연산잔

2. 합집합 연산자

3. UNION ALL 집합 연산자

4. 교집합 연산자

5. 차집합 연산자

6. 집합 연산자 유의사항들

Page 90: DB2 SQL

© 2009 IBM Corporation90

1. 집합 연산잔

집합 연산자는 둘 이상의 집합으로부터 추출한 결과들을 하나의 결과 집합으로 만드는데 사용됩니다 .

Page 91: DB2 SQL

© 2009 IBM Corporation91

2. 합집합 연산자

A, B 집합의 중복된 데이터를 제외한 모든 데이터를 추출하여 보여줍니다 .

사용시 유의사항

NULL 값은 중복된 데이터를 체크시 무시됩니다 . 합집합을 사용할 경우 기본적으로 오름차순

정렬입니다 . SELECT 절에서 보여줄 컬럼은 A, B 두 집합

동일하게 존재해야 합니다 . 추출할 컬럼의 수 가 동일해야 합니다 . 만약 컬럼

수가 동일하지 않을 경우 NULL 값으로 치환하여 숫자를 맞춰야 합니다 .

첫번째 쿼리에서 추출된 컬럼명을 따릅니다 .

Page 92: DB2 SQL

© 2009 IBM Corporation92

2. 합집합 연산자

SQL> SELECT empno FROM employee1 UNION SELECT id FROM staff;

EMPNO------------------ 10 20 30... 200340

45 개의 행이 검색되었습니다 .

Page 93: DB2 SQL

© 2009 IBM Corporation93

3. UNION ALL 집합 연산자

UNION ALL 연산자는 여러 쿼리문에서 추출한 데이터들을 있는 그대로 보여줍니다 .

사용시 유의사항

합집합과 다르게 , 중복된 데이터는 제거되지 않고 보여줍니다 . 또한 데이터를 있는 그대로 보여줌으로써 기본적으로 정렬작업은 수행되지 않습니다 .

distinct 값이 사용되지 않습니다 .

위의 내용을 제외한 나머지 부분은 UNION 과 UNION

ALL 모두 같습니다 .

첫번째 쿼리에서 추출된 컬럼명을 따릅니다 .

Page 94: DB2 SQL

© 2009 IBM Corporation94

3. UNION ALL 집합 연산자

SQL> SELECT empno FROM employee1 UNION ALL SELECT id FROM staff;

EMPNO ----------------------- 10 20 50 ... 200280 200310 200330 200340 77 개의 행이 검색되었습니다 .

Page 95: DB2 SQL

© 2009 IBM Corporation95

4. 교집합 연산자

교집합은 A, B 두 집합의 중 동일한 데이터만 보여줍니다 .

사용시 유의사항

추출할 컬럼의 수 가 동일해야 합니다 . 만약 컬럼

수가 동일하지 않을 경우 NULL 값으로 치환하여

숫자를 맞춰야 합니다 .

교집합은 NULL 값을 무시할 수 없습니다 .

첫번째 쿼리에서 추출된 컬럼명을 따릅니다 .

Page 96: DB2 SQL

© 2009 IBM Corporation96

4. 교집합 연산자

SQL> SELECT empno FROM employee1 INTERSECT SELECT id FROM staff; EMPNO ---------------------- 10 20 30 ... 330 340 32 개의 행이 검색되었습니다 .

Page 97: DB2 SQL

© 2009 IBM Corporation97

5. 차집합 연산자

차집합은 예를 들어 A, B 두 집합 A-B 형태로 될 경우 , A, B 교집합의 데이터를 제외한 A 집합의 데이터만 보여 줍니다 .

사용시 유의사항

추출할 컬럼의 수 가 동일해야 합니다 . 만약 컬럼 수가

동일하지 않을 경우 NULL 값으로 치환하여 숫자를

맞춰야 합니다 .

첫번째 쿼리에서 추출된 컬럼명을 따릅니다 .

Page 98: DB2 SQL

© 2009 IBM Corporation98

5. 차집합 연산자

SQL> SELECT empno FROM employee1 WHERE deptno = 'A00' MINUS SELECT id FROM staff;

EMPNO ------------------------ 200010 200120

Page 99: DB2 SQL

© 2009 IBM Corporation99

6. 집합 연산자 유의사항들

1) 컬럼 개수 일치

아래의 예제를 보면 staff Table 의 컬럼에는 salary 에 해당하는 컬럼이 없습니다 . 이럴 경우 필요한 컬럼을 NULL 값 또는 숫자일 경우 0 을 삽입함으로써 해결할 수 있습니다 .

SQL> SELECT empno, job, salary FROM employee1 UNION SELECT id, job, 0 FROM staff;

Page 100: DB2 SQL

© 2009 IBM Corporation100

6. 집합 연산자 유의사항들

2) 집합 연산자와 ORDER BY 절

집합 연산자와 ORDER BY 를 함께 사용할 경우 , 쿼리문의 마지막에 ORDER BY 절을 사용해야 합니다 . 그렇지 않고 쿼리문 중간에 사용할 경우에는 다음과 같은 Error 가 발생합니다 .

SQL> SELECT empno, job, salary FROM employee1 ORDER BY empno UNION SELECT id, job, 0 FROM staff;

1 라인 근처 오류 : SQL0104N "yee1 ORDER BY empno " 다음에 예기치 않은 토큰 "UNIONSELECT id" 이 ( 가 ) 있었습니다 . 예상한 토큰은 "<space>" 입니다 .

Page 101: DB2 SQL

© 2009 IBM Corporation101

6. 집합 연산자 유의사항들

2) 집합 연산자와 ORDER BY 절

SQL> SELECT empno, job, salary FROM employee1 UNION SELECT id, job, 0 FROM staff ORDER BY empno;

EMPNO JOB SALARY ------------- ---------- -------------- 10 Mgr 0.00 10 PRES 152750.00 20 Sales 0.00 20 MANAGER 94250.00 ....

77 개의 행이 검색되었습니다 .

Page 102: DB2 SQL

© 2009 IBM Corporation102

조인

1. JOIN 이란 ?

2. Cartesian JOIN

3. Inner Join

4. Table Alias 사용

5. 다중 Table JOIN

6. Non Inner Join

7. Outer JOIN 과 Left/Right Outer Join

8. Full Outer JOIN

Page 103: DB2 SQL

© 2009 IBM Corporation103

1. JOIN 이란 ?

관계형 Database 는 중복된 데이터를 최소로 가져가기 위해 만들어진 개념입니다 . 그러다 보니 1 차 , 2 차 , 3 차 정규화를 통해서 속성 , 특성에 맞는 데이터들을 집합으로 관리하는 특성이 있습니다 . 이러한 특성에 맞게 데이터들을 한 번에 추출하여 보여 주어야 할 경우 JOIN 이라는 형태로 연결하여 같이 보여 주게 됩니다 .

아래 예제는 각 직원들이 근무하는 부서의 상위 부서가 어디인지를 확인하는 쿼리문입니다 .

SQL> SELECT a.empno, a.lastname, a.deptno, b.admrdept FROM employee1 a, dept b WHERE a.deptno = b.deptno;

Page 104: DB2 SQL

© 2009 IBM Corporation104

2. Cartesian JOIN

카테시안 조인은 각 집합들에 대한 연결고리가 없어 , 1 : m 관계가 아니라 m : n 관계가 나타날 때 발생합니다 . 그래서 추출 되는 데이터의 크기는 m * n 개수 만큼 추출 됩니다 .

SQL> SELECT count(*) FROM employee1;

SQL> SELECT count(*) FROM dept;

SQL> SELECT count(*) FROM employee1, dept;

Page 105: DB2 SQL

© 2009 IBM Corporation105

3. Inner Join

가장 대표적인 JOIN 형태 입니다 . 두 집합 A, B 의 데이터를 연계하여 추출하기 위해서는 A, B 집합이 공통으로 가지고 있는 컬럼의 데이터 값이 동일해야 합니다 . 대부분의 경우 부모 자식간의 관계를 가지는 것이 일반적입니다 .

SQL> SELECT a.empno, a.lastname, a.deptno, b.deptno FROM employee1 a, dept b WHERE a.deptno = b.deptno AND b.deptno = 'C01';

Page 106: DB2 SQL

© 2009 IBM Corporation106

4. Table Alias 사용

여러개의 Table 들을 Join 할 경우 , 동일한 컬럼명을 가진 Table 들이 여럿 있을 수 있습니다 . 이 경우 SELECT 에서 조회되는 컬럼명이 어떤 Table 의 컬럼인지 명확하게 구분을 할 필요가 있습니다 . 이럴 경우 사용하는 것이 Table Alias 입니다 .

SQL> SELECT a.empno, a.lastname, a.deptno, b.deptno

FROM employee1 a,

dept b

WHERE a.deptno = b.deptno

AND b.deptno = 'C01';

Page 107: DB2 SQL

© 2009 IBM Corporation107

5. 다중 Table JOIN

두개 이상의 Table 로부터 데이터를 추출해야 할 경우 , 기준이 되는 Table 를 중심으로 나머지 Table 을 그 Table 에 Join 합니다 .

SQL> SELECT a.empno, b.phonenumber, c.deptname

FROM employee1 a,

vphone b,

dept c

WHERE a.empno = b.employeenumber

AND a.deptno = c.deptno;

Page 108: DB2 SQL

© 2009 IBM Corporation108

6. Non Inner Join

Inner Join 과 같이 두 집합간에 동일한 값을 가지는 경우가 아니라 , 특정 범위에 해당하는 데이터를 추출합니다 .

SQL> CREATE TABLE salary_grade ( GRA varchar2(3),

LOW_SAL number(8),

HIGH_SAL number(8)

);

SQL> INSERT INTO salary_grade SELECT 'A', 30000, 39999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'B', 40000, 49999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'C', 50000, 59999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'D', 60000, 69999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'E', 70000, 79999 FROM dual;

Page 109: DB2 SQL

© 2009 IBM Corporation109

6. Non Inner Join

SQL> INSERT INTO salary_grade SELECT 'F', 80000, 89999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'G', 90000, 99999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'H', 100000, 109999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'I', 110000, 119999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'J', 120000, 129999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'K', 130000, 139999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'L', 140000, 149999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'M', 150000, 159999 FROM dual;

SQL> INSERT INTO salary_grade SELECT 'N', 160000, 169999 FROM dual;

SQL> SELECT a.empno, a.lastname, a.salary, b.gra

FROM employee1 a,

salary_grade b

WHERE a.salary between b.low_sal and b.high_sal;

Page 110: DB2 SQL

© 2009 IBM Corporation110

7. Outer JOIN 과 Left/Right Outer Join

관계형 데이터베이스에서는 아직 정의되지 않은 값 , 즉 Null 값을 부득이 가져야 할 경우가 있습니다 . 예를 들어 설명하면 , 새로 입사한 신입 사원이 아직 부서 배치를 받지 못한 경우 그 직원의 부서 컬럼은 Null 값이 됩니다 . 만약 임원들이 부서별 전체 직원을 보고싶어 할 경우 Null 값을 포함하게 됩니다 . 이럴 경우 outer join 하게 됩니다 .

특이한 점은 Null 값이 작성되는 쪽 컬럼에 (+) 표시를 합니다 .

outer join 을 세부적으로 나누면 left, right outer join 으로 나눌 수 있습니다 .

SQL> SELECT a.empno, a.lastname, a.deptno, b.deptno FROM employee1 a, dept b WHERE a.deptno = b.deptno(+)

Page 111: DB2 SQL

© 2009 IBM Corporation111

9. Full Outer JOIN

full outer join 은 outer join 이 한 집합에 대해서 기준을 잡고 나머지 집합의 null 값 join 에 대해서 데이터를 보여주는 확장개념으로 두 집합을 서로 기준으로 잡고 null 값 join 에 대해서 데이터를 보여줍니다 .

SQL> SELECT a.empno, a.lastname, a.deptno, b.deptno, b.deptname FROM employee1 a FULL OUTER JOIN dept b ON (a.deptno = b.deptno);

Page 112: DB2 SQL

© 2009 IBM Corporation112

서브쿼리

1. 서브쿼리 ?

2. 서브쿼리 문법

3. 서브쿼리 유형1) Single-Row 서브쿼리2) Multi-Row 서브쿼리

4. 서브쿼리문에 GROUP BY 절 사용

5. 서브쿼리에서 Null 값 처리

6. 다중 컬럼 서브쿼리

7. 쌍 컬럼 비교 서브쿼리

8. FROM 절 서브쿼리

9. EXISTS 사용

10. Correlated 서브쿼리

11. WITH 절 사용

Page 113: DB2 SQL

© 2009 IBM Corporation113

1. 서브쿼리 ?

서브쿼리란 SQL 구문 안에서 사용하는 SELECT 문으로 Main 쿼리가 실행되기전 수행되어 Main 쿼리에 필요한 검색 조건을 제공합니다 . 서브쿼리 용도는 첫째 , WHERE 또는 HAVING

절의 조건값으로 사용하기 위해 둘째 , Table 생성 및 INSERT 문의 사용입니다 .

SQL> SELECT empno, lastname

FROM employee1

WHERE salary = ( SELECT min(salary)

FROM employee1 );

Page 114: DB2 SQL

© 2009 IBM Corporation114

2. 서브쿼리 문법

서브쿼리는 SELECT 구문안에 사용하는 SELECT 문입니다 . 이 서브쿼리는 FROM, WHERE, HAVING 절에서 사용할 수 있습니다 .

Page 115: DB2 SQL

© 2009 IBM Corporation115

3. 서브쿼리 유형

서브쿼리의 유형은 single-row 서브쿼리와 multiple-row 서브쿼리로 나눌 수 있습니다 .

single-row 서브쿼리는 SELECT 절에서 하나의 Data 값을 보여줄 경우 사용하고 , multiple-

row 서브쿼리는 SELECT 절에서 하나 이상의 Data 값을 보여줄 경우 사용합니다 . 여기서

주의할 것은 다중 Data 와 다중 컬럼은 다르다는 것입니다 .

Page 116: DB2 SQL

© 2009 IBM Corporation116

3. 서브쿼리 유형

1) Single-Row 서브쿼리

single-row 서브쿼리는 가장 일반적으로 사용하는 단순한 형태입니다 . 일반적으로 SELECT 에서 추출한 결과로 나오는 데이터의 개수가 1 이어야 하고 , 조건의 비교문으로 사용될 때는 IN, ANY, ALL, EXISTS 등을 이용합니다 .

SQL> SELECT empno, lastname FROM employee1 WHERE salary = ( SELECT min(salary) FROM employee1 );

Page 117: DB2 SQL

© 2009 IBM Corporation117

3. 서브쿼리 유형

< single-row 서브쿼리에서 사용할 수 있는 연산자 >

Page 118: DB2 SQL

© 2009 IBM Corporation118

3. 서브쿼리 유형

2) Multi-Row 서브쿼리

multiple-row 서브쿼리는 single-row 서브쿼리의 결과 행과 다르게 하나 이상의 행 수를 가질 때 사용합니다 . 주로 IN 연산자를 사용하여 쿼리문을 수행하게 합니다 .

SQL> SELECT a.empno, lastname FROM employee1 a WHERE deptno IN ( SELECT deptno FROM dept WHERE deptname = 'INFORMATION CENTER');

SQL> SELECT a.empno, a.lastname FROM employee1 a, dept b WHERE a.deptno = b.deptno AND b.deptname = 'INFORMATION CENTER';

Page 119: DB2 SQL

© 2009 IBM Corporation119

4. 서브쿼리문에 GROUP BY 절 사용

서브쿼리에 그룹 함수를 사용하여 한 행의 데이터를 추출하여 Main Query 와 연산할 수 있습니다 . 단 , 그룹 함수를 사용할 경우 한 행 이상의 데이터가 생성될 경우 IN 연산자와 같은 multiple-row 에서 사용하는 연산자를 사용해야 합니다 .

SQL> SELECT empno, lastname FROM employee1 WHERE salary = ( SELECT min(salary) FROM employee1 ); EMPNO LASTNAME ----------- ------------------ 200340 ALONZO

Page 120: DB2 SQL

© 2009 IBM Corporation120

5. 서브쿼리에서 Null 값 처리

SQL> SELECT a.deptno, a.deptname FROM dept a WHERE a.deptno not in ( SELECT deptno FROM employee1 b );

SQL> SELECT a.deptno, a.deptname FROM dept a WHERE a.deptno not in ( SELECT deptno FROM employee1 b WHERE deptno is not null);

SQL> SELECT min(a.deptno) deptno, a.deptname FROM dept a, employee1 b WHERE a.deptno = b.deptno AND b.deptno is null GROUP BY a.deptname;

Page 121: DB2 SQL

© 2009 IBM Corporation121

6. 다중 컬럼 서브쿼리

SQL> SELECT a.empno, a.lastname, salary FROM employee1 a WHERE (a.deptno, a.salary) IN ( SELECT deptno, max(salary) FROM employee1 GROUP BY deptno );

Page 122: DB2 SQL

© 2009 IBM Corporation122

7. 쌍 컬럼 비교 서브쿼리

SQL> SELECT deptno, count(empno) FROM employee1 WHERE (empno, deptno) IN ( SELECT empno, deptno FROM employee1 WHERE job <> 'MANAGER') GROUP BY deptno;

SQL> SELECT deptno, count(empno) FROM employee1 WHERE empno IN ( SELECT empno FROM employee1 WHERE job <> 'MANAGER') AND deptno IN ( SELECT deptno FROM employee1 WHERE job <> 'MANAGER') GROUP BY deptno;

Page 123: DB2 SQL

© 2009 IBM Corporation123

8. FROM 절 서브쿼리

SQL> SELECT deptno, count(empno)

FROM ( SELECT deptno, empno

FROM employee1

WHERE job <> 'MANAGER' )

GROUP BY deptno;

Page 124: DB2 SQL

© 2009 IBM Corporation124

9. EXISTS 사용

SQL> SELECT a.empno, a.lastname, job, deptno

FROM employee1 a

WHERE EXISTS ( SELECT ''

FROM employee1

WHERE job = 'MANAGER'

AND empno = a.empno );

SQL> SELECT a.empno, a.lastname, a.job, a.deptno

FROM employee1 a

WHERE job = 'MANAGER';

Page 125: DB2 SQL

© 2009 IBM Corporation125

10. Correlated 서브쿼리

SQL> SELECT lastname, salary, deptno

FROM employee1 a

WHERE salary > ( SELECT AVG(salary)

FROM employee1 b

WHERE a.deptno = b.deptno );

SQL> SELECT lastname, salary, deptno

FROM employee1 a

WHERE salary > ( SELECT AVG(salary)

FROM employee1 b

WHERE a.deptno = b.deptno

GROUP BY b.deptno );

Page 126: DB2 SQL

© 2009 IBM Corporation126

11. WITH 절 사용

SQL> WITH dept_costs as ( SELECT deptname, sum(salary) as dept_tot FROM employee1 a, dept b WHERE a.deptno = b.deptno GROUP BY deptname ), avg_cost as ( SELECT SUM(dept_tot)/count(*) AS dept_avg FROM dept_costs )

SELECT * FROM dept_costs WHERE dept_tot > ( SELECT dept_avg FROM avg_cost ) ORDER BY deptname;

Page 127: DB2 SQL

© 2009 IBM Corporation127

Data Definition Language

1.TABLE

1) CREATE TABLE

2) 서브쿼리를 이용한 Table 생성3) 컬럼 추가4) 컬럼 속성 변경5) 컬럼 제거6) 테이블 제거7) 테이블 이름 변경8) Truncate 테이블9) Table 에 주석 달기

2.VIEW

1) CREATE VIEW

2) VIEW 를 이용한 Query

3) VIEW 속성 변경4) With Check Option 절 사용5) VIEW 삭제

Page 128: DB2 SQL

© 2009 IBM Corporation128

1.TABLE

1) CREATE TABLE

Table 은 컬럼과 행의 집합으로 구성됩니다 . 테이블에 속하는 다양한 컬럼들의 숫자 ,

타입등의 정보는 DB2 catalogue 에 기록됩니다 . Table 을 만들기 위해서 사용하는 구문을 일반적으로 , Data Definition Language (DDL) 이라고 합니다 . Table 을 생성하기 위해서는 먼저 Table 을 생성할 수 있는 권한을 받아야 합니다 .

Page 129: DB2 SQL

© 2009 IBM Corporation129

1.TABLE

1) CREATE TABLE

< Table 생성 syntax >

Page 130: DB2 SQL

© 2009 IBM Corporation130

1.TABLE

2) 서브쿼리를 이용한 Table 생성

기존의 Oracle DB 의 서브쿼리를 이용한 Table 생성방법과는 다르게 Table 을 생성합니다 .

SQL> CREATE TABLE test1 like employee1; SQL> INSERT INTO test1 SELECT * FROM employee1;

SQL> commit;

Page 131: DB2 SQL

© 2009 IBM Corporation131

1.TABLE

3) 컬럼 추가

업무의 변화에 따라 Table 의 속성을 추가 , 수정 , 삭제등의 일이 발생할 수 있습니다 .

이럴 경우에는 Table 의 속성값인 컬럼의 Datatype 및 길이의 수정 , 컬럼의 추가 및 삭제를 수행하여 해결할 수 있습니다 . 먼저 컬럼의 추가 입니다 .

SQL> ALTER TABLE test1 ADD test varchar(10);

DB250000I: 명령이 완료되었습니다 .

< 컬럼 추가 syntax >

Page 132: DB2 SQL

© 2009 IBM Corporation132

1.TABLE

4) 컬럼 속성 변경

업무 분석 결과 test 컬럼의 길이를 10 자리로 결정했으나 , 향후 Data 길이를 증가를 고려하여 20 자리 변경하기로 또 다시 결정되었습니다 . 이 경우 여러 방법이 있으나 , 컬럼의 Data 길이를 변경하는 것이 가장 효율적입니다 .

SQL> ALTER TABLE test1 ALTER COLUMN test SET DATA TYPE varchar(20);

DB250000I: 명령이 완료되었습니다 .

< 컬럼 속성값 변경 syntax >

Page 133: DB2 SQL

© 2009 IBM Corporation133

1.TABLE

5) 컬럼 제거

필요해서 만든 컬럼이지만 , 실 업무에서 거의 사용하지 않아 공간만 차지한다고 판단할 경우 해당 컬럼을 삭제하게 됩니다 .

SQL> ALTER TABLE test1 DROP COLUMN test;

DB250000I: 명령이 완료되었습니다 .

< 컬럼 삭제 syntax >

Page 134: DB2 SQL

© 2009 IBM Corporation134

1.TABLE

6) 테이블 제거

더 이상 사용치 않은 Table 을 삭제 할 때 사용합니다 .

SQL> DROP TABLE test2;

DB250000I: 명령이 완료되었습니다 .

< 테이블 삭제 syntax >

Page 135: DB2 SQL

© 2009 IBM Corporation135

1.TABLE

7) 테이블 이름 변경

Table 명을 변경해야 할 경우 사용합니다 .

SQL> RENAME test1 TO test2;

DB250000I: 명령이 완료되었습니다 .

< 테이블 명 변경 syntax >

Page 136: DB2 SQL

© 2009 IBM Corporation136

1.TABLE

8) Truncate 테이블

Table 안에 있는 데이터를 지우고 싶을 때 사용합니다 .

SQL> TRUNCATE TABLE test2;

DB250000I: 명령이 완료되었습니다 .

< Truncate Table syntax >

Page 137: DB2 SQL

© 2009 IBM Corporation137

1.TABLE

9) Table 에 주석 달기

Table 및 column 에 주석을 달아 Table 또는 Column 의 이해도를 높입니다 .

SQL> COMMENT ON TABLE test2 IS 'purpose for Test‘;

DB250000I: 명령이 완료되었습니다 .

SQL> COMMENT ON COLUMN test2.empno IS 'empno is employees id‘;

DB250000I: 명령이 완료되었습니다 .

< 주석 처리 syntax >

Page 138: DB2 SQL

© 2009 IBM Corporation138

2.VIEW

쉽게 설명하면 VIEW 는 Table 을 보기위한 창문으로 생각할 수 있습니다 . 창문을 통하면 방안을 볼 수 있지만 , 방안 전체는 보지 못합니다 . 즉 , 필요한 데이터를 보여주기 위해서 Table 의 전체 데이터를 보여 줄 필요가 없는 경우 VIEW 를 통해서 보여주게 됩니다 . 다시 말하면 , VIEW 의 의미는 하나의 SELECT 문을 미리 작성해 두었다가 필요시마다 꺼내 쓰는 것입니다 .

VIEW 사용 이점

Data 사용을 제약할 수 있습니다 .

복잡한 쿼리들을 미리 VIEW 형태로 만들어 사용할 수 있습니다 .

VIEW 는 몇 개의 Table 로부터 추출한 데이터들을 한 번에 보여줍니다 .

Page 139: DB2 SQL

© 2009 IBM Corporation139

2.VIEW

1) CREATE VIEW

일반적으로 VIEW 생성은 서브쿼리를 이용해서 작성을 하게 됩니다 .

SQL> CREATE OR REPLACE VIEW v_employee1

AS ( SELECT empno, lastname, deptname

FROM employee1 a,

dept b

WHERE a.deptno = b.deptno );

< view 생성 syntax >

Page 140: DB2 SQL

© 2009 IBM Corporation140

2.VIEW

VIEW 생성을 위한 가이드

복잡합 쿼리를 사용하여 VIEW 를 생성할 경우 일반적으로 서브쿼리를 이용합니다 .

VIEW 를 생성할 때 , 구문안에 ORDER BY 를 함께 사용할 수 없습니다 .

OR REPLACE 옵션을 사용하여 VIEW 의 속성을 drop 하지 안고 변경할 수 있습니다 .

Page 141: DB2 SQL

© 2009 IBM Corporation141

2.VIEW

2) VIEW 를 이용한 Query

기존에 복작합 쿼리를 VIEW 로 만들고 , 재 사용하여 손쉽게 데이터를 추출할 수 있습니다 .

SQL> SELECT a.lastname, a.deptname, b.admrdept FROM v_employee1 a, vdepmg1 b WHERE a.deptname = b.deptname;

SQL> SELECT a.lastname, a.deptname, b.admrdept FROM ( SELECT x.empno, x.lastname, y.deptname FROM employee1 x, dept y WHERE x.deptno = y.deptno ) a, vdepmg1 b WHERE a.deptname = b.deptname;

Page 142: DB2 SQL

© 2009 IBM Corporation142

2.VIEW

3) VIEW 속성 변경

기존 설정한 속성에 대해서 추가 또는 삭제할 경우 ‘ OR REPLACE’ 옵션을 사용하면 쉽게 변경할 수 있습니다 .

SQL> CREATE OR REPLACE VIEW v_employee1 AS ( SELECT a.empno, a.lastname, b.deptno, b.deptname FROM employee1 a, dept b WHERE a.deptno = b.deptno );

DB250000I: 명령이 완료되었습니다 .

Page 143: DB2 SQL

© 2009 IBM Corporation143

2.VIEW

4) With Check Option 절 사용

VIEW 에서 Data 의 일정 부분에 대한 제약 조건을 사용하고 싶을 때 사용합니다 .

SQL> CREATE OR REPLACE VIEW v_employee2 AS SELECT a.empno, a.lastname, a.deptno FROM employee1 a WHERE a.deptno = 'E01' WITH LOCAL CHECK OPTION;

DB250000I: 명령이 완료되었습니다

SQL> UPDATE v_employee2 SET deptno = 'A01' WHERE deptno = 'E01';

1 라인 근처 오류 :SQL0161N 삽입 또는 갱신 작업의 실행 결과 행이 뷰 정의에 맞지 않습니다 .

Page 144: DB2 SQL

© 2009 IBM Corporation144

2.VIEW

4) With Check Option 절 사용

SQL> CREATE OR REPLACE VIEW v_employee2 AS SELECT a.empno, a.lastname, a.deptno FROM employee1 a WHERE a.deptno = 'E01'; /* WITH LOCAL CHECK OPTION 이 빠짐 */

DB250000I: 명령이 완료되었습니다 .

SQL> UPDATE v_employee2 SET deptno = 'A01' WHERE deptno = 'E01';

DB250000I: 명령이 완료되었습니다 .

Page 145: DB2 SQL

© 2009 IBM Corporation145

2.VIEW

‘WITH CHECK OPTION’ 을 사용하기 위해서는 다음의 제약 사항을 확인해야 합니다 .

VIEW 가 단지 읽기 기능만 정의되어 있고 , SELECT 구문이 다음의 내용을 포함할 경우

‘WITH CHECK OPTION’ 을 사용할 수 없습니다 .

( DISTINCT, Column Function, GROUP BY, HAVING, 둘 이상의 테이블 또는 VIEW 를

포함하고 있는 경우 )

Page 146: DB2 SQL

© 2009 IBM Corporation146

2.VIEW

5) VIEW 삭제

더 이상 사용할 필요가 없는 VIEW 는 삭제할 수 있습니다 .

SQL> DROP VIEW v_employee2;

DB250000I: 명령이 완료되었습니다 .

SQL> DROP VIEW v_employee1;

DB250000I: 명령이 완료되었습니다 .

Page 147: DB2 SQL

© 2009 IBM Corporation147

Data Manipulation Language

1.DML(Data Manipulation Language) 란 ?

2.INSERT

1) INSERT Statement syntax

2) 새로운 행 넣기3) Inserting NULL 값4) 다른 Table 로 행을 복사5) INSERT 에 서브쿼리 사용

3.UPDATE

1) Data 변경2) UPDATE statement syntax

3) 서브쿼리 이용

4.DELETE

1) 데이터 삭제2) DELETE Statement syntax

Page 148: DB2 SQL

© 2009 IBM Corporation148

1. DML(Data Manipulation Language) 란 ?

DML 은 SQL 에서 데이터를 조정하는 INSERT, UPDATE, DELETE 등으로 구성됩니다 .

DML 은 논리적으로는 하나의 작업 단위의 시작과 끝으로 이루어지며 , 이것을 Transaction

이라고 합니다 . 홈쇼핑에서 제품을 구매했을 경우를 예로들어 설명하겠습니다 . 고객이

주문을 선택하고 결제를 하려고 했습니다 . 결제를 하려는 순간 정전으로 인해서 컴퓨터가

다운 되는 상황이 발생했습니다 . 이 경우 주문은 완료 되었다고 할 수 있을까요 ? 하나의

Transaction 은 주문을 선택하고 결제완료하는 모든 단계가 다 이루어 진 경우를 말합니다 .

Page 149: DB2 SQL

© 2009 IBM Corporation149

2. INSERT

1) INSERT Statement syntax

INSERT 는 새로운 Data 를 Table 에 삽입할 때 사용합니다 .

< INSERT Statement syntax >

Page 150: DB2 SQL

© 2009 IBM Corporation150

2. INSERT

2) 새로운 행 넣기

SQL> INSERT INTO employee1 VALUES ( 011100, 'JONGHWAN', '', 'BAEK', 'A00', '3978', '1995-01-01 00:00:00', 'PRES', 18, 'M', '1975-05-01 00:00:00', '152750', '1000', '4220' );

DB250000I: 명령이 완료되었습니다 .

Page 151: DB2 SQL

© 2009 IBM Corporation151

2. INSERT

3) Inserting NULL 값

NULL 값 Data 를 Table 에 삽입하는 방법은 묵시적인 ‘’ 방법과 명시적인 NULL 방법 두 가지가 있습니다 .

SQL> INSERT INTO employee1 ( empno, firstnme, lastname, edlevel ) values ( '111111','DOYOUNG','YANG','2');

DB250000I: 명령이 완료되었습니다 .

SQL> commit;

DB250000I: 명령이 완료되었습니다 .

SQL> SELECT midinit, deptno, phoneno, hiredate, job, sex, birthdate, salary, bonus, comm FROM employee1 WHERE empno = '111111';

MIDINIT DEPTNO PHONENO HIREDATE JOB SEX BIRTHDATE SALARY BONUS COMM-------- ------- -------- --------- ------ ---- ----------- ------ ------- ------

Page 152: DB2 SQL

© 2009 IBM Corporation152

2. INSERT

4) 다른 Table 로 행을 복사

특정 Table 의 데이터를 다른 테이블로 복사 하고자 할 때 사용합니다 .

SQL> TRUNCATE table employee1;

DB250000I: 명령이 완료되었습니다 .

SQL> INSERT INTO employee1 SELECT * FROM employee;

DB250000I: 명령이 완료되었습니다 .

SQL> COMMIT;

DB250000I: 명령이 완료되었습니다 .

Page 153: DB2 SQL

© 2009 IBM Corporation153

2. INSERT

5) INSERT 에 서브쿼리 사용

INSERT 문에 SELECT 문을 삽입하여 사용합니다 .

SQL> INSERT INTO ( SELECT empno, firstnme, lastname, job, salary, edlevel, deptno FROM employee1 ) VALUES ( '111112', 'JONGHYUN', 'PARK', 'MANAGER', 70000, 2, 'E01');

DB250000I: 명령이 완료되었습니다 .

SQL> COMMIT;

DB250000I: 명령이 완료되었습니다 .

SQL> SELECT * FROM employee1;

Page 154: DB2 SQL

© 2009 IBM Corporation154

3. UPDATE

1)Data 변경

업무에서 Data 변경에 대한 요구는 실시간으로 요구되어지고 있습니다 . 이럴 경우 Table Data 의 변경은 불가피 합니다 . 이런 Data 변경을 가능하게 하는 것이 UPDATE 입니다 .

SQL> UPDATE employee1 SET empno = '222222' WHERE empno = '111111';

SQL> SELECT * FROM employee1 WHERE empno = '111111';

SQL> SELECT * FROM employee1 WHERE empno = '222222';

Page 155: DB2 SQL

© 2009 IBM Corporation155

3. UPDATE

2) UPDATE statement syntax

< UPDATE statement syntax >

Page 156: DB2 SQL

© 2009 IBM Corporation156

3. UPDATE

3) 서브쿼리 이용

서브쿼리를 이용하여 UPDATE 를 수행합니다 .

SQL> UPDATE employee1 SET job = ( SELECT job FROM employee1 WHERE empno = '200120'), salary = ( SELECT salary FROM employee1 WHERE empno = '200340') WHERE empno = '111112';

Page 157: DB2 SQL

© 2009 IBM Corporation157

4. DELETE

1) 데이터 삭제

홈쇼핑의 구매 고객이 회원탈퇴를 하면 고객의 정보를 지우게 됩니다 . 이 때 사용하는 것이 DELETE 입니다 .

SQL> DELETE employee1 WHERE empno = '111112';

DB250000I: 명령이 완료되었습니다 .

SQL> COMMIT;

DB250000I: 명령이 완료되었습니다 .

Page 158: DB2 SQL

© 2009 IBM Corporation158

4. DELETE

2) DELETE Statement syntax

< DELETE 절에 대한 용어 >

Page 159: DB2 SQL

© 2009 IBM Corporation159

계층구조

1. 계층형 구조 쿼리

2. 계층구조 쿼리의 수행 방법

Page 160: DB2 SQL

© 2009 IBM Corporation160

1. 계층형 구조 쿼리

계층형 구조 쿼리는 인터넷 서핑을 하다보면 여러곳에서 만날 수 있습니다 . 그 중 한가지를

예로 들어 설명하겠습니다 . 특정 인터넷 게시판에 상품에 대한 문의를 할 경우 거기에 대한

답변 그리고 그 답변에 대한 문의 또는 답변들을 볼 수 있습니다 . 일반적으로 이런 경우 계층형

구조 쿼리를 사용하게 됩니다 .

Page 161: DB2 SQL

© 2009 IBM Corporation161

2. 계층구조 쿼리의 수행 방법

계층구조 쿼리의 syntax 는 다른 일반적인 쿼리문과는 조금 다른데 , START WITH 절과 CONNECT BY 절의 추가가 그 특징이라 할 수 있습니다 .

< 계층구조 쿼리 Syntax >

Page 162: DB2 SQL

© 2009 IBM Corporation162

2. 계층구조 쿼리의 수행 방법

계층형구조 쿼리의 순서는 다음과 같이 진행 됩니다 .

START WITH 에 의해 ROOT 로 이동합니다 .

CONNECT BY 에 의해 트리를 작성합니다 .

PRIOR 에 기술된 방향으로 트리를 탐색합니다 .

CONNECT BY 조건이 적용되어 필요할 때에 트리의 가지를 제외합니다 .

WHERE 조건을 적용하여 필요 때에 각 행을 제외합니다 .

Page 163: DB2 SQL

© 2009 IBM Corporation163

2. 계층구조 쿼리의 수행 방법

SQL> CREATE TABLE JONGHB02 ( YYMMDD VARCHAR2(08) NOT NULL, ACCOUNT_CD VARCHAR2(04) NOT NULL, ACCOUNT_AM NUMBER, CONSTRAINT JONGHB02_PK PRIMARY KEY (YYMMDD,ACCOUNT_CD) ); SQL> INSERT INTO JONGHB02 VALUES ('20100530','122', 4000);SQL> INSERT INTO JONGHB02 VALUES ('20100530','130', 3000);SQL> INSERT INTO JONGHB02 VALUES ('20100530','120', 2150);SQL> INSERT INTO JONGHB02 VALUES ('20100530','141', 2030);SQL> INSERT INTO JONGHB02 VALUES ('20100530','131', 2570);

SQL> COMMIT;

Page 164: DB2 SQL

© 2009 IBM Corporation164

2. 계층구조 쿼리의 수행 방법

SQL> CREATE TABLE JONGHB01 ( ACCOUNT_CD VARCHAR2(04) NOT NULL, PACCOUNT_CD VARCHAR2(04), CONSTRAINT JONGHB01_PK PRIMARY KEY (ACCOUNT_CD) );

SQL> INSERT INTO JONGHB01 VALUES ('100','');SQL> INSERT INTO JONGHB01 VALUES ('120','100');SQL> INSERT INTO JONGHB01 VALUES ('130','100');SQL> INSERT INTO JONGHB01 VALUES ('122','120');SQL> INSERT INTO JONGHB01 VALUES ('121','120');SQL> INSERT INTO JONGHB01 VALUES ('123','120');SQL> INSERT INTO JONGHB01 VALUES ('131','130');SQL> INSERT INTO JONGHB01 VALUES ('140','100');SQL> INSERT INTO JONGHB01 VALUES ('141','140');

SQL> COMMIT;

Page 165: DB2 SQL

© 2009 IBM Corporation165

2. 계층구조 쿼리의 수행 방법

SQL> SELECT level, account_cd, paccount_cd FROM jonghb01 CONNECT BY PRIOR account_cd = paccount_cd START WITH account_cd = '100';

SQL> SELECT a.yymmdd, b.account_cd, sum(a.account_am) FROM jonghb02 a, jonghb01 b WHERE a.account_cd IN ( SELECT account_cd FROM jonghb01 CONNECT BY PRIOR account_cd = paccount_cd START WITH account_cd = b.account_cd ) GROUP BY a.yymmdd, b.account_cd;

Page 166: DB2 SQL

© 2009 IBM Corporation166

2. 계층구조 쿼리의 수행 방법

SQL> CREATE TABLE jonghb03 ( C_CODE VARCHAR2(15) NOT NULL, P_CODE VARCHAR2(15), CONSTRAINT jonghb03_PK PRIMARY KEY (C_CODE) );

SQL> INSERT INTO jonghb03 VALUES ( '000','');SQL> INSERT INTO jonghb03 VALUES ( '222','220');SQL> INSERT INTO jonghb03 VALUES ( '200','000');SQL> INSERT INTO jonghb03 VALUES ( '210','200');SQL> INSERT INTO jonghb03 VALUES ( '212','210');SQL> INSERT INTO jonghb03 VALUES ( '110','100');SQL> INSERT INTO jonghb03 VALUES ( '220','200');SQL> INSERT INTO jonghb03 VALUES ( '221','220');SQL> INSERT INTO jonghb03 VALUES ( '100','000');SQL> INSERT INTO jonghb03 VALUES ( '111','110');SQL> INSERT INTO jonghb03 VALUES ( '120','100');SQL> INSERT INTO jonghb03 VALUES ( '121','120');SQL> INSERT INTO jonghb03 VALUES ( '122','120');SQL> INSERT INTO jonghb03 VALUES ( '112','110');SQL> INSERT INTO jonghb03 VALUES ( '211','210');SQL> INSERT INTO jonghb03 VALUES ( '999','100');

SQL> COMMIT;

Page 167: DB2 SQL

© 2009 IBM Corporation167

2. 계층구조 쿼리의 수행 방법

SQL> CREATE TABLE jonghb04 ( C_CODE VARCHAR2(15) NOT NULL, C_CODE_DESC VARCHAR2(30), CONSTRAINT jonghb04_PK PRIMARY KEY (C_CODE) );

SQL> INSERT INTO jonghb04 VALUES ( '999','Parent level is 100');SQL> INSERT INTO jonghb04 VALUES ('000','The highest level is');SQL> INSERT INTO jonghb04 VALUES ( '222','Parent level is 220');SQL> INSERT INTO jonghb04 VALUES ( '200','Parent level is 000');SQL> INSERT INTO jonghb04 VALUES ( '210','Parent level is 200');SQL> INSERT INTO jonghb04 VALUES ( '212','Parent level is 210');SQL> INSERT INTO jonghb04 VALUES ( '110','Parent level is 100');SQL> INSERT INTO jonghb04 VALUES ( '220','Parent level is 200');SQL> INSERT INTO jonghb04 VALUES ( '221','Parent level is 220');SQL> INSERT INTO jonghb04 VALUES ( '100','Parent level is 000');SQL> INSERT INTO jonghb04 VALUES ( '111','Parent level is 110');SQL> INSERT INTO jonghb04 VALUES ( '120','Parent level is 100');SQL> INSERT INTO jonghb04 VALUES ( '121','Parent level is 120');SQL> INSERT INTO jonghb04 VALUES ( '122','Parent level is 120');SQL> INSERT INTO jonghb04 VALUES ( '112','Parent level is 110');SQL> INSERT INTO jonghb04 VALUES ( '211','Parent level is 210');

SQL> COMMIT;

Page 168: DB2 SQL

© 2009 IBM Corporation168

2. 계층구조 쿼리의 수행 방법

SQL> SELECT a.lev, a.c_code, b.c_code_desc, a.p_code, c.c_code_desc FROM ( SELECT level lev, c_code, p_code FROM jonghb03 START WITH p_code = '000' AND c_code > ' ' CONNECT BY PRIOR c_code = p_code AND c_code > ' ' ) a, jonghb04 b, jonghb04 c WHERE b.c_code = a.c_code AND c.c_code = a.p_code ORDER BY a.c_code, a.lev;