-
오라클 DB 용어, 명령문 정리03 - 분석함수, JOIN함수, 서브쿼리비전공자 공부일기/:: DB - SQL 2019. 5. 21. 17:20
2019.05.21 필기
<분석함수 OVER()>
---------------------------------------------기본 개념---------------------------------------------
윈도우함수에 의해 발생된 결과를 이용하여 처리 후 결과를 반환하는 함수
※ 윈도우 - 분석함수에서 사용하는 로우별 그룹
※ 윈도우함수 - 그룹함수, 순위함수, 순서함수 등
-----------------------------------------------------------------------------------------------------
- 분석함수는 통계, 데이터 분석 쪽에 활용될 수 있는 함수이다.
<함께 쓰일 수 있는 윈도우 함수들>
- 그룹함수
- 순위함수(반드시 분석함수와 함께 사용/독립사용 불가)
: RANK(), DENSE_RANK(), ROW_NUMBER(), NTILE()- 순서함수(반드시 분석함수와 함께 사용/독립사용 불가)
: FIRST_VALUE(), LAST_VALUE(), LAG(), LEAD()
- 집계함수 : SUM(), MIN(), MAX(), AVG(), COUNT()
- 기타함수 : LEAD(), LAG(), RATIO_TO_REPORT(), KEEP(), LISTAGG()---------------------------------------------기본 구문---------------------------------------------
SELECT OVER(
[PARTITION BY 컬럼명]
[ORDER BY 컬럼명]
[WINDOWING]
)
, 검색대상
FROM 테이블명;
-----------------------------------------------------------------------------------------------------
<각 명령어 설명>
OVER - 분석함수임을 알려주는 선언
PARTITION BY - 분석 함수의 계산대상 그룹 지정 --- GROUP BY와 같은 역할.
ORDER BY - 계산 대상 그룹에 대해 정렬
WINDOWING - 분석 함수 대상이 되는 기준을 좀 더 세부적으로 정의그룹함수를 분석함수와 같이 사용할 경우 다른 검색대상과 함께 사용 가능(원래는 안 됨)
분석함수는 GROUP BY 명령을 쓸 수 없다. 대신 PARTITION BY로 같은 기능 수행--- order by를 over() 안에 쓰기를 권장
ROWS UNBOUNDED PRECEDING : 검색행을 기준으로 이전에 존재하는 모든 행만을 검색대상으로 설정
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING : 이전 행 하나에서 이후 행 하나 검색
RANK() : 순위함수. 정렬값이 동일한 경우 같은 순위를 지정하고 다음 순위를 건너띄고 순위로 검색.
DENSE_RANK() : 정렬값이 동일한 경우 같은 순위를 지정하며, 다음 순위로 검색
ROW_NUMBER() : 행번호를 이용하기 때문에 정렬값이 동일한 경우에도 다른 순위를 지정
------ 즉, 1등-2등-2등(같은 순위 나옴) 뒤의 순위를 RANK()는 4등으로 지정, DENSE_RANK()는 3등으로 지정한다. 반면 ROW_NUMBER()는 애초에 1등-2등-3등으로 같은 순위를 뽑아내지 않는다.
FIRST_VALUE() : 첫번째 검색행의 컬럼값을 반환
LAST_VALUE() : 마지막 검색행의 컬럼값을 반환
LAG() : 검색행 이전 행을 컬럼값을 반환
LAG(column, index_preceding, index_chage) : 이전 위치 행의 컬럼값을 검색하되, 이전 행이 없으면 변경값 반환
--- 바로 전이면 index_preceding 값이 1, 전전이면 2
LEAD() : 검색행 이후 행의 컬럼값을 반환
LEAD(column, index_following, index_chage) : 이후 위치 행의 컬럼값을 검색하되, 이후 행이 없으면 변경값 반환
--- 바로 뒷자리면 index_following 값이 1, 뒷뒷자리면 2
<조인함수 JOIN()>
JOIN 함수란? : 두 개 이상의 테이블에서 원하는 행을 검색하기 위한 기능. / 객체관계형!
--- 즉, 어떤 검색 결과가 2개 이상의 테이블을 검색해야 나올 수 있을 때 사용
--- 여러 개의 테이블에서 행을 검색하기 위해서는 반드시 조인 조건 사용 : WHERE 명령에 조인조건을 명시
카타시안 프로덕트(CATASIAN PRODUCT)란? : 조인조건을 명시하지 않은 조인을 뜻함
--- 조인조건이 명시되지 않은 경우, 테이블들의 모든 행을 교차조인하여 검색
동등 조인(EQUI JOIN) : 조인조건에 = 연산자를 이용하여 조인 테이블의 컬럼값이 같을 경우 조인하여 검색
--- 조인 테이블에 동일한 컬럼명이 존재할 경우, 반드시 테이블명 명시 >> [형식] table.column
--- 조인 테이블의 동일한 컬럼명을 동시에 검색할 경우, 두 번째 컬럼명은 자동으로 변경되어 검색
--- 따라서, 이 경우 두 번째 컬럼에 별명을 부여하는 것을 권장(ALIAS 시키기)
--- ※ 테이블 별명(TABLE ALIAS) : 조인 테이블에 '새로운 이름'을 부여하는 기능
--- **AS 명시하면 안 됨 & 새 이름 부여 뒤에 실제 테이블명 사용하면 에러(컬럼별명과 다른 점)
비동등 조인(NON-EQUI JOIN) : 조인조건에 = 연산자를 제외한 연산자로 비교하여 조인
외부조인(OUTER JOIN) : 조인조건이 맞지 않는 행까지도 검색
>> [형식] SELECT 검색대상 FROM 테이블1, 테이블2 WHERE table1.column (+) = table2.column;
--- 조건이 맞지 않는 행을 가진 테이블에 (+)를 사용하여 null로 검색되도록 설정 >> [형식] table.column (+)
--- 아우터조인은 무결성 위반한 데이터(무의미한 데이터)를 검사할 때 사용할 수 있다.
외부조인+온(OUTER JOIN ON)
>> [형식] SELECT 검색대상 FROM 테이블1 {LEFT|RIGHT|FULL} OUTER JOIN 테이블2 ON 조인조건;
--- LEFT OUTER JOIN : 왼쪽 방향에 선언된 조인 테이블1의 행에서 조인조건이 맞지 않는 건 null로 포함시켜 반환
--- RIGHT OUTER JOIN : 오른쪽 방향에 선언된 조인 테이블2의 행에서 조인조건이 맞지 않는 건 null로 포함시켜 반환
--- FULL OUTER JOIN : 양쪽 방향에 선언된 조인 테이블1, 2의 행에서 조인조건이 맞지 않는 건 null로 포함시켜 반환
셀프 조인(SELF JOIN) : 하나의 테이블에 다른 이름을 부여하여 조인 / 테이블 별명을 부여해야 함!
크로스 조인(CROSS JOIN) : 조인 테이블의 모든 행들을 교차 조인
>> [형식] SELECT 검색대상 FROM 테이블1 CROSS JOIN 테이블2;--- 경우의 수를 구할 때처럼, 결과는 X x Y x Z x ... 의 갯수만큼 나온다.
NATURAL JOIN : 조인 테이블의 동일한 하나의 이름의 컬럼에 대한 컬럼값을 이용하여 조인
>> [형식] SELECT 검색대상 FROM 테이블1 NATURAL JOIN 테이블2;
--- EMP 테이블과 DEPT 테이블에 공통으로 존재하는 DEPTNO 컬럼값을 이용하여 자동 조인
--- 동일한 컬럼명에 대한 검색에 대해 테이블명을 명시할 필요가 없다.
**이너 조인(INNER JOIN)** : 조인조건을 명시하여 조인조건이 맞는 행을 조인
--- 조인된 테이블들로 새로운 가상의 테이블어 검색하기 때문에, 조인해야 할 게 많을 때 크로스 조인 등에 비해
처리속도가 빠르다.
>> [형식1] SELECT 검색대상 FROM 테이블1 [INNER] JOIN 테이블2 USING(column);
--- 조인 테이블의 동일한 여러 컬럼명 중 하나에 대한 컬럼값을 이용하여 조인할 경우 USING 키워드 사용
--- 동일한 컬럼명 검색에서는 테이블명을 명시할 필요 없다.--- INNER 키워드는 생략 가능
>> [형식2] SELECT 검색대상 FROM 테이블1 [INNER] JOIN 테이블2 ON 조인조건A JOIN 테이블3 ON 조인조건B;
--- 동일한 컬럼명 검색에 대해 테이블명 명시
--- INNER 키워드는 생략 가능
<서브쿼리 SUBQUERY>
---------------------------------------------기본 개념---------------------------------------------
SQL 명령 안에 포함되어 선언된 SELECT 명령
즉, 쿼리문 안의 쿼리문이다.
-----------------------------------------------------------------------------------------------------
<서브쿼리가 사용 가능한 SQL 명령>
SELECT, CREATE, INSERT, DELETE, UPDATE, ORDER BY 등
--- FROM, WHERE, HAVING 뒤에 올 수 있다.
--- WHERE, HAVING 뒤에 쓰일 경우, 서브쿼리에서 나온 결과를 비교대상과 비교
---------------------------------------------기본 구문---------------------------------------------
SELECT 검색대상
FROM 테이블명
WHERE 비교대상 + 비교연산자 (
SELECT ...
FROM ...
....
) ;
-----------------------------------------------------------------------------------------------------
--- 바깥쪽 문장이 MAIN QUERY,
안쪽 문장이 SUB QUERY
--- 명령 실행 순서 >> 서브쿼리가 먼저, 메인쿼리가 나중에 실행된다.
--- '오라클에서는' 서브쿼리 안에 또 다른 서브쿼리를 쓸 수 있다.
--- 서브쿼리를 사용하면 한 개의 SELECT 명령으로 원하는 결과 검색 가능
--- WHERE 뒤에 SUBQUERY를 사용할 경우, 비교대상과 SUBQUERY의 검색결과가
반드시 하나의 행/동일한 자료형/하나의 값이어야 한다.
'비전공자 공부일기 > :: DB - SQL' 카테고리의 다른 글
오라클 DB 용어, 명령문 정리04 - 복수행 서브쿼리, 집합연산자, DML, TCL (0) 2019.05.22 [오라클] 예제03 - JOIN함수, 서브쿼리 (0) 2019.05.22 [ 오라클] 예제02 - 단일함수, 그룹함수 (0) 2019.05.21 [ 오라클] 예제01 - 기호, 연산자, SELECT문 (0) 2019.05.21 오라클 DB 용어, 명령문 정리02 - 함수(문자, 숫자, 날짜, 단일, 그룹) (0) 2019.05.20