그룹 함수의 개념

- 테이블의 전체 행을 하나 이상의 칼럼을 기준으로 그룹화하여 그룹별로 결과를 출력하는 함수

- 그룹 함수는 통계적인 결과를 출력하는데 자주 사용

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]

 

– GROUP BY : 전체행을 group_by_expression을 기준으로 그룹화

– HAVING : GROUP BY 절에 의해 생성된 그룹별 로조건 부여

 

종류 의미 사용 예
COUNT 행의 개수 출력 COUNT ({* | [DISTINCT | ALL] expr})
MAX NULL을 제외한 모든 행에서 최대 값  
MIN NULL을 제외한 모든 행에서 최소 값  
SUM NULL을 제외한 모든 행의 합 SUM([DISTINCT | ALL] expr)
AVG NULL을 제외한 모든 행의 평균 값 AVG ([DISTINCT | ALL] expr)
STDDEV NULL을 제외한 모든 행의 표준편차  
VARIANCE NULL을 제외한 모든 행의 분산 값  
GROUPING 해당 칼럼이 그룹에 사용되었는지 여부를 1 또는 0으로 반환  
GROUPING SETS 한 번의 질의로 여러 개의 그룹화 기능  

- '*'은 NULL을 포함한 모든 행의 개수

- DISTINCT는 중복되는 값을 제외한 행의 개수

- ALL은 중복되는 값을 포함한 행의 개수, 기본값은 ALL

- expr 인수에서 사용 가능한 데이터 타입은 CHAR, VARCHAR2, NUMBER, DATE타입

 

 

데이터 그룹 생성

– 특정 칼럼 값을 기준으로 테이블의 전체 행을 그룹별로 나누기 위한 절

– 예를 들어, 교수 테이블에서 소속 학과별이나 직급별로 평균 급여를 구하는 경우

– GROUP BY 절에 명시되지 않은 칼럼은 그룹 함수와 함께 사용할 수 없음

 

GROUP BY 절 사용할 때 적용되는 규칙

– 그룹핑 전에 WHERE 절을 사용하여 그룹 대상 집합을 먼저 선택

– GROUP BY 절에는 반드시 칼럼 이름을 포함해야 하며 칼럼 별명은 사용할 수 없음

- 그룹별 출력 순서는 오름차순으로 정렬

- SELECT절에서 나열된 칼럼 이름이나 표현식은 GROUP BY 절에서 반드시 명시

- GROUP BY절에서 명시한 칼럼 이름은 SELECT절에서 명시하지 않아도 된다.

 

다중 칼럼을 이용한 그룹핑

– 하나이상의 칼럼을 사용하 여그룹을 나누고, 그룹 별로 다시 서브그룹을 나눔

- 전체 교수를 학과 별로 먼저 그룹핑 한 다음, 학과별 교수를 직급 별로 다시 그룹핑하는 경우

 

ROLLUP 연산자

– GROUP BY 절의 그룹 조건에 따라 전체행을 그룹화하고 각 그룹에 대해 부분합을 구하는 연산자

– GROUP BY 절에 칼럼의 수가 n개이면 ROLLUP 그룹핑 조합은 n+1개

SELECT deptno, grade, COUNT(*), ROUND(AVG(weight))
FROM student
GROUP BY deptno, grade;

SELECT에서 조회 FROM에서 테이블명 입력 GROUPBY에서 deptno와 grade순으로 정렬

 

CUBE 연산자

– ROLLUP에 의한 그룹 결과와 GROUP BY 절에 기술된 조건에 따라 그룹 조합을 만드는 연산자

– GROUP BY 절에 칼럼의 수가 n개이면 CUBE 그룹핑 조합은 2n개

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY [ROLLUP | CUBE] group_by_expression]
[HAVING group_condition]

 

 

 

GROUPING 함수

– 인수로 지정된 칼럼이 ROLLUP이나 CUBE 연산자로 생성된 그룹 조합에서 사용되었는지 여부를 1 또는 0으로 반환

– 사용하면 0, 아니면 1

SELECT column, group_function(column), GROUPING(column)
FROM table
[GROUP BY [ROLLUP | CUBE] group_by_expression]
		  [GROUPING SET(column, column...), ...]
[HAVING group_condition]

GROUPING SETS : 괄호를 사용하여 복수 개의 그룹 조건 지정

 

 

HAVING 절

– GROUP BY 절에 의해 생성된 그룹을 대상으로 조건을 적용

HAVING 절의 실행 과정

