이번 포스팅에서는 SQL의 기초에 대한 내용을 정리하겠다.
비교 분석하기
SUM, COUNT, GROUP_BY를 사용하여 총 판매 금액과 총 판매 수량을 비교한다.
판매금액을 구하는 방법,
판매 수량을 구하는 방법,
메뉴 아이템 별로 나누는 방법 (그룹화)
단일행 함수와 그룹 함수
함수?
- 함수란 어떤 결과를 위해 미리 만들어 놓은 명령어(도구)이다.
- 함수들은 기본적인 SQL문을 더욱 강력하게 사용할 수 있게 해주며, 데이터 값을 조작하는데 도움을 준다.
SQL함수의 특징
- 데이터 값을 계산하거나 조작한다.
- 데이터 값을 조작, 날짜와 숫자 등 데이터 타입을 상호 변환, 행에 대해 조작한다.
(단일 행 함수)
- 행의 그룹에 대해 계산하거나 요약
(그룹함수)
(1) 단일 행 함수
: 문자 함수, 숫자 함수, 날짜 함수, 변환 함수, 일반 함수
(1:1로 값이 mapping되어 수정
된다)
데이터 타입의 종류
문자
: CHAR(n) : n크기만큼 고정길이의 문자 타입을 저장 (최대 2000바이트)문자
: VARCHAR2(n) : n크기만큼 가변 길이의 문자 타입을 저장한다.
-> 데이터를 관리하고 저장하는데 효율성을 위해서 가변/불가변 데이터 타입을 구분해서 사용한다. 고정 데이터 분석(CHAR)/유연한 데이터 분석(VARCHAR2)숫자
: NUMBER(p, s) : 수자타입을 저장 (p: 정수, s: 소수 자릿수)날짜
: DATE : 날짜 타입 : 날짜 타입을 저장 9999년 12월 31일까지 저장
단일 행 함수의 종류
문자타입 함수
: 문자를 입력받아 문자와 숫자를 반환숫자 타입 함수
: 숫자를 입력받아 숫자를 반환날짜 타입 함수
: 날짜에 대한 연산을 한다. 숫자를 반환하는 MONTHS_BETWEEN 함수를 제외하고 모든 날짜 타입 함수는 날짜 값을 반환변환 타입 함수
: 임의의 데이터 타입의 값을 다른 데이터 타입으로 변환일반 함수
: 그 외 NVL, DECODE, CASE, WHEN, 순위 함수 등
단일 행 함수의 특징
- 행별로 하나의 결과를 반환
- SELECT, WHERE, ORDER BY 절 등에서 사용
- 중첩 사용가능
(안쪽(하위) -> 바깥쪽(상위) 단계순으로 진행)
주요 단일 행 문자타입 함수 요약
- LOWER : 문자열을 소문자로
- UPPER : 문자열을 대문자로
- INITCAP : 문자열의 첫 번째 문자를 대문자로
- SUBSTR : 문자열 중 일부분을 선택 / 인덱스는 1부터 시작, 마지막 인덱스 번호는 끝지점 가리킴
- REPLACE : REPLACE(‘[TARGETR 문자열]’, ‘[TARGET 문자]’, ‘[수정 문자]’)
- CONCAT : 두 문자열을 연결 (|| 연산자와 같다)
- LENGTH : 문자열의 길이
- INSTR : 명명된 문자의 위치를 구한다. INSTR(‘ABCD’, ‘D’) -> 4
- LPAD : 왼쪽부터 특정 문자로 자리를 채운다. LPAD(‘ABCD’, 6, *) -> **ABCD
- RPAD : 오른쪽부터 특정 문자로 자리를 채운다.
- LTRIM : 주어진 문자열의 왼쪽 문자를 지운다. LTRIM(‘ABCD’, ‘AB’)
- RTRIM : 주어진 문자열의 오른쪽 문자를 지운다. RTRIM(‘ABCD’, ‘CD’)
주요 단일 행 숫자타입 함수 요약
- *ROUND : 숫자를 반올림한다.(0이 소숫점 첫째자리)
- *TRUNC : 숫자를 절삭한다. TRUNC(15.451, 1) -> 15.4 (소수점 첫째 자리에서 절삭)
- MOD : 나누기 후 나머지를 구한다.
- CEIL : 숫자를 정수로 올림한다. (무조건 반올림 정수+1)
- FLOOR : 숫자를 정수로 내림한다. (무조건 소수점 이하 버리기)
- SIGN : 양수(1), 음수(-1), 0인지 구분하여 출력
- POWER : 거듭제곱 출력
- SQRT : 제곱근 출력
날짜 타입 함수
- MONTHS_BETWEEN : 두 날짜 사이의 개월수를 계산
- ADD_MONTHS : 월을 날짜에 더한다. ADD_MONTHS(HIRE_DATE, 5)
- NEXT_DAY : 명시된 날짜부터 돌아오는 요일에 대한 날짜를 출력(SUNDAY:1, MONDAY:2,)
- LAST_DAY : 월의 마지막 날을 계산
- ROUND : 날짜를 가장 가까운 연도 또는 월로 반올림 (YEAR or MONTH) ROUND(HIRE_DATE, ‘MONTH’)
- TRUNC : 날짜를 가장 가까운 연도 또는 월로 절삭 (YEAR or MONTH) TRUNC(HIRE_DATE, ‘YEAR’)
1 | - DUAL : Oracle에서 제공하는 더미 테이블 |
연산 결과에 따른 타입 변환
1 | SELECT 1,2,3 |
타입 변환함수
1 | SELECT TO_CHAR(SYSDATE, 'YY'), |
일반 함수
일반 함수 중에서 가장 많이 사용되는 함수들을 정리
순위함수(RANK)
1 | SELECT employee_id, |
NULL 값을 특정 값으로 치환하는 NVL함수
1 | -- commission_pct의 값이 NULL인 경우, 1로 치환해서 수식을 계산한다. |
DECODE 문
열을 선택하고, 특정 조건값이면 치환값으로 업데이트하고, 특정 조건값이면 인상여부에 대한 칼럼에 ‘10%인상’, ‘미인상’ 값을 넣어 출력한다.
1 | DECODE(열 이름, 조건값, 치환값(조건 값에 해당할 경우, 출력값), 기본값(조건 값에 해당하지 않을 경우 출력값)) |
CASE 문
CASE문은 DECODE와 달리 복수의 조건을 줄 수 있다.
1 | CASE |
(2) 그룹함수
: 함수, GROUP BY, HAVING
(기준 열의 행에 대해 그룹으로 묶어서 함수를 적용
한다)
여러 행 또는 테이블 전체에 대해 함수가 적용되어 하나의 결과를 가져오는 함수를 말한다.그룹 당 하나의 결과가 주어지도록 하기 위해 '행의 집합'에 대해 연산할 경우 GROUP BY 절을 이용
하고, HAVING절을 이용하여 그룹에 대한 조건을 제한
할 수 있다.
그룹함수의 종류
- COUNT (행의 갯수를 센다) : *(whildcard)의 경우에는 null도 개수에 포함해서 센다.
(그 외 나머지는 null 값을 제외하고 연산을 한다)
- SUM (합계)
- AVG (평균)
- MAX (최댓값)
- MIN (최솟값)
- STDDEV (표준편차)
- VARIANCE (분산)
1 | SELECT COUNT(*)행갯수, AVG(salary)급여 |
GROUP BY 절
그룹 함수는 여러 행 또는 테이블 전체에 대해 함수가 적용되어 하나의 결과를 가져온다.
그룹 당 하나의 결과가 주어지도록 행의 집합에 대해 그룹화 연산할 경우, GROUP BY절을 사용하도록 한다.
그리고 GROUP BY절은 그룹함수와 같이 자주 사용된다.
1 | SELECT A, SUM(B) |
HAVING 절
HAVING절은 그룹으로 묶여진 결과값에 대해서 다시 한 번 조건문을 주는 것이다.
HAVING절의 위치는 GROUP BY 절 다음에 위치를 하며, 그 다음으로 ORDER BY 절이 위치를 한다.GROUP BY [열이름] -> HAVING [조건식] -> ORDER BY [열 이름]
1 | SELECT job_id AS 직무, SUM(salary) AS 직무별_총급여, AVG(salary) AS 직무별_평균급여 |
총 판매 금액과 총 판매 수량을 조회하여 비교
1 | SELECT item_id, |