함수란
-
함수
- 미리 정의된 기능을 통해 데이터를 좀 더 편리하게 조작할 수 있도록 도와줌
-
함수를 사용하는 목적
- 데이터 값을 계산하거나 조작함
(단일 행 함수 : 한 번에 하나의 데이터를 처리하는 함수)
- 행의 그룹에 대해 계산하거나 요약함
(그룹함수 : 여러 건의 데이터를 동시에 처리하여 해당 그룹에 해당하는 결과를 반환
→ GROUP BY와 주로 쓰임)
- 열의 데이터 타입을 변환함 (날짜와 숫자 등 데이터 타입을 상호 변환)
단일 행 함수 : 데이터 값을 하나씩 계산하고 조작하기
- 데이터 타입의 종류
저장 데이터 | 데이터 타입 | 설명 |
---|
문자 | CHAR(n) | n 크기만큼 고정 길이의 문자 타입을 저장 최대 2000byte까지 저장 가능 |
문자 | VARCHAR2(n) | n 크기만큼 가변 길이의 문자 타입을 저장 최대 4000byte까지 저장 가능 |
숫자 | NUMBER(p, s) | 숫자 타입을 저장 (p : 정수 자릿수, s : 소수 자릿수) |
날짜 | DATE | 날짜 타입을 저장 9999년 12월 31일까지 저장 가능 |
- 단일 행 함수의 종류
종류 | 설명 |
---|
문자 타입 함수 | 문자를 입력받아 문자와 숫자를 반환한다. |
숫자 타입 함수 | 숫자를 입력받아 숫자를 반환한다. |
날짜 타입 함수 | 날짜에 대해 연산한다. 숫자를 반환하는 MONTHS_BETWEEN 함수를 제외한 모든 날짜 타입 함수는 날짜 값을 반환한다. |
변환 타입 함수 | 임의의 데이터 타입의 값을 다른 데이터 값으로 변환한다. |
일반 함수 | 그 외 NVL, DECODE, CASE WHEN, 순위 함수 등 |
- 문자 함수의 종류
함수 | 설명 | 예 | 결과 |
---|
LOWER | 값을 소문자로 변환 | LOWER(’ABCD’) | abcd |
UPPER | 값을 대문자로 변환 | UPPER(’abcd’) | ABCD |
INITCAP | 첫 번째 글자만 대문자로 변환 | INITCAP(’abcd’) | Abcd |
SUBSTR | 문자열 중 일부분을 선택 | SUBSTR(’ABC’, 1, 2) | AB |
REPLACE | 특정 문자열을 찾아 바꿈 예를 들어 A를 찾아 E로 변환 | REPLACE(’AB’, ‘A’, ‘E’) | EB |
CONCAT | 두 문자열을 연결 (|| 과 같음) | CONCAT(’A’, ‘B’) | AB |
LENGTH | 문자열의 길이를 구함 | LENGTH(’AB’) | 2 |
INSTR | 명명된 문자의 위치를 구함 | INSTR(’ABCD’, ‘D’) | 4 |
LPAD | 왼쪽부터 특정 문자로 자리를 채움 | LPAD(’ABCD”, 6, ‘*’) | **ABCD |
RPAD | 오른쪽부터 특정 문자로 자리를 채움 | RPAD(’ABCD’, 6, ‘*’) | ABCD** |
LTRIM | 주어진 문자열의 왼쪽 문자를 지움 | LTRIM(’ABCD’, ‘AB’) | CD |
RTRIM | 주어진 문자열의 오른쪽 문자를 지움 | RTRIM(’ABCD’, ‘CD’) | AB |
- employees 테이블에서 last_name을 소문자와 대문자로 각각 출력하고, email의 첫 번째 문자는 대문자로 출력하기
SELECT last_name,
LOWER(last_name) LOWER적용,
UPPER(last_name) UPPER적용,
email,
INITCAP(email) INITCAP적용
FROM employees;
| LAST_NAME | LOWER적용 | UPPER적용 | EMAIL | INITCAP적용 |
---|
1 | Abel | abel | ABEL | EABEL | Eabel |
2 | Ande | ande | ANDE | SANDE | Sande |
-
지정한 길이만큼 문자열 추출하기
SUBSTR('문자열' or 열 이름, 시작 위치, 길이)
-
employees 테이블에서 job_id 데이터 값의 첫째 자리부터 시작해서 두 개의 문자를 출력하기
SELECT job_id, SUBSTR(job_id, 1, 2) 적용결과
FROM employees;
| JOB_ID | 적용결과 |
---|
1 | AC_ACCOUNT | AC |
2 | AD_MGR | AD |
-
특정 문자를 찾아 바꾸기
REPLACE('문자열' or 열 이름, '바꾸려는 문자열', '바뀔 문자열')
-
employees 테이블에서 job_id 문자열 값이 ACCOUNT면 ACCNT로 출력하기
SELECT job_id, REPLACE(job_ic, 'ACCOUNT', 'ACCNT') 적용결과
FROM employees;
| JOB_ID | 적용결과 |
---|
1 | AC_ACCOUNT | AC_ACCNT |
2 | AC_MGR | AC_MGR |
-
특정 문자로 자릿수 채우기
LPAD('문자열' or 열 이름, 만들어질 자릿수, '채워질 문자')
-
employees 테이블에서 first_name에 대해 12자리의 문자열 자리를 만들되 first_name의 데이터 값이 12자리보다 작으면 왼쪽부터 *을 채워서 출력하기
SELECT first_name, LPAD(first_name, 12, '*') LPAD적용결과
FROM employees;
| FIRST_NAME | LPAD적용결과 |
---|
1 | Elen | ****Elen |
2 | David | ***David |
- employees 테이블에서 job_id의 데이터 값에 대해 왼쪽 방향부터 ‘F’ 문자를 만나면 삭제하고 또 오른쪽 방향부터 ‘T’ 문자를 만나면 삭제하기
SELECT job_id,
LTRIM(job_id, 'F') LTRIM적용결과,
RTRIM(job_id, 'T') RTRIM적용결과
FROM employees;
JOB_ID | LTRIM적용결과 | RTRIM적용결과 |
---|
AC_ACCOUNT | AC_ACCOUNT | AC_ACCOUN |
FI_ACCOUNT | I_ACCOUNT | FI_ACCOUN |
- employees 테이블에서 salary를 30일로 나눈 후 나눈 값의 소수점 첫째 자리, 소수점 둘째 자리, 정수 첫째 자리에서 반올림한 값을 출력하기
SELECT salary,
salary/30 일급,
ROUND(salary / 30, 0) 적용결과0,
ROUND(salary / 30, 1) 적용결과1,
ROUND(salary / 30, -1) 적용결과MINUS1
FROM employees;
| SALARY | 일급 | 적용결과0 | 적용결과1 | 적용결과MINUS1 |
---|
1 | 17000 | 566.6666667 | 567 | 566.7 | 570 |
- employee 테이블에서 salary를 30일로 나누고 나눈 값의 소수점 첫째 자리, 소수점 둘째 자리, 정수 첫째 자리에서 절삭하여 출력하기
SELECT salary,
salary / 30 일급,
TRUNC(salary/30, 0) 적용결과0
TRUNC(salary/30, 1) 적용결과1
TRUNC(salary/30, -1) 적용결과MINUS1
FROM employees;
| SALARY | 일급 | 적용결과0 | 적용결과1 | 적용결과MINUS1 |
---|
1 | 17000 | 566.666666 | 566 | 566.6 | 560 |
-
날짜 연산 규칙
-
날짜에 숫자를 더하거나 빼면 날짜 결과를 출력함
-
날짜에서 날짜를 배면 두 날짜 사이의 일수가 출력됨
-
날짜에 시간을 더하거나 빼려면 시간을 24로 나누어서 더하거나 뺌
날짜 연산 | 설명 | 반환값 |
---|
Date + Num | 날짜에 일수를 더함 | Date |
Date - Num | 날짜에 일수를 뺌 | Date |
Date - Date | 날짜에서 날짜를 뺌 | 일수 |
Date + Number / 24 | 날짜에 시간을 더할 때는 시간을 24로 나누어서 날짜에 더함- | Date |
-
오늘 날짜와 시간, 오늘 날짜에서 1을 더한 값, 1을 뺀 값, 2017년 12월 2일에서 2017년 12월 1일을 뺀 값
SELECT TO_CHAR (SYSDATE, 'YY/MM/DD/HH24:MI') 오늘날짜,
SYSDATE + 1 더하기1,
SYSDATE - 1 빼기1,
TO_DATE('20171202') - TO_DATE('20171220') 날짜빼기,
SYSDATE + 13/24 시간더하기
FROM DUAL;
| 오늘날짜 | 더하기1 | 빼기1 | 날짜빼기 | 시간더하기 |
---|
1 | 17/10/04/11:00 | 17/10/05 | 17/10/03 | 1 | 17/10/05 |
-
날짜 함수의 종류
날짜 함수 | 설명 | 예 | 결과 |
---|
MONTHS_BLETWEEN | 두 날짜 사이의 월 수를 계산 | MONTHS_BETWEEN(SYSDATE, HIRE_DATE) | 171.758 |
ADD_MONTHS | 월을 날짜에 더한다 | ADD_MONTHS(HIRE_DATE, 5) | 03/11/17 |
NEXT_DAY | 명시된 날짜부터 돌아오는 요일에 대한 날짜를 출력한다 (SUNDAY:1, MONDAY:2 …) | NEXT_DAY(HIRE_DATE, 1) | 03/06/22 |
LAST_DAY | 월의 마지막 날을 계산 | LAST_DAY(HIRE_DATE) | 03/06/30 |
ROUND | 날짜를 가장 가까운 연도 또는 월로 반올림 | ROUND(HIRE_DATE, ‘MONTH’) | 03/07/01 |
TRUNC | 날짜를 가장 가까운 연도 또는 월로 절삭 | TRUNC(HIRE_DATE, ‘MONTH’) | 03/06/01 |
-
두 날짜 사이의 개월 수 계산하기
MONTHS_BETWEEN(날짜, 날짜)
-
employees 테이블에서 department_id가 100인 직원에 대해 오늘 날짜, hire_date, 오늘 날짜와 hire_date 사이의 개월 수를 출력하기
SELECT SYSDATE, hire_date, MONTHS_BETWEEN(SYSDATE, hire_date) 적용결과
FROM employees
WHERE department_id = 100;
| SYSDATE | HIRE_DATE | 적용결과 |
---|
1 | 17/10/04 | 02/08/17 | 181.599152 |
2 | 17/10/04 | 02/08/16 | 181.631411 |
-
월에 날짜 더하기
ADD_MONTHS(날짜, 숫자)
-
employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date에 3개월을 더한 값, hire_date에 3개월을 뺀 값을 출력하기
SELECT hire_date,
ADD_MONTHS(hire_date, 3) 더하기_적용결과,
ADD_MONTHS(hire_date, -3) 빼기_적용결과
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
| HIRE_DATE | 더하기_적용결과 | 빼기_적용결과 |
---|
1 | 03/06/17 | 03/09/17 | 03/03/17 |
2 | 05/09/21 | 05/12/21 | 05/06/21 |
- 돌아오는 요일의 날짜 계산하기
NEXT_DAY(날짜, '요일' or 숫자)
-
employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date에서 가장 가까운 금요일의 날짜가 언제인지 문자로 지정해서 출력하고, 숫자로도 지정해서 출력하기
SELECT hire_date,
NEXT_DAY(hire_date, '금요일') 적용결과_문자지정,
NEXT_DAY(hire_date, 6) 적용결과_숫자지정,
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
| HIRE_DATE | 적용결과_문자지정 | 적용결과_숫자지정 |
---|
1 | 03/06/17 | 03/06/20 | 03/06/20 |
2 | 05/09/21 | 05/09/23 | 05/09/23 |
-
돌아오는 월의 마지막 날짜 계산하기
LAST_DAY (날짜)
-
employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date를 기준으로 해당 월의 마지막 날짜를 출력하기
SELECT hire_date,
LAST_DAY(hire_date) 적용결과
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
| HIRE_DATE | 적용결과 |
---|
1 | 03/06/17 | 03/06/30 |
2 | 01/01/13 | 01/01/31 |
- employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date에 대해 월 기준 반올림, 연 기준 반올림, 월 기준 절삭, 연 기준 절삭을 적용하여 출력하기
SELECT hire_date,
ROUND(hire_date, 'MONTH') 적용결과_ROUND_M,
ROUND(hire_date, 'YEAR') 적용결과_ROUND_Y,
TRUNC(hire_date, 'MONTH') 적용결과_TRUNC_M,
TRUNC(hire_date, 'YEAR') 적용결과_TRUNC_Y
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
| HIRE_DATE | 적용결과_ROUND_M | 적용결과_ROUND_Y | 적용결과_TRUNC_M | 적용결과_TRUNC_Y |
---|
1 | 03/06/17 | 03/07/01 | 03/01/01 | 03/06/01 | 03/01/01 |
2 | 05/09/21 | 05/10/01 | 06/01/01 | 05/09/01 | 05/01/01 |
- 변환 함수
- 오라클 데이터베이스 시스템은 각 열에 대해 데이터 타입을 규정하고 있음
따라서 SQL 문을 실행 하기 위해 데이터 타입을 변환해야 할 때가 있음
→ 이럴 때 쓰는 게 변환 함수!
데이터 타입 변환은 암시적 변환(시스템에 의해 자동으로 변경)과 명시적 변환(수동으로 변경)이 있음
- 자동 데이터 타입 변환 유형
FROM | TO |
---|
VARCHAR2 혹은 CHAR | NUMBER(숫자) |
VARCHAR2 혹은 CHAR | DATE(날짜) |
NUMBER | VARCHAR2(문자) |
DATE | VARCHAR2(문자) |
- 예제
SELECT 1+'2'
FROM DUAL;
- ‘2’는 작은따옴표로 묶여 있으므로 숫자가 아닌 문자임
- 그럼에도 불구하고 결과는 3이라고 바르게 연산되어 출력됨
- 수동 데이터 타입 변환 함수
함수 | 설명 |
---|
TO_CHAR | 숫자, 문자, 날짜 값을 지정 형식의 VARCHAR2 타입으로 변환 |
TO_NUMBER | 문자를 숫자 타입으로 변환 |
TO_DATE | 날짜를 나타내는 문자열을 지정 형식의 날짜 타입으로 변환 |
- 예제
SELECT TO_CHAR(SYSDATE, 'YY'),
TO_CHAR(SYSDATE, 'YYYY'),
TO_CHAR(SYSDATE, 'MM'),
TO_CHAR(SYSDATE, 'MON'),
TO_CHAR(SYSDATE, 'YYYYMMDD') 응용적용1,
TO_CHAR(TO_DATE('20171008'), 'YYYYMMDD') 응용적용2
FROM dual;
| TO_CHAR(SYSDATE, 'YY') | TO_CHAR(SYSDATE, 'YYYY') | TO_CHAR(SYSDATE, 'MM') | TO_CHAR(SYSDATE, 'MON’) | 응용적용1 | 응용적용2 |
---|
1 | 17 | 2017 | 10 | 10월 | 20171007 | 20171008 |
- 시간 지정 형식
지정 형식 | 설명 |
---|
AM or PM | 오전 또는 오후 표시 |
HH / HH12 or HH24 | 시간 표현(1~12시 또는 0~23시) |
MI | 분(0~59) |
SS | 초(0~59) |
SELECT TO_CHAR(SYSDATE, 'HH:MI:SS PM') 시간형식,
TO_CHAR(SYSDATE, 'YYYY/MM/DD HH:MI:SS PM') 날짜와시간조합
FROM dual;
| 시간형식 | 날짜와시간조합 |
---|
1 | 07:52:09 오후 | 2017/10/08 07:52:09 오후 |
- 기타 형식
요소 | 설명 |
---|
/, ., - | 사용 문자를 출력 결과에 표현 |
“문자” | 큰따옴표 안의 문자를 출력 결과에 표현 |
- 예시
SELECT TO_CHAR(SYSDATE, 'HH-MI-SI PM') 시간형식,
TO_CHAR(SYSDATE, ' "날짜:" YYYY/MM/DD "시각:" HH:MI:SS PM') 날짜와시각표현
FROM dual;
| 시간형식 | 날짜와시각표현 |
---|
1 | 08-06-31 | 날짜:2017/10/08 시각:08:06:31 오 |
- 숫자 지정 형식
지정 형식 | 설명 | 예 | 결과 |
---|
9 | 9로 출력 자릿수 지정 | TO_CHAR(salary, ‘99999999’) | 24000 |
0 | 자릿수만큼 0을 출력 | TO_CHAR(salary, ‘09999999’) | 00024000 |
$ | 달러 기호 | TO_CHAR(salary, ‘$9999999’) | $24,000 |
L | 지역 화폐 기호(원) | TO_CHAR(salary, ‘L9999999’) | \24,000 |
. | 명시한 위치에 소수점 | TO_CHAR(salary, ‘999999.99’) | 24000.00 |
, | 명시한 위치에 쉼표 | TO_CHAR(salary, ‘9,999,999’) | 24,000 |
- 날짜를 나타내는 문자열을 명시된 날짜로 변환
TO_DATE(문자열, '지정 형식')
- employees 테이블에서 first_name, last_name, department_id, salary를 출력하되 department_id가 60인 경우에는 급여를 10% 인상한 값을 계산하여 출력하고 나머지 경우에는 원래의 값을 출력하기 그리고 department_id가 60인 경우에는 ‘10% 인상’을 출력하고 나머지 경우에는 ‘미인상’을 출력하기
SELECT first_name,
last_name,
department_id,
salary 원래급여,
DECODE(department_id, 60, salary*1.1, salary) 조정된급여,
DECODE(department_id, 60, '10%인상', '미인상') 인상여부
FROM employees;
| FIRST_NAME | LAST_NAME | DEPARTMENT_ID | 원래급여 | 조정된급여 | 인상여부 |
---|
1 | Steven | King | 90 | 24000 | 24000 | 미인상 |
2 | Alexander | Hunold | 60 | 9000 | 9900 | 10%인상 |
- employees 테이블에서 job_id가 IT_PROG라면 employee_id, first_name, last_name, salary를 출력하되 salary가 9000 이상이면 ‘상위 급여’, 6000과 8999 사이면 ‘중위급여’, 그 외는 ‘하위급여’라고 출력하기
SELECT employee_id, first_name, last_name, salary
CASE
WHEN salary >= 9000 THEN '상위급여'
WHEN salary BETWEEN 6000 AND 8999 THEN '중위급여'
ELSE '하위급여'
END AS 급여등급
FROM employees
WHERE job_id = 'IT_PROG';
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | 급여등급 |
---|
1 | 103 | Alexander | Hunlod | 9000 | 상위급여 |
2 | 104 | Bruce | Ernst | 6000 | 중위급여 |
- RANK, DENSE_RANK, ROW_NUMBER : 데이터 값에 순위 매기기
-
순위 함수의 출력 방법 차이
| 함수 | 설명 | 순위 예 |
| --- | --- | --- |
| RANK | 공통 순위를 출력하되 공통 순위만큼 건너뛰어 다음 순위를 출력 | 1, 2, 2, 4 … |
| DENSE_RANK | 공통 순위를 출력하되 건너뛰지 않고 바로 다음 순위를 출력 | 1, 2, 2, 3 … |
| ROW_NUMBER | 공통 순위 없이 출력 | 1, 2, 3, 4 |
RANK () OVER([PARTITION BY 열 이름] ORDER BY 열 이름)
- RANK, DENSE_RANK, ROW_NUMBER 함수를 각각 이용해 employees 테이블의 salary 값이 높은 순서대로 순위를 매겨 출력하기
SELECT employee_id,
salary,
RANK() OVER(ORDER BY salary DESC) RANK_급여,
DENSE_RANK() OVER(ORDER BY salary DESC) DENSE_RANK_급여,
ROW_NUMBER() OVER(ORDER BY salary DESC) ROW_NUMBER_급여
FROM employees;
| EMPLOYEE_ID | SALARY | RANK_급여 | DENSERANK급여 | ROWNUMBER급여 |
---|
1 | 100 | 24000 | 1 | 1 | 1 |
2 | 101 | 17000 | 2 | 2 | 2 |
3 | 102 | 17000 | 2 | 2 | 3 |
4 | 145 | 14000 | 4 | 3 | 4 |
5 | 146 | 13500 | 5 | 4 | 5 |
- RANK, DENSE_RANK, ROW_NUMBER 함수를 각각 이용해 employees 테이블 직원이 속한 department_id 안에서 salary 값이 높은 순서대로 순위를 매겨 출력하기
SELECT A.employee_id,
A.department_id,
B.department_name,
salary,
RANK() OVER(PARTITION BY A.department_id ORDER BY salary DESC) RANK_급여,
DENSE_RANK() OVER(PARTITION BY A.department_id ORDER BY salary DESC) DENSE_RANK_급여,
ROW_NUMBER() OVER(PARTITION BY A.department_id ORDER BY salary DESC) ROW_NUMBER_급여
FROM employees A, departments B
WHERE A.department_id = B.department_id
ORDER BY B.department_id, A.salary DESC;
| EMPLOYEE_ID | DEPARTMENT_ID | DEPARTMENT_NAME | SALARY | RANK_급여 | DENSERANK급여 | ROWNUMBER급여 |
---|
1 | 200 | 10 | Administration | 4400 | 1 | 1 | 1 |
2 | 201 | 20 | Marketing | 13000 | 1 | 1 | 1 |
3 | 202 | 20 | Marketing | 6000 | 2 | 2 | 2 |
4 | 114 | 30 | Purchasing | 11000 | 1 | 1 | 1 |
56 | 103 | 60 | IT | 9000 | 1 | 1 | 1 |
57 | 104 | 60 | IT | 6000 | 2 | 2 | 2 |
58 | 105 | 60 | IT | 4800 | 3 | 3 | 3 |
59 | 106 | 60 | IT | 4800 | 3 | 3 | 4 |
60 | 107 | 60 | IT | 4200 | 5 | 4 | 5 |
61 | 204 | 70 | Public Relations | 10000 | 1 | 1 | 1 |
62 | 145 | 80 | Sales | 14000 | 1 | 1 | 1 |
63 | 146 | 80 | Sales | 13500 | 2 | 2 | 2 |
그룹 함수 : 그룹으로 요약하기
그룹 함수는 단일 행 함수와 달리 여러 행에 대해 함수가 적용되어 하나의 결과를 나타내는 함수임
집계 함수라고 부르기도 함
기준 열에 대해 같은 데이터 값끼리 그룹으로 묶고 묶은 행의 집합에 대해 그룹 함수 연산이 필요하다면 GROUP BY 절을 이용하여 처리할 수 있음
묶은 그룹에 대해 조건이 필요하다면 HAVING 절을 이용
- 그룹 함수의 종류
함수 | 설명 | 예 | null 처 |
---|
COUNT | 행 개수를 셈 | COUNT(salary) | (*)의 경우 null 값도 개수로 셈 |
SUM | 합계 | SUM(salary) | null 값을 제외하고 연산 |
AVG | 평균 | AVG(salary) | null 값을 제외하고 연산 |
MAX | 최댓값 | MAX(salary) | null 값을 제외하고 연산 |
MIN | 최솟값 | MIN(salary) | null 값을 제외하고 연산 |
STDDEV | 표준편차 | STDDEV(salary) | null 값을 제외하고 연산 |
VARIANCE | 분산 | VARIANCE(salary) | null 값을 제외하고 연산 |
- COUNT 함수 지정한 열의 행 개수를 세는 함수
COUNT(열 이름)
- SUM, AVG 함수 SUM : 열의 합계를 구하는 함수 AVG : 열의 평균을 구하는 함수
SUM(열 이름)
AVG(열 이름)
- MAX, MIN 함수 MAX : 최댓값을 출력하는 함수 MIN : 최솟값을 출력하는 함수
MAX(열 이름)
MIN(열 이름)
- employees 테이블에서 salary의 최댓값과 최솟값, first_name의 최댓값과 최솟값을 출력하기
SELECT MAX(salary) 최댓값, MIN(salary) 최솟값, MAX(first_name) 최대문자값, MIN(first_name) 최소문자값
FROM employees;
| 최댓값 | 최솟값 | 최대문자값 | 최소문자값 |
---|
1 | 24000 | 2100 | Winston | Adam |
-
GROUP BY 절의 특징
- SELECT 절에 기준 열과 그룹 함수가 같이 지정되면 GROUP BY 절에 기준 열 이름이 반드시 기술되어야 함
(SELECT 절에 그룹 함수만 기술되고 열 이름이 기술되지 않으면 GROUP BY 절을 반드시 기술할 필요는 없음)
- WHERE 절을 사용하면 행을 그룹으로 묶기 전에 앞서 조건식이 적용됨
- SELECT 절에 그룹 함수를 사용하지 않아도 GROUP BY 절만으로도 사용할 수 있음
-
employees 테이블에서 employee_id가 10 이상인 직원에 대해 job_id별로 그룹화하여 job_id별 총 급여와 job_id별 평균 급여를 구하고, job_id별 총 급여를 기준으로 내림차순 정렬하기
SELECT job_id 직무, SUM(salary) 직무별_총급여, AVG(salary) 직무별_평균급여
FROM employees
WHERE employee_id >= 10
GROUP BY job_id
ORDER BY 직무별_총급여 DESC, 직무별_평균급여;
| 직무 | 직무별_총급여 | 직무별_평균급여 |
---|
1 | SA_REP | 250500 | 8350 |
2 | SH_CLERK | 64300 | 3215 |
employee_id가 10 이상인 값에 대해 job_id를 기준 열로 GROUP BY 절로 그룹화함
salary에 대해 SUM 함수와 AVG 함수를 사용해 직무별 총 급여와 평균 급여를 출력함
정렬 순서는 직무별 총 급여를 기준으로 내림차순 정렬함
SELECT job_id job_id_대그룹,
manager_id manager_id_중그룹,
SUM(salary) 그룹핑_총급여,
AVG(salary) 그룹핑_평균급여
FROM employees
WHERE employee_id >= 10
GROUP BY job_id, manager_id
ORDER BY 그룹핑_총급여 DESC, 그룹핑_평균급여;
- employees 테이블에서 employee_id가 10 이상인 직원에 대해 job_id별로 그룹화하여 job_id별 총 급여와 job_id별 평균 급여를 구하되, job_id별 총 급여가 30000보다 큰 값만 출력하기 출력 결과는 job_id별 총 급여를 기준으로 내림차순 정렬하기
SELECT job_id 직무, SUM(salary) 직무별_총급여, AVG(salary) 직무별_평균급여
FROM employees
WHERE employee_id >= 10
GROUP BY job_id
HAVING SUM(salary) > 30000
ORDER BY 직무별_총급여 DESC, 직무별_평균급여;
| 직무 | 직무별_총급여 | 직무별_평균급여 |
---|
1 | SA_REP | 250500 | 8350 |
2 | SH_CLERK | 64300 | 3215 |