–테이블에서 WHERE 절에 의해조건을만족하는 행 집합을 선택

–행 집합을 GROUP BY 절에의해 그룹핑

- HAVING절에 의해 조건을 만족하는 그룹을 선택

SELECT column, group_function(column), GROUPING(column)
FROM table
[GROUP BY [ROLLUP | CUBE] group_by_expression]
[HAVING group_condition]
[ORDER BY column]

 

HAVING과 WHERE의 차이

–WHERE 절의검색조건을먼저실행하는방법이효율적
•그룹화하는 행 집합을 줄여서 내부 정렬 시간을 단축
•SQL 처리성능향상

데이터베이스에 저장되는 데이터는 문자, 숫자, 날짜, 이미지 등과 같은 다양한 형식으로 표현

실무에서 칼럼에 대한 데이터 타입이나 길이의 결정은 데이타베이스 설계 단계에서 신중하게 고려해야하는 중요한 사항

데이터베이스 설계 단계에서 잘못 선정된 데이터 타입은 응용프로그램 개발을 어렵게 하거나 성능을 저하시키는 요인이 됨

데이터 타입의 종류 의미
CHAR(size) size 크기의 고정 길이 문자 데이터 타입
최대크기 : 2,000 바이트
최소크기 : 1 바이트
VARCHAR2(size) size 크기의 가변 길이 문자 데이터 타입
최대크기 : 4,000 바이트
최소크기 : 1 바이트
NVARCHAR2(size) 국가별 문자 집합에 따른 size크기의 문자 또는 바이트의 가변길이 문자 데이터 타입
최대크기 : 4,000 바이트
최소크기 : 1바이트
NUMBER(p,s) 정밀도(p)와 스케일(s)로 표현되는 숫자 데이터 타입
p : 1 ~ 38
s : -84 ~ 127
DATE 날짜 형식을 저장하기 위한 데이터 타입

 

 

데이터 타입의 종류 의미
ROWID 테이블내 행의 고유 주소를 가지는 64진수 문자 타입
행당 6바이트(제한된 ROWID) 또는 10 바이트(확장된 ROWID)
BLOB 대용량의 바이너리 데이터를 저장하기 위한 데이터 타입
최대크기 : 4GB
CLOB 대용량의 텍스트 데이터를 저장하기 위한 데이터 타입
최대크기 : 4GB
BFILE 대용량의 바이너리 데이터를 파일 형태로 저장하기 위한 데이터 타입
최대크기 : 4GB
TIMESTAMP(n) DATE데이터 타입의 확장된 형태
n은 milli second 자리수로 최대 9자리까지 표현 가능
INTERVAL YEAR TO MONTH 년과 월을 이용하여 기간을 저장
INTERVAL DAY TO SECOND 일, 시, 분, 초를 이용하여 기간을 저장
두 날짜 값의 정확한 차이를 표현하는데 유용

 

 

CHAR 데이터 타입

개요

- 고정 길이의 문자열을 저장하며 최대 2,000바이트까지 저장 가능

- 지정된 길이보다 짧은 데이터가 입력되는 경우, 나머지 공간은 공백으로 채워짐

특징

- 데이터 입력시 사용자가 데이터를 입력하지 않으면 NULL 이 입력

- 지정된 길이보다 긴 데이터가 입력되면 오류 발생

- 주소 데이터와 같은 편차가 심한 데이터를 입력할 때 사용하면 저장 공간이 낭비될 수 있음

- 주민등록번호와 같이 길이가 일정하거나 비슷핚 경우에 사용하는 것이 좋음

 

VARCHAR2 데이터 타입

개요

- 가변 길이의 문자열을 저장하기 위해 사용하는 데이터 타입

- 최대 4,000 바이트 저장 가능

- 지정된 길이보다 짧은 문자열이 입력되면 뒷부분은 NULL로 처리되어 저장공간을 낭비하지 않음

특징

- 데이터 입력시 사용자가 값을 입력하지 않으면 NULL 이 입력

- 지정된 길이보다 긴 데이터가 입력되면 데이터가 입력되지 않고 오류 발생

- 입력될 데이터의 편차가 심하거나 NULL 이 많이 입력되는 경우에 사용하는 것이 효율적

- 실무에서는 CHAR 데이터 타입보다 VARCHAR2 를 많이 사용

 

 

문자형 데이터 타입과 문자 상수 비교 방법

비교 방법

