절차형 SQL 작성
[ 절차형 SQL ]
1) 절차형 SQL 개념
- 절차형 SQL 개념은 일반적인 개발 언어처럼 절차 지향적인 프로그램이 가능한 SQL
2) 절차형 SQL 개념
정류 | 설명 |
트리거(Ttigger) | 데이터베이스 시스템에서 삽입, 갱신, 삭제 등의 이벤트가 발생할 때마다 관련 작업이 자동으로 수행되는 절차형 SQL |
사용자 정의 함수(User-Defined Function) | 절차형 SQL 을 활용하여 일련의 연산 처리 결과를 단일 값으로 반환할 수 있는 함수 단순 함수 정의 |
프로시저(Procedure) | 일련의 쿼리들을 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합 여러 함수들이나 쿼리들을 통해 하나의 흐름을 구상 |
[ SQL 문법 ]
1) SQL 문법의 개념
- SQL 문법은 DB 를 접근하고 조작하는 데 필요한 표준 언어를 활용할 수 있게 해주는 규칙
2) SQL 문법의 종류
분류 | 설명 |
데이터 정의어(DDL) | 데이터를 정의하는 언어 테이블이나 관계의 구조를 생성하는 데 사용 CREATE, ALTER, DROP, TRUNCATE 문이 있음 |
데이터 조작어(DML) | DB 에 저장된 자료들을 입력, 수정, 삭제, 조회 하는 언어 SELECT, INSERT, UPDATE, DELETE 문이 있음 SELECT ANSDMS 특별히 질의어(Query)라고 부름 |
데이터 제어어(DCL) | DB 관리자가 데이터 보안, 무결성 유지, 병행 제어, 회복을 위해 사용하는 제어용 언어 GRANT, REVOKE 문이 있음 |
3) WHERE 조건
- WHERE 조건 절에서는 비교, 범위, 집합, 패턴, NULL, 복합 조건 등을 다룸
구분 | 연산자 | 사례 |
비교 | =, <>, <, <=, >, >= | PRICE < 50000 PRICE 속성의 값이 50000 미만 |
범위 | BETWEEN | PRICE BETWEEN 50000 AND 80000 PRICE 속성 값이 50000 이상 80000 이하 |
집합 | IN, NOT IN | PRICE IN (40000, 50000, 60000) PRICE 속성 값이 40000 또는 50000 또는 60000 |
패턴 | LIKE | NAME LIKE '정보%' NAME 속성값이 '정보'로 시작되는 문자열 |
NULL | IS NULL, IS NOT NULL | PRICE IS NULL PRICE 속성 값이 NULL 인 경우 |
복합조건 | AND, OR, NOT | (PRICE < 50000) AND (NAME LIKE '정보%') PRICE 속성값이 50000 보다 작으면서 NAME 속성값이 '정보'로 시작되는 문자열 |
(col BETWEEN A AND B) == (col >= A AND B <= B)
4) LIKE 와 같이 사용하는 와일드 문자
- LIKE 와 같이 사용되는 와일드 문자는 +, %, [ ], [ ^ ], _ 가 있음
와일드 문자 | 설명 | 사례 |
+ | 문자열을 연결 | '축구' + '감독': '축구 감독' |
% | 0 개 이상의 문자열과 일치 | LIKE '키워드%' = '키워드' 로 시작하는 문자영 검색 |
[ ] | 1 개의 문자와 일치 | '[0~8]%' = 0 - 8 사이 숫자로 시작하는 문자열 |
[ ^ ] | 1 개의 문자와 불일치 | '[^0~8]%' = 0 - 8 사이 숫자로 시작하니 않는 문자열 |
_ | 특정 위치의 1개의 문자와 일치 | '_동%' = 두 번째 위치에 '동'이 들어가는 문자열 |
응용 SQL 작성
[ 데이터 조작어(DML:Data Manipulation Language) ]
1) 데이터 조작어의 개념
- DML
- 데이터 조작어는 DB 에 저장된 자료들을 입력, 수정, 삭제, 조회하는 언어
2) DML 유형
유형 | 동작 | 설명 |
SELECT | 데이터 조회 | 해당 테이블을 구성하는 튜플 중에서 전체 또는 조선을 만족하는 튜플을 검색하여 주기억장치 상에 임시 테이블로 구성하는 명령문 |
INSERT | 데이터 삽입 | 해당 테이블에 새로운 튜플을 삽입할 때 사용하는 명령문 |
UPDATE | 데이터 변경 | 해당 테이블에 있는 튜플 중에서 특정 튜플의 내용을 변경할 때 사용하는 명령문 |
DELETE | 데이터 삭제 | 해당 테이블에 있는 튜플 중에서 특정 튜플을 삭제할 때 사용하는 명령문 |
3) 데이터 조작어 명령어
- SELECT : 데이터의 내용을 조회할 때 사용하는 명령어
SELECT [ALL|DISTINCT] 속성명1, 속성명2, ...
FROM 테이블 명1, ...
[WHERE 조건]
[GROUP BY 속성명1, ... ]
[HAVING 그룹조건]
[ORDER BY 속성 [ASC|DESC]];
구분 | 설명 |
SELECT 절 | 검색하고자 하는 속성명, 계산식 2개 이상의 테이블을 대상으로 검샐할 때는 '테이블명, 속성명' 으로 기입 술어 부분은 ALL 이 기본값 ALL - 모든 튜플을 검색할 때 사용 - SELECT 뒤에 명시하지 않을 경우 ALL 로 인식 DISTINCT - 중복된 속성이 조회될 경우 그 중 한 개만 검색 (SELECT 뒤에 명시된 속성이 중복될 경우 한 개만 검색) |
FROM 절 | 질의에 의해 검색될 데이터들을 포함하는 테이블명을 기술 |
GROUP BY 절 | 속성값을 그룹으로 분류하고자 할 때 사용 |
HAVING 절 | GROUP BY 에 의해 분류한 후 그룹에 대한 조건을 기술 |
ORDER BY 절 | 속성값을 정렬하고자 할 때 사용 ASC 와 DESC 키워드 생략시 오름차순(ASC) 정렬 ASC - 오름차순 DESC - 내림차순 |
- DISTINCT 는 기본적으로 행을 기준으로 중복을 구분한다.
- 행 한 줄 한 줄 비교하면서 각 컬럼이 전부 동일한 값이 있는 행의 경우 제거를 한다
employees
id | name | department |
1 | Alice | Sales |
2 | Bob | HR |
3 | Alice | Sales |
4 | Alice | HR |
SELECT DISTINCT name FROM employees # 조회할 행의 구성 column 은 name
Alice |
Bob |
SELECT DISTINCT name, department FROM emplyees # 조회할 행의 구성 column 은 name 과 department
Alice | Sales |
Bob | HR |
Alice | HR |
마지막 행은 첫 행과 동일하게 Alice 를 보유하고 있지만, department 값이 다르기 때문에 다른 행으로 간주
- INSERT : 데이터의 내용을 삽입할 때 사용하는 명령어
[학생] 테이블에 학번: 6677, 성명: '장길산', 학년: 3학년, 수강과목: '수학' 인 학생을 삽입
INSERT INTO 학생(학번, 성명, 학년, 수강과목)
VALUES(6677, '장길산', 3, '수학');
구분 | 설명 |
INSERT INTO 테이블명(속성명1, ... ) | 속성수에 맞춰 데이터 개수, 데이터 타입이 일치 해야함 |
INTO(데이터1, ... ); | 속성명 생략가능 |
- UPDATE : 데이터의 내용을 변경할 때 사용하는 명령어
[학생] 테이블에 장길산의 주소를 '인천'으로 수정
UPDATE 학생
SET 주소 = '인천'
WHERE 이름 = '장길산';
구분 | 설명 |
UPDATE 테이블명 SET 속성명1 = 데이터1, 속성명2 = 데이터2, ... WHERE 조건; |
UPDATE 명령문은 WHERE 절을 통해 어떤 조건이 만족할 경우 특정 column 의 값을 수정하는 용도로 자주 사용 |
DELETE : 데이터의 내용을 삭데할 때 사용하는 명령어
[학생] 테이블에 '장길산'에 대한 튜플을 삭제
DELETE FROM 학생
WHERE 이름='장길산';
구분 | 설명 |
DELETE FROM 학생 WHERE 조건; |
모든 레코드를 삭제할 때는 WHERE 절 없이 DELETE 만 사용 레코드 삭제시에도 테이블 구조는 남아 있어 디스크에서 테이블을 완전히 삭제하는 DROP 명령과는 다름 |
[ 데이터 제어어(DCL:Date Control Langauge) ]
1) 데이터 제어어의 개념
- DCL
- DBA(DB 관리자)가 데이터 보안, 무결성 유지, 병행 제어, 회복을 위해 사용하는 언어
2) DCL 기능
기능 | 설명 |
데이터 보안 | 불법적인 사용자로부터 데이터를 보호 |
무결성 유지 | 데이터의 정확성과 일관성을 유지 |
병행수행 제어 | 여러 트랜잭션을 수행할 때 트랜잭션들이 DB 의 일관성을 파괴하니 않도록 트랜잭션 간의 상호작용을 제어 |
회복 | DB 장애 발생시 DB 를 장애 발생 이전의 상태로 복원 |
3) DCL 유형
유형 | 명령어 | 동작 | 설명 |
DCL | GRANT | 상용 권한 부여 | DBA 가 사용자게에 DB 에 대한 권한을 부여 |
REVOKE | 사용 권한 취소 | DBA 가 사용자에게 DB 에 대해 부여했던 권한을 회수 | |
DCL/TCL | COMMIT | 트랜잭션 확정 | DB 트랜잭셩의 내용 업데이트 를 영구적으로 확정 |
REVOKE | 트랜잭션 취소 | DB 에서 업데이트 오류 발생시, 최근 COMMIT 이전 상태로 되돌림 | |
SAVEPOINT(=CHECKPOINT) | 저장 시기 설정 | 트랜잭션의 특정 지점에 이름을 지정하고, 그 지점 이전에 수행한 작업에 영향을 주지 않고 그 지점 이후에 수행한 작업을 ROLLBACK 을 수행 |
- GRANT
- WITH GRANT OPTION 을 통해 권한을 부여한 사용자에게도 '다른 사용자에게 권한을 부여'할 수 있는 권한을 같이 사용
- REVOKE
- CASCADE 를 통해 WITH GRANT OPTION 으로 권한을 부여받은 다른 사용자들의 권한도 일괄 회수하는 기능을 같이 사용
- RESTRICT 를 사용하면 권한을 취소하려는 유저가 다른 유저에게 권한을 부여했다면 REVOKE 는 적용되지 않는다
- SQL 권한 시스템은 정확한 근거(chain of authority)를 기준으로 설계됨
- 권한의 출처가 사라지면, 그 위에 구축된 권한도 무효화됨
- 즉, 사용자 A 의 권한만 회수하고, A 로 부터 권한을 부여받은 다른 유저들은 내버려두는 경우는 존재하지 않음
4) DCL 명령어
- GRANT : DBA 가 사용자에게 DB 에 대한 권한을 부여하는 명령어
DBA 가 '장길산'에게 '학생' 테이블에 대해 수정할 수 있는 권한 부여
GRANT UPDATE ON 학생 TO 장길산;
----------------------------------------------------------------------------------------
DBA 가 '장길산'에게 '학생' 테이블에 대해 조회할 수 있는 권한과 그 권한을 다른 사용자에게 부여할 수 있는 권한 부여
GRANT SELECT ON 학생 TO 장길산 WITH GRANT OPTION;
권한 | 구문 | 설명 |
시스템 권한 | GRANT 권한 TO 사용자; | DBA 가 사용자에게 테이블 | 뷰 | 프로시저 등을 실행하고 삭제할 수 있는 권한 부여 |
객체 권한 | GRANT 권한 ON 테이블 TO 사용자; | DBA 가 사용자에게 테이블을 수정, 삽입, 삭제, 조회와 프로시저 실행을 할 수 있는 권한 부여 |
- REVOKE : DBA 가 사용자에게 부여했던 권한을 회수하는 명령어
DBA 가 사용자 '장길산'에게 '학생' 테이블에 대해 수정할 수 있는 권한을 회수
REVOKE UPDATE ON 학생 FROM 장길산;
--------------------------------------------------------------------------------------------
DBA 가 사용자 '장길산'에게 '학생' 테이블에 대해 조회를 할 수 있는 권한과 WITH GRANT OPTION을 통해 권한을 부여받은 다른 사용자들의 권한까지 회수
REVOKE SELECT ON 학생 FROM 장길산 [CASCADE | RESTRICT];
권한 | 구문 | 설명 |
시스템 권한 | REVOKE 권한 FROM 사용자; | DBA 가 사용자에게 테이블 | 뷰 | 프로시저 등을 생성하고 삭제할 수 있는 권한 회수 |
객체 궎나 | REVOKE 권한 ON 테이블 FROM 사용자; | DBA 가 사용자에게 테이블을 수정, 삽입, 삭제, 조회와 프로시저 실행할 수 있는 권한을 회수 |
- TCL
- 트랜잭션을 제어하는 언어로써 COMMIT, ROLLBACK, SAVEPOINT(=CHECKPOINT), ROLLBACK TO SAVEPOINT 가 있음
# A 테이블에서 COMMIT 과 ROLLBACK 을 같이 사용하는 경우(삽입 1 과 2 두 개가 됐지만, 실행 완료 후 테이블에 1만 남아있음)
INSERT INTO A VALUES(1);
COMMIT; # COMMIT 명령어 동작 시 기존 명령어가 DB에 영구적으로 삽입
INSERT INTO A VALUES(2);
ROLLBACK; # ROLLBACK 명령어 동작 시 COMMIT 이후 명령어는 원상 복구
--------------------------------------------------------------------------------------------------------------------------
# A 테이블에서 SAVEPOINT, COMMIT, ROLLBACK을 같이 사용하는 경우(실행 완료 후 테이블에 1, 3이 남아있음)
INSERT INTO A VALUES(1);
SAVEPOINT SP; # SAVEPOINT 를 SP 라는 이름으로 설정
INSERT INTO A VALUES(2);
ROLLBACK TO SAVEPOINT SP; # SP 지정된 부분부터 현재 위치 사이에 실행한 명령어 원상복구
INSERT INTO A VALUES(3);
COMMIT;
- 이전 SAVEPOINT 와 이후 SAVEPOINT 의 이름을 동일하게 하면 SAVEPOINT 가 이후 지점으로 덮어쓰기 됨
명령문 | 구분 | 설명 |
트랜잭션 확정 | COMMIT; | DB 트랜잭션 내용 업데이트를 영구적으로확정 |
트랜잭션 취소 | ROLLBACK; | DB 업데이트 오류 발생 시 이전 상태로 되돌림 |
세이브 포인트 지정 | SAVEPOINT 이름; | 특점 지정을 지정 |
세이브 포인트 롤백 | ROLLBACK TO SAVEPOINT 이름; | SAVEPOINT 로 지정한 부분 이후에 발생한 트랜잭션 취소 |
[ 윈도 함수(Window Function) ]
1) 윈도함수의 개념
- 행과 행 간의 관계를 쉽게 정의하기 위해 만든 함수
- DB를 사용한 온라인 분석 처리 용도로 사용하기 위해서 SQL 에 추가된 기능으로 OLAP함수라고도 함
- OLAP(On-line Analytical Processing)
- 의사결정 지원 시스템
- 사용자가 동일한 데이터를 여러 기준을 이용하는 다양한 방식으로 바라보면서 다차원 데이터 분석을 할 수 있도록 도와주는 기술
2) 윈도 함수의 구문
구문 | 설명 |
SELECT 윈도함수명(파라미터) OVER ([ PARTITION BY 컬럼1, ... ] [ ORDER BY 컬럼A, ... ]) FROM 테이블명 |
PARTITION BY 는 선택 항목이며, 순위를 정할 대상 범위의 컬럼을 설정 PARTITION BY 구에는 GROUP BY 구가 가진 집약 기능이 없으며, 이로 인해 레코드가 줄어들지 않음 PARTITION BY 를 통해 구분된 레코드 집합을 윈도라고 함 윈도 함수에는 OVER 문구가 필수적으로 포함 ORDER BY 뒤에는 SORT 컬럼을 입력(어떤 열을 어떤 순서로 순위를 정할지를 지정) |
3) 윈도 함수의 분류
분류 | 설명 |
집계 함수 | 여러 행 또는 테이블 전체 행으로부터 하나의 결괏값을 반환하는 함수 |
순위 함수 | 레코드 순위를 계산하는 함수 RANK, DENSE_RANK, ROW_NUMBER 등 |
행 순서 함수 | 레코드에서 가장 먼저 나오거나 가장 뒤에 나오는 값 이전/이후 값들을 출력하는 함수 FIRST_VALUE, LAST_VALUE, LAG, LEAD 등 |
그룹 내 비율 함수 | 백분율을 보여주거나 행의 순서별 백분율 등 비율과 관련된 통계를 보여주는 함수 PATIO_TO_REPORT, RERCENT_RANK 등 |
- 집계함수
집계 함수 | 설명 |
COUNT | 복수 행의 줄 수를 구하는 함수 |
SUM | 복수 행의 해당 컬럼에 대한 합계를 구하는 함수 |
AVG | 복수 행의 해당 컬럼 간의 평균에 대한 평균을 구하는 함수 |
MAX | 복수 행의 해당 컬럼 중 최댓값을 구하는 함수 |
MIN | 복수 행의 해당 컬럼 중 최솟값을 구하는 함수 |
STDDEV | 복수 행의 해당 컬럼에 대한 표준편차를 구하는 함수 |
VARIANCE | 복수 행의 해당 컬럼에 대한 분산을 구하는 함수 |
- 순위함수
순위 함수 | 설명 |
RANK | 특정 항목(컬럼)에 대한 순위를 구하는 함수 동일 순위의 레코드 존재시 후순위는 넘어감 ex(1위, 1위, 3위, 4위, 4위, 4위 ,7위 ... ) |
DENSE_RANK | 레코드 순위를 계산하는 함수 동일 순위의 레코드 존재시 후순위를 넘어가지 않음 ex(1위, 1위, 2위, 3위, 3위, 3위, 4위 ... ) |
ROW_NUMBER | 레코드의 순위를 계산하는 함수 동일 순위의 값이 존재해도 이와 무관하게 연속 번호를 부여 ex(1위, 2위, 3위, 4위, 5위, 6위, 7위 ... ) 공동 순위 인정 X - OVER( ORDER BY ...) 설정하면 해당 기준으로 공동 순위에서 차등 순위를 배분 - OVER() 로 설정시 DBMS 내부 처리 순서에 의존함 |
- 행 순서 함수
행 순서 함수 | 설명 |
FIRST_VALUE | 파티션별 윈도에서 가장 먼저 나오는 값을 반환하는 함수 오름차순(내림차순) 시 집계 함수의 MIN(MAX) 과 동일한 결과를 출력 |
LAST_VALUE | 파티션별 윈도에서 가장 늦게 나오는 값을 반환하는 함수 오름차훈(내림차순) 시 집계 함수의 MAX(MIN) 와 동일한 결과 출력 |
LAG | 파티션별 윈도에서 이전 로우의 값을 반환하는 함수 |
LEAD | 파티션별 윈도에서 이후 로우의 값을 반환하는 함수 |
- LAG 예시
SELECT 이름, 점수,
LAG(점수) OVER (ORDER BY 점수 DESC) AS 이전_점수
FROM 학생;
학생
이름 | 점수 | 이전_점수 |
민수 | 95 | NULL |
철수 | 90 | 95 |
영희 | 85 | 90 |
민지 | 70 | 85 |
- LEAD 예시
SELECT 이름, 점수,
LEAD(점수) OVER (ORDER BY 점수 DESC) AS 다음_점수
FROM 학생;
학생
이름 | 점수 | 다음_점수 |
민수 | 95 | 90 |
철수 | 90 | 85 |
영희 | 85 | 70 |
민지 | 70 | NULL |
- 그룹 내 비율 함수
그룹 내 비율 함수 | 설명 |
RATIO_TO_PERPORT | 주어진 그룹에 대해 합을 기준으로 각 로우의 상대적 비율을 반환하는 함수 (합계 대비 비율 측정) 결괐값은 0 ~ 1 의 범위 값을 가짐 |
PERCENT_RANK | 주어진 구룹에 대해 제일 먼저 나오는 것을 0으로, 제일 늦게 나오는 것을 1 로 하여, 값이 아닌 행의 순서별 백분율을 구하는 함수 (정렬 기준 상대적 위치 보기) 결과값은 0 ~ 1 범위 값을 가짐 |
- RATIO_TO_PERPORT 예시
매출데이터
부서 | 매출 |
A | 100 |
A | 300 |
A | 600 |
SELECT 부서, 매출,
RATIO_TO_REPORT(매출) OVER (PARTITION BY 부서) AS 매출비율
FROM sales;
부서 | 매출 | 매출비율 |
A | 100 | 0.1 |
A | 300 | 0.3 |
A | 600 | 0.6 |
- PERCENT_RANK 예시
시험점수
이름 | 점수 |
철수 | 70 |
영희 | 80 |
민수 | 90 |
희수 | 100 |
SELECT 이름, 점수,
PERCENT_RANK() OVER (ORDER BY 점수) AS 순위비율
FROM students;
이름 | 점수 | 순위비율 |
철수 | 70 | 0.0 |
영희 | 80 | 0.333 |
민수 | 90 | 0.667 |
희수 | 100 | 1.0 |
4) 윈도 함수 활용
- OLAP 개념
- OLAP 은 사용자가 동일한 데이터를 여러 기준을 이용하는 다양한 방식으로 바라보면서 다차원 데이터 분석을 할 수 있도록 도와주는 의사결정 지원 시스템
- OLAP 연산
연산 | 설명 |
Roll-up | 분석할 항목에 대해 구체적인 데이터로부터 요약된 형태의 테이터로 접근하는 연산 |
Drill-down | 분석할 항목에 대해 요약된 형태의 데이터로부터 구체적인 데이터로 접근하는 연산 |
Slicing | 온라인 분석처리를 위한 자료 구조인 데이터 큐브의 한 조각을 볼 수 있게 해주는 연산 |
Dicing | 고정된 다차원 값에 대한 연산 |
Rivoting | 다차원 분석 테이블인 크로스 체이블에서 차원 변경을 위해 사용되는 연산 |
[ 그룹 함수(Group Function) ]
1) 그룹 합수 개념
- 테이블의 전체 행을 하나 이상의 컬럼을 기준으로 컬럼 값에 따라 그룹화하여 그룹별로 결과를 출력하는 함수
- 소계 침 총계 등을 구하기 위해서 그룹 함수를 사용한다면 단일 DML 만으로도 원하는 작업을 할 수 있음
2) 그룹 함수 유형
- ROLLUP
- 소그룹 간 소계 출력
- 지정된 컬럼의 소계 및 총계를 구하기 위해 하용하는 그룹 함수
- 지정 컬럼의 수보다 하나 더 큰 레벨만큼의 집계 값이 생성
- ROLLUP 의 지정 컬럼은 계층별로 구성되기 때문에 순서가 바뀌면 수행 결과가 바뀌기 때문에 유의해서 사용해야 함
구문 | 설명 |
SELECT 컬럼명1, ..., 집계함수 FROM 테이블명 [ WHERE ... ] GROUP BY [ 컬럼명1, ... ] ROLLUP (그룹화할 열) [ HAVING ... ] [ ORDER BY ... ] |
소계 집계 대상이 되는 컬럼을 ROLLUP 키워드 뒤에 기재 소계 집계 대상이 아닌 경우 GROUP BY 키워드 뒤에 기재 SELECT 뒤에 포함되는 컬럼이 GROUP BY 또는 ROLLUP 키워드 뒤에 기재 되어야 함 ORDER BY 구문을 활용해 계층 내 정렬에 사용 가능 |
- ROLLUP 예제
sales
부서 | 연도 | 매출 |
A | 2023 | 100 |
A | 2024 | 120 |
B | 2023 | 200 |
SELECT 부서, 연도, SUM(매출)
FROM sales
GROUP BY ROLLUP(부서, 연도);
부서 | 연도 | SUM(매출) |
A | 2023 | 100 |
A | 2024 | 120 |
A | NULL | 220 ← A 부서 소계 |
B | 2023 | 200 |
B | NULL | 200 ← B 부서 소계 |
NULL | NULL | 420 ← 전체 총계(== 소계 총계) |
- CUBE
- GROUP BY 항목들과 다차원 소계 출력
- 결합 가능한 모든 값에 대해 다차원 집계를 생성하는 그룹 함수
- 내부적으로 대상 컬럼의 순서를 변경하여 또 한 번의 쿼리를 수행함
- 연산이 많아 시스템에 부담을 준다
- 기준 컬럼부터 우측으로 계층적으로 소계 값을 도출함
구문 | 설명 |
SELECT 컬럼명, ..., 집계 함수 FROM 테이블명 [ WEHRE ... ] GROUP BY [ 컬럼명1, ... ] CUBE(컬럼명A, ... ) [ HAVING ] [ ORDER BY ... ] |
소계 집계 대상이 되는 컬럼을 CUBE 키워드 뒤에 기재 소계 집계 대상이 아닌 경우 GROUP BY 키워드 뒤에 기재 SELECT 뒤에 포함되는 컬럼이 GROUP BY 또는 CUBE 키워드 뒤에 기재되어야 함 ORDRE BY 구문을 활용해 계층 내 정렬에 사용 가능 |
GROUP BY vs ROLLUP vs CUBE 결과 비교
sales
부서 | 연도 | 매출 |
A | 2023 | 100 |
A | 2024 | 120 |
B | 2023 | 90 |
B | 2024 | 80 |
GROUP BY
SELECT 부서, 연도, SUM(매출)
FROM sales
GROUP BY 부서, 연도;
부서 | 연도 | SUM(매출) |
A | 2023 | 100 |
A | 2024 | 120 |
B | 2023 | 90 |
B | 2024 | 80 |
ROLLUP
SELECT 부서, 연도, SUM(매출)
FROM sales
GROUP BY ROLLUP(부서, 연도);
부서 | 연도 | SUM(매출) |
A | 2023 | 100 |
A | 2024 | 120 |
A | NULL | 220 <- A 부서의 소계 |
B | 2023 | 90 |
B | 2024 | 80 |
B | NULL | 170 <- B 부서의 소계 |
NULL | NULL | 390 <- 전체 총계 |
CUBE
SELECT 부서, 연도, SUM(매출)
FROM sales
GROUP BY CUBE(부서, 연도);
부서 | 연도 | SUM(매출) |
A | 2023 | 100 |
A | 2024 | 120 |
A | NULL | 220 <- A 부서 소계 |
B | 2023 | 90 |
B | 2024 | 80 |
B | NULL | 170 <- B 부서 소계 |
NULL | 2023 | 190 <- 2023 연도 소계 |
NULL | 2024 | 200 <- 2024 연도 소계 |
NULL | NULL | 390 <- 전체 총계 |
[ 오류 처리(Error Handling) ]
1) 오류 처리의 개념
- 코드상의 오류나 프로시저 실행 시 예외나 에러가 발생했을 때, 문제를 해결하고 의미 있는 에러 메시지를 부여하는 과정
2) 핸들러 선언 구문
DECLARE (1) HANDLER FOR (2) (3); |
|
구문 요소 | 설명 |
(1) 액션 | 해당 오류 발생 시 핸들러 처리 방법 ( 특정 쿼리에서 오류 발생시 다음 쿼리를 계속 할 것인지, 종료 할 것인지에 대한 동작 설정) COUNINUE - (3) 명령어 부분을 계속 실행 EXIT - (3) 명령어 부분을 한 번 실행 ( 이 한 번의 쿼리에서 오류 발생시 로직 종료 ) |
(2) 상태값 | 핸들러가 수행되기 위한 에러코드 SQLWARNING - 에러가 아닌 경고가 발생 NOTFOUND - 다음 레코드를 가져오지 못할 때 SQLEXCEPTION - 에러가 발생 (2) 상태값이 NOTFOUND 인 경우, 쿼리 실행시 NOTFOUND 에러가 발생하면 해당 핸들러 실행 |
(3) 명령문 | 핸들러가 호출될 때 실행되는 명령 |
- 핸들러 선언을 통한 오류처리 사례
사례 | 설명 |
DECLARE CONTINUE HANLER FOR SQLEXCEPTION SET TEST_ERROR = 5; |
에러가 발생시 TEST_ERROR 변수의 값을 5 로 설정하는 핸들러 |
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT '에러 발생, ROLLBACK 수행'; END; |
어떤 에러가 발생하면, 이전 연산자로 되돌아 간 후 에러 메시지가 발생하는 핸들러 에러 핸들러 구문(BEGIN ~ END) 이후 시작된 트랜잭션 과정에서 쿼리 성공시 SAVEPOINT 를 설정했다면 해당 SP 지점으로 트랜잭션들을 취소하고, SP 가 없다면 쿼리 시작 부분까지 전부 취소한다 |
DECLARE CONTINUE HANDLER FOR NOTFOUND SET NO_ROW_TEST = 5; |
만약 더이산 가져올 행이 없다면 NO_ROW_TEST 변수의 값을 5 로 설정하고 계속 실행하는 의미를 가지를 핸들러 |