SELECT 문자형함수 FROM 테이블;
CHR(ASCII 코드) - 매핑되는 문자 반환
LOWER(문자열) - 문자열을 소문자로 변환
UPPER(문자열) - 문자열을 대문자로 변환
LTRIM(문자열[, 특정 문자]) - 문자열 왼쪽 공백 제거
[]는 옵션 (SQL Server 미지원, 공백 제거만 가능)RTRIM(문자열[, 특정 문자]) - 문자열 오른쪽 공백 제거
[]는 옵션 (SQL Server 미지원, 공백 제거만 가능)TRIM([위치][특정 한 글자][FROM]문자열) - 문자열 양옆 공백 제거
[]는 옵션 (SQL Server 미지원, 공백 제거만 가능)[위치] : 왼쪽부터 LEADING or 오른쪽부터 TRAILING or 양쪽 BOTHSUBSTR(문자열, 시작점/기준[, 길이]) - 문자열의 원하는 부분만 잘라서 반환. 시작점을 기준으로 길이(디폴트 끝)까지 혹은 기준점으로 나눠서 1, .. -1 등
SUBSTR(문자열)SQL Server, SUBSTRING_INDEX(문자열, 기준, 인덱스) - 문자열응 기준으로 잘라서 인덱스에 해당하는 내용 반환
LENGTH(문자열) - 문자열의 길이 반환
LEN(문자열)REPLACE(문자열, 변경 전 문자열[, 변경 후 문자열]) - 문자열에서 변경 전 문자열을 변경 후 문자열로 변환, 변경 후 문자열이 명시되지 않으면 제거
NULL 값을 제외하고 계산한다.
SELECT 숫자형함수 FROM 테이블;
ABS(수) - 절대값 반환
SIGN(수) - 부호 반환 (양수=1, 음수=-1, 0=0)
ROUND(수[, 자릿수] - 소수점 자릿수까지 반올림하여 반환
TRUNC(수[, 자릿수]) - 소수점 자릿수까지 버림하여 반환
CELL(수) - 소수점 이하의 수를 올림한 정수 반환
CEILING(수)FLOOR(수) - 소수점 이하의 수를 버림한 정수 반환
MOD(수1, 수2) - 수1을 수2로 나눈 나머지를 반환
SELECT 날짜형함수 FROM 테이블;
SYSDATE - 현재의 YYYY-MM-DD HH:MI:SS 반환
GERDATE()EXTRACT(특정_단위 FROM 날짜_데이터) - 날짜 데이터에서 특정 단위(YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)만 반환
ADD_MONTHS(날짜 데이터, 특정 개월 수) - 날짜 데이터에서 특정 개월 수를 더한 날짜 반환
DATEADD(MONTH, 특정 개월 수, 날짜 데이터)SELECT 변환형함수 FROM 테이블;
TO_NUMBER(문자열) - 문자열을 숫자형으로 변환
TO_CHAR(수 or 날짜[, 포맷]) - 수, 날짜형을 포맷 형식의 문자형으로 변환
TO_DATE(문자열, 포맷) - 포맷 형식의 문자형을 날짜형으로 변환
SQL Server의 경우, CONVERT or CAST 함수 이용
CAST (값 AS 데이터_형식 [길이])
CONVERT (값, 데이터_형식 [길이])
-- 둘 다 같은 내용
-- 데이터 형식 : CHAR, SIGNED (부호가 있는 정수), UNSIGNED, DATE, TIME, DATETIME 등
SELECT 컬럼, NULL함수 FROM 테이블;
NVL(인수1, 인수2) - 인수1 값이 NULL이면 인수2 반환, NULL이 아니면 인수1 반환
ISNULL(인수1, 인수2)NULLIF(인수1, 인수2) - 인수1 = 인수2면 NULL, 같지 않으면 인수1 반환
COALESCE(인수1, 인수2, ..) - NULL이 아닌 최초의 인수를 반환
경우에 따라 원하는 값 출력하기
CASE [컬럼] WHEN __ THEN __ [ELSE _(default = NULL)_] END
단일행 CASE 표현의 종류는 3가지가 있다. (모두 같은 값을 도출한다.)
SELECT 컬럼,
CASE 컬럼
WHEN 'a' THEN 'A'
WHEN 'b' THEN 'B'
ELSE 'C'
END AS 별명
FROM 테이블;
SELECT 컬럼,
CASE WHEN 컬럼 = 'a' THEN 'A'
WHEN 컬럼 = 'b' THEN 'B'
ELSE 'C'
END AS 별명
FROM 테이블;
SELECT 컬럼,
DECODE(컬럼, 'a', 'A', 'b', 'B', 'C') AS 별명
FROM 테이블;
# ELSE 값인 'C'가 지정되지 않으면 NULL 출력
AGGREGATE FUNCTION : COUNT, SUM, MAX, MIN 외 각종 집계 함수
GROUP FUNCTION : ROLLUP, CUBE, GROUPING SETS
WINDOW FUNCTION : 분석 함수, 순위 함수
SELECT, HAVING, ORDER BY 에서 사용
SELECT 집계 함수 FROM 테이블;
COUNT(*) - NULL 값을 포함한 행(row) 반환
COUNT(컬럼) - NULL 값을 제외한 행(row) 반환
COUNT(DISTINCT 컬럼) - NULL 값을 제외하고 중복을 제외한 행(row) 반환
SUM(컬럼) - 컬럼값들의 합계 반환
AVG(컬럼) - 컬럼값들의 평균 반환
MIN(컬럼) - 컬럼값들의 최소값 반환
MAX(컬럼) - 컬럼값들의 최대값 반환
STDDEV(컬럼) - 컬럼값들의 표준편차 반환
VARIAN(컬럼) - 컬럼값들의 분산 반환
집계 함수 외 소계(총계) 함수 : ROLLUP, CUBE, GROUPING SETS 등
SELECT * FROM table_name GROUP BY 그룹함수();
소그룹 간의 소계 및 총계를 계산하는 함수
ROLLUP(A) - A로 그룹핑, 총합계ROLLUP(A, B) - A,B로 그룹핑, A로 그룹핑, 총합계ROLLUP(A, B, C) - A,B,C로 그룹핑, A,B로 그룹핑, A로 그룹핑, 총합계소그룹 간의 소계 및 총계를 다차원적으로 계산하는 함수
CUBE(A) - A로 그룹핑, 총합계CUBE(A, B) - A,B로 그룹핑, A로 그룹핑, B로 그룹핑, 총합계특정 항목에 대한 소계를 계산하는 함수
인자값으로 ROLLUP이나 CUBE를 사용할 수도 있다.
GROUPING SETS(A, B) - A로 그룹핑, B로 그룹핑GROUPING SETS(A, B, ()) - A로 그룹핑, B로 그룹핑, 총합계GROUPING SETS(A, ROLLUP(B)) - A로 그룹핑, B로 그룹핑, 총합계SELECT column1, GROUPING(column1) FROM table_name GROUP BY ROLLUP(column1);
OVER 키워드와 함께 사용
OVER(PARTITION BY 나누는 기준)
그룹 내 순위 함수 - RANK, DENSE_RANK, ROW_NUMBER
그룹 내 집계 함수 - SUM, MAX, MIN, AVG, COUNT
그룹 내 행 순서 함수 (Oracle만 지원) - FIRST_VALUE, LASE_VALUE, LAG, LEAD
그룹 내 비율 함수 - CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT
SELECT columns1,
순위함수() OVER(__)
FROM table_name
RANK - 특정 항목(칼럼)에 대한 순위를 구하는 함수. 동일한 값 = 동일한 순위
DENSE_RANK - 동일한 순위를 하나의 건수로 취급
ROW_NUMBER - 동일한 값이라도 고유한 순위 부여
SELECT columns1,
집계함수(colums2) OVER(__)
FROM table_name
SELECT columns1,
FIRST/LAST_VALUE(colums2) OVER(__)
FROM table_name
SELECT columns1,
LAG/LEAD(colums2, 인자값) OVER(__)
FROM table_name
FIRST_VALUE - 파티션별 윈도우에서 가장 먼저 나온 값을 구함. 처음 나온 행만 처리함.
LAST_VALUE - 파티션별 윈도우에서 가장 나중에 나온 값을 구함. 공동 등수 미인정.
LAG - 파티션별 윈도우에서 이전 몇 번째 행의 값 가져오기. 인자값 생략 시 default 1
LEAD - 파티션별 윈도우에서 이후 몇 번째 행의 값 가져오기. 인자값 생략 시 default 1
SELECT columns1,
비율함수(colums2) OVER(__)
FROM table_name
RATIO_TO_REPORT - 파티션 별 합계에서 차지하는 비율. 칼럼 값에 대한 백분율을 소수점으로 구함 (Oracle만 지원)
PERCENT_RANK - 행의 순서에 대한 백분율. 제일 먼저 나오는 것은 0, 제일 늦게 나오는 것은 1 (Oracle만 지원)
CUME_DIST - 해당 파티션에서의 누적 백분율. 파티션별 윈도우에서 전체건수에 현재 행보다 작거나 같은 건수에 대한 누적백분율 구함 (1/전체건수) (Oracle만 지원)
NTILE - 파티션별 전체 건수를 ARGUMENT 값으로 N등분한 결과 구함
각 쿼리의 결과 집합을 가지고 연산을 하는 명령어
헤더 값은 첫 번째 쿼리를 따라간다.
UNION : 합집합. 중복 행은 한 줄로 출력
UNION ALL : 합집합. 중복 행도 그대로 결과로 표시.
INTERSECT : 교집합. 중복 행은 한 줄로 출력
MINUS / EXCEPT : 차집합. 중복 행은 한 줄로 출력
SELECT * FROM table1;
집합 연산자
SELECT * FROM table2;
테이블에 계층 구조를 이루는 컬럼이 존재하는 경우 계층 쿼리를 이용하여 데이터 출력 가능
Depth가 깊어질수록 셀프 조인이 반복되는데, 계층 쿼리를 이용하면 좀 더 간단하게 쿼리를 작성할 수 있다.
보통 순방향 : 루트(상위)-리프(하위)로 내려가는 구조
BEFORE :
| cTYPE | cNAME | PARENT |
|---|---|---|
| 대 | 컴/디/가 | NULL |
| 중 | 컴퓨터 | 컴/디/가 |
| 중 | 디지털 | 컴/디/가 |
| 중 | 가전 | 컴/디/가 |
| 소 | 노트북/PC | 컴퓨터 |
| 소 | 모니터/프린터 | 컴퓨터 |
| 소 | 모바일/태블릿 | 디지털 |
| 소 | 음향가전 | 가전 |
AFTER :
# Self Join
SELECT A.cTYPE, A.cNAME,
B.cTYPE, B.cNAME,
C.cTYPE, C.cNAME
FROM CATEGORY A, CATEGORY B, CATEGORY C
WHERE A.cNAME = B.PARENT AND B.C_cNAME = C.PARENT
| cTYPE | cNAME | cTYPE | cNAME | cTYPE | cNAME |
|---|---|---|---|---|---|
| 대 | 컴/디/가 | 중 | 컴퓨터 | 소 | 노트북/PC |
| 대 | 컴/디/가 | 중 | 컴퓨터 | 소 | 모니터/프린터 |
| 대 | 컴/디/가 | 중 | 디지털 | 소 | 모바일/태블릿 |
| 대 | 컴/디/가 | 중 | 가전 | 소 | 음향가전 |
# 계층 쿼리
SELECT LEVEL,
SYS_CONNECT_BY_PATH('['||cTYPE||']'|| cNAME, '-') AS PATH
FROM CATEGORY
START WITH PARENT IS NULL
CONNECT BY PRIOR NAME = PARENT
| LEVEL | PATH |
|---|---|
| 1 | -[대]컴/디/가 |
| 2 | -[대]컴/디/가-[중]가전 |
| 2 | -[대]컴/디/가-[중]디지털 |
| 2 | -[대]컴/디/가-[중]컴퓨터 |
| 3 | -[대]컴/디/가-[중]가전-[소]음향가전 |
| 3 | -[대]컴/디/가-[중]디지털-[소]모바일/태블릿 |
| 3 | -[대]컴/디/가-[중]컴퓨터-[소]노트북/PC |
| 3 | -[대]컴/디/가-[중]컴퓨터-[소]모니터/프린터 |
LEVEL - 현재의 DEPTH를 반환. 루트 노드는 1이 된다.
SYS_CONNECT_BY_PATH(컬럼, 구분자) - 루트 노드부터 현재 노드까지의 경로를 출력해주는 함수
START WITH - 경로가 시작되는 루트 노드를 생성해주는 절
CONNECT BY - 루트로부터 자식 노드를 생성해주는 절. 조건에 만족하는 데이터가 없을 때까지 노드를 생성
PRIOR - 바로 앞에 있는 부모 노드의 값을 반환
CONNECT_BY_ROOT 컬럼 - 루트 노드의 주어진 컬럼 값을 반환
CONNECT_BY_ISLEAF - 가장 하위 노드인 경우 1 반환, 그 외 0 반환
하나의 쿼리 안에 존재하는 또 다른 커리
괄호로 감싸서 사용
메인 쿼리의 컬럼 모두 사용 가능 (메인 쿼리는 서브 쿼리의 컬럼 사용 불가능)
위치에 따른 분류 :
SELECT 절 - 스칼라 서브쿼리 (Scalar Subquery)
FROM 절 - 인라인 뷰 (Inline View), 동적 뷰 (Dynamic View)
WHERE 절, HAVING 절 - 중첩 서브쿼리 (Nested Subquery)
비연관 서브쿼리, 연관 서브쿼리로 분류단일행 서브쿼리, 다중행 서브쿼리, 다중컬럼 서브쿼리로 분류그 외 UPDATE 문 > SET 절, INSERT 문 > VALUES 절에 사용하는 서브쿼리
주로 SELECT 절에 위치하지만 컬럼이 올 수 있는 대부분 위치에 사용 가능
컬럼 대신 사용하므로 반드시 하나의 값만 반환해야 하며, 그렇지 않은 경우 에러 발생
FROM 절 등 테이블명이 올 수 있는 위치에 사용 가능
뷰 View
실제 데이터를 가지고 있지 않는 가상테이블
특정 SELECT 문에 이름을 붙여서 재사용이 가능하도록 저장해놓은 오브젝트
- 특징 :
독립성- 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.
편리성- 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성 가능하다.
보안성- 숨기고 싶은 정보가 존재한다면, 뷰 생성 시 해당 칼럼을 빼고 생성하여 사용자에게 정보를 감출 수 있다.
동작하는 방식에 따른 분류 :
비연관 서브쿼리 : 메인쿼리 컬럼을 갖고 있지 않는 형태. 메인쿼리에 값(서브쿼리 실행 결과) 제공을 위해 사용
연관 서브쿼리 : 메인쿼리 컬럼을 갖고 있는 형태. 메인쿼리에서 읽혀진 데이터를 서브에서 조건 맞는지 확인할 때 사용
반환되는 데이터 형태에 따른 분류 :
단일행 서브쿼리 : 실행 결과가 항상 1건 이하. 단일행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용.
다중행 서브쿼리 : 실행 결과가 여러 건. 다중행 비교 연산자(IN, ALL, ANY, SOME, EXISTS)와 함께 사용.
다중칼럼 서브쿼리 : 실행 결과로 여러 칼럼 반환. 메인쿼리의 조건절에 여러 칼럼을 동시에 비교 가능.
길어질 경우, WITH로 서브쿼리를 따로 분류하여 사용 가능
WITH (SELECT*FROM table_name) as ex1
(SELECT*FROM table_name) as ex1
SELECT * FROM ~