- 문자 상수는 문자 데이터 타입으로 내부 변환되어 문자 타입의 비교 방식에 의해 처리

주의

- 동일한 문자 상수를 비교하는 경우에도 비교 대상 칼럼의 데이터 타입에 따라 비교 결과가 달라질 수 있음

문자 상수와 CHAR 데이터 타입 비교

- 문자 상수를 CHAR 타입으로 변환한 후, CHAR와 CHAR 비교 방식 으로 비교

문자 상수와 VARCHAR2 데이터 타입 비교

- 문자 상수를 VARCHAR2 타입으로 변환한 후 VARCHAR2와 VARCHAR2 비교 방식에 의해 비교

 

 

NUMBER 데이터 타입

개요

숫자를 저장하며, 가변 길이 데이터 타입으로 최대 38자리까지 저장 가능

저장 가능한 숫자의 범위 : 1.0X10^-130 ~ 96.9...X10^125

소수는 NUMBER(precision, scale) 형식으로 입력

- 지정된 자리 이하에서 반올림되어 저장

- precision : 소수점을 포함하는 전체 자리 수

- scale : 소수점이하 자리 수

- precision을 지정하지 않고 숫자를 입력하는 경우

 입력되는 숫자 값의 크기만큼 저장공간이 할당됨

- scale을 지정하지 않고 소수점을 입력하는 경우

 소수점 이하는 반올림되어 정수 값만 저장됨

 

DATE 데이터 타입

개요

- 세기, 년도, 월, 일, 시간, 분, 초의 날짜와 시간 정보를 저장하기 위한 데이터 타입

- 7비트의 고정길이 필드에 저장

- 날짜나 시간에 대한 연산이나 이력 정보를 관리하기 위해 사용

- 퍼스널 오라클의 기본 날짜 형식 : YY/MM/DD 형식

기능

- TO_DATE함수 사용 가능

    문자 형태로 저장된 데이터를 날짜 형식으로 변환

- SYSDATE함수 사용 가능

    시스템의 현재 날짜와 시간을 반환하는 함수

주의 

- 날짜 데이터 입력시 월, 일을 지정하지 않으면 입력되는 시점을 기 준으로 해당 월과 1일이 입력, 시간을 지정하지 않으면 12:00:00 로 입력

- 시간 정보가 입력된 경우에는 '=' 비교시 시간 정보도 함께 비교

 

LOB데이터 타입

개요

- 텍스트, 그래픽, 이미지, 동영상, 사운드 등과 같이 구조화되지 않은 대용량의 텍스트나 멀티미디어 데이터를 저장하기 위한 데이터 타입

- 최대 4GB까지 저장

종류

- BLOB

 그래픽 이미지, 동영상, 사운드와 같이 구조화되지 않은 바이너리 데이터를 저장하기 위해 사용

- CLOB

 e-Book, html 과 같은 대용량의 텍스트 데이터 저장

- BFILE

 바이너리 데이터를 파일 형태로 저장, 읽기 전용이므로 내용 변경 불가능

 

ROWID 데이터 타입

개요

테이블에서 행의 위치를 지정하는 논리적인 주소 값

데이타베이스 전체에서 중복되지 않는 유일한 값

테이블에 새로운 행이 삽입되면 테이블 내부에서 의사 칼럼 (pseudo column) 형태로 자동적으로 생성

특정 레코드를 랜덤 액세스하기 위한 가장 빠른 방법

ROWID 는 데이터베이스에 저장되지 않음

SELECT 명령문으로 조회는 가능하나, INSERT, UPDATE와 같은 DML 문으로 임의적으로 변경 불가능

 

형식

데이터 객체 번호(data object number)

- 데이터 객체 생성 시 할당

상대적 파일 번호(relative file number)

- 데이터가 저장되는 물리적인 데이터 파일 번호(10bit)

블록 번호( block number)

- 데이터 파일내에서 행을 포함하는 블록 위치(22bit)

행 번호(row number)

- 블록 헤더내에서 행 디렉토리 슬롯의 위치(16bit)

 

 

 

참조변수

Pseudo-column

참조만 될 뿐 데이터베이스에 따로 저장되지 않음

Oracle의 Pseudo-column은 테이블의 실제적인 컬럼은 아니므로 테이블의 describe을 통해서는 보이지 않지만 매우 유용하게 사용

SELECT ROWID, STUDNO FROM STUDENT;

 

TIMESTAMP 데이터 타입

개요

- DATE 타입의 확장된 형태로서 백만분의 일초 단위까지 표현 가 능

- milli second 의 기본 값은 6자리, 최대 9자리까지 사용 가능

종류

- TIMESTAMP WITH TIME ZONE

    TIMESTAMP 데이터 타입에 지역 시간대(time zone)를 함께 저장

    지역 시간대는 세계 표준시간대(universal time)의 표준 시간을 기준 으로 현 지역 시간대를 환산한 것

- TIMESTAMP WITH LOCAL TIME ZONE

    사용자 데이터베이스의 지역 시간대를 따름

    • 지역 시간대를 다른 곳으로 옮겨도 TIME ZONE 를 변경할 필요는 없음

CREATE TABLE EX_TIME
(ID NUMBER(2),
BASICTIME TIMESTAMP,
STANDARDTIME TIMESTAMP WITH TIME ZONE,
LOCALTIME TIMESTAMP WITH LOCAL TIME ZONE);

 

 

DUAL 테이블

DUAL테이블은 데이터 딕셔너리와 함께 Oracle에 의해 자동으로 생성되는 테이블 입니다.

    DUAL테이블은 사용자 SYS의 스키마에 있지만 모든 사용자는 DUAL이라는 이름으로 엑세스 할 수 있습니다.

    DUAL테이블은 VARCHAR2(1)으로 정의된 DUMMY라는 하나의 열이 있으며 값을 가지는 하나의 행도 포함되어 있습니다. 

    DUAL테이블은 사용자가 계산이나 사용자 함수등을 실행하고자 할 경우에 유용 합니다. 

 

 

 

데이터 타입의 결정법

1. 응용 프로그램 개발 시 오류 감소

2. SQL 명령문의 검색 성능에 영향(index)

3. 문자형 데이터

    데이터의 길이가 가변인지, 고정인지 고려

4. 데이터가 숫자인 경우

    숫자 데이터 타입 또는 문자형 데이터 타입으로 지정할지 고려

5. 데이터가 날짜 타입인 경우

    문자 데이터 타입으로 지정하는 편이 효율적

실습용 데이터

 

실습용 데이터 작성

학생 테이블 인스턴스 & 예제 데이터 칼럼이름 데이터 타입 key type NN/ Unique FK tabel FK column 설명 STUDNO NUMBER(5) PK NN,U 학번 NAME VARCHAR2(10) NN 이름 USERID VARCHAR2(10) 사용자 아이디 GRADE VA..

codeahn.tistory.com

테이블 이름 확인

- 현재 접속한 데이터베이스 계정에 생성된 모든 테이블 이름을 확인

SELECT * 
FROM TAB;

테이블 구조 확인

DESC TBL_NAME;

DESC STUDENT;

SQL 명령문의 표준형식

SELECT [DISTINCT] *
FROM TABLE
[WHERE CONDITION]
[GROUP BY GROUP_BY_EXPRESSION]
[HAVING GROUP_CONDITION]
[ORDER BY COLUMN];

DISTINCT는 중복 제거

WHERE은 조건

GROUP BY는 그룹으로 묶음(행이줄어듦)

HAVING GROUP BY절에 의해 생성된 그룹을 대상으로 조건을 적용

ORDER BY 칼럼이나 표현식을 기준으로 출력 결과를 정렬할 때 사용

 

칼럼에 대한 별명 부여

- 칼럼 이름과 별명 사이에 공백을 추가

- 칼럼 이름과 별명 사이에 AS 키워드를 추가

- 큰 따옴표를 사용

    1.칼럼 이름과 별명 사이에 공백을 추가하는 경우

    2. 특수문자를 추가하거나 대소문자를 구분하는 경우

SELECT DNAME DEPT_NAME, DEPTNO AS DN
FROM DEPARTMENT;

합성 연산자(||) 사용

- 하나의 칼럼과 달느 칼럼, 산술 표현식 또는 상수 값과 연결하여 하나의 칼럼처럼 출력할 경우에 사용

 

산술 연산자(+,-,*,/)

- 칼럼 값에 산술 연산자를 적용하여 계산된 결과를 출력할 수 있는 기능을 제공

- 숫자 또는 날짜 타입(데이터 베이스 특징)에만 사용가능

- 수학에서 산술 연산자의 우선순위와 동일, 괄호를 사용하여 우선순위 변경가능

 

 

'오라클SQL > 데이터베이스' 카테고리의 다른 글

SQL PLUS  (0) 2021.08.30
실습용 데이터 작성  (0) 2021.08.30

+ Recent posts