일반집합 연산자
1. UNION 연산은 UNION 기능으로,
2 INTERSECTION 연산은 INTERSECT 기능으로,(교집합)
3. DIFFERENCE 연산은 EXCEPT(Oracle은 MINUS) 기능(차집합)
4 PRODUCT 연산은 CROSS JOIN 기능으로 구현되었다(곱)
순수관계 연산자
5 SELECT 연산은 WHERE 절로 구현되었디.
6. PROJECT 연산은 SELECT 절로 구헌되 었다
7. (NATURAL) JOIN 연산은 다양한 JOIN 기능으로 구현되었다.
8 DIVIDE 연산은 현재 사용되지 않는다
<JOIN>
EQUI JOIN = INNER JOIN
INNER JOIN
* JOIN 조건에서 동일한 값이 있는 행만 반환
* DEFAULT 옵션이므로 생략 가능 ( JOIN만 표기 가능 )
* CROSS JOIN, OUTER JOIN과 같이 못씀.
* 그동안 WHERE절에서 사용하던 JOIN 조건을 FROM에서 정의
따라서 USING이나 ON 필수
*별도의 칼럼순서를 정하지 않았다면 별개의 칼럼으로 출력
NATURAL JOIN
* INNER JOIN의 하위 개념
* 동일한 이름을 갖는 모든 칼럼에 대해 EQUI JOIN을 수행
* NATURAL INNER JOIN이라고도 표시
* JOIN 조건이 숨어있음 ( USING, ON, WHERE절에서 JOIN조건 쓸 수 없음 )
* SQL Server에서 지원 안함
* NATURAL JOIN에 사용된 열은 E.EMPLOYEE_ID 처럼 ALIAS, 접두사 쓸수 없음
*별도의 칼럼순서를 정하지 않았다면 JOIN의 기준이 되는 칼럼들이 먼저 출력
ON 조건절
* 상호명이 달라도 사용가능 ( NATURAL JOIN, USING 조건절 과 다름)
* 앞으로 가장많이 사용될 것이라 예상
* FROM절에 테이블이 많을경우 가독성이 떨어짐
USING 조건절
* ALIAS나 접두사를 쓸수 없음
INNER JOIN은 동일한 값이 있는 행만 나온다는 것~
CROSS JOIN
* 나올 수 있는 모든 경우의 수를 출력
* WHERE 사용할 수 있지만 INNER와 같은 결과가 되므로 권고하지 않음
모두 4번씩 출력..
OUTER JOIN
* JOIN조건에서 동일한 값이 없는 행도 반환할 때 사용
* JOIN 조건을 FROM절에서 정의하겠다는 표시이므로 USING이나 ON조건절을 필수적으로 사용해야 함.
LEFT OUTER JOIN
* LEFT JOIN으로 OUTER생략 가능
RIGHT OUTER JOIN
* RIGHT JOIN 으로 OUTER생략 가능
* A RIGHT OUTER JOIN B 는 B테이블을 기준으로 가져오고 A테이블에 없는 값은 NULL로 표기
FULL OUTER JOIN
* A B 테이블 모두 기준이 됨
* UNION과 같은 결과. 즉, 중복데이터는 삭제됨
(LEFT OUTER JOIN (UNION) RIGHT OUTER JOIN)
* FULL JOIN으로 OUTER 생략 가능
집합연산자
* SELECT 절의 칼럼 수가 동일해야 함
* SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능해야 함
UNION
* 공통 교집합의 중복을 없앰
* ORDER BY 는 맨밑에 한번만 기입
* WHERE IN, OR 절로 변형하여 사용할 수 있다.
집합 연산자 결과를 표시할때 처음에 사용된 HEADING이 적용됨
UNION ALL : 공통집합을 중복해서 그대로 보여줌
INTERSECT : 여러 SQL문의 결과에 대한 교집합
EXCEPT : 앞의 SQL 결과에서 뒤의 SQL결과를 뺀 값, SQL Server에서 사용 ( 일부 데이터베이스는 MINUS를 사용 )
Oracle - 계층형 질의
* START WITH절은 계층 구조 전개의 시작 위치를 지정하는 구문이다. 즉, 루트 데이터를 지정한다.
* CONNECT BY절은 다음에 전개될 자식 데이터를 지정하는 구문이다. 자식 데이터는 CONNECT BY절에 주어진 조건을 만족해야 한다.
* PRIOR : CONNECT BY절에 사용되며, 현재 읽은 칼럼을 지정한다. PRIOR 자식 = 부모 형태를 사용하면 계층구조에서 자식 데이터에서 부모데이터 방향으로 전개하는 순방향 전개를 한다. 그리고 PRIOR 부모 = 자식 형태를 사용하면 반대로 부모 데이터에서 자식 데이터 방향으로 전개하는 역방향 전개를 한다.
* NOCYCLE : 데이터를 전개하면서 이미 나타났던 동일한 데이터가 전개 중에 다시 나타난다면 이것을 가리켜 사이클이 형성되었다라고 말한다. 사이클이 발생한 데이터는 런타임 오류가 발생한다. 그렇지만 NOCYCLE를 추가하면 사이클이 발생한 이후의 데이터는 전개하지 않는다.
* ORDER SIBLINGS BY : 형제 노드 사이에서 정렬을 수행한다.
* WHERE : 모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출 ( 필터링 )
**아래쿼리
* 순방향 전개 [PRIOR 자식 = 부모]
* EMPLOYEE 가 MANAGER가 된다. 위에서 아래로
*역방향 전개 [PRIOR MANAGER_ID=EMPLOYEE_ID]
* MANAGER가 EMPLOYEE가 된다. 아래에서 위로
* SYS_CONNECT_BY_PATH ( EMPLOYEE_ID, '/' ) 추가한 구문
CONNECT_BY_ROOT EMPLOYEE_ID
SQL Server 계층형 질의 - CTE (Common Table Expression)
* SQL Server 계층형 질의
* 재귀 공통 테이블 식
* 자기 테이블을 계속 재귀 호출하며 계층 구조를 전개
* Ti 는 입력으로 Ti+1은 출력으로 사용
* 결과집합은 T0에서 Tn까지의 UNION ALL이다.
서브쿼리
* 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다.
* 서브쿼리 레벨(행 개수)과는 상관없이 항상 메인쿼리 레벨로 출력
* 단일행 복수행 비교 연산자 모두 사용 가능
* ORDER BY절은 메인쿼리의 마지막 문장에 위치해야 함
* 많이 사용하면 중복되는 것이 많아 컴퓨터 힘들어짐
SCALAR SUBQUERY
NESTED SUBQUERY
서브쿼리 사용 가능한 곳
* SELECT
* FROM
* WHERE
* HAVING
* ORDER BY
* INSERT문의 VALUES
* UPDATE문의 SET
다중행 서브쿼리
IN, ALL, ANY, EXISTS
연관 서브쿼리
서브쿼리 내에 메인 쿼리 칼럼이 사용된 서브쿼리
인라인 뷰
* FROM절에서 사용되는 서브쿼리
* SQL이 실행될 때만 임시적으로 생성되는 동적인 뷰
* 칼럼 자유롭게 참조 가능
뷰 VIEW
장점
* 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.
* 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다.
* 보안성 : 뷰를 생성할 때 해당 칼럼을 빼고 생성함으로써 사용자에게 정보를 감출 수 있다.
이미 생성된 뷰를 참조해서 뷰를 만들 수 있다.
뷰생성
CREATE VIEW < > AS
SELECT
FROM
WHERE
뷰삭제
DROP VIEW < >
그룹함수
AGGREGATE FUNCTION ( 집계함수 )
COUNT, SUM, AVG, MAX, MIN
GROUP FUNCTION
ROLLUP : 병렬로 수행가능, 시간 및 지역처럼 계층적 분류를 포함하고있는 데이터 집계에 적합
CUBE : 다차원적인 집계 생성, 시스템에 부하를 주는 단점
GROUPING SETS : 원하는 부분의 소계
WINDOW FUNCTION
분석ANALYTIC, 순위RANK
데이터 웨어하우스에서 발전
ROLLUP
Grouping Columns의 Subtotal을 생성
*그냥 GROUP BY
* ROLLUP 썼을 때
* ROLLUP함수 일부사용
CUBE
GROUPING COLUMN 수가 N이라면 2의 N승 개의 Sub Total level 생성
ROLLUP과 달리 평등한 관계 이므로, 인수 순서가 바뀌는 경우 행간의 정렬순서도 바뀔수 있다
GROUPING SETS
* 인수들에 대한 개별집계 가능
* 평등관계 이므로 (DEPT, JOB)과 (JOB, DEPT) 결과 같음
WINDOW함수
* 중첩사용 불가
* 서브쿼리엔 사용 가능
* SQL Server는 OVER절 내의 ORDER BY, WINDOWING 구문 지원안함
* RATIO_TO_REPORT는 ORACLE에서만 지원 가능
* OVER문구가 필수
순위
RANK 1 2 2 4
DENSE_RANK 1 2 2 3 : 동일 순위를 하나의 건수로 취급
ROW_NUMBER 1 2 3 4 : 동일한 값도 고유 순위 부여
이 부분은 데이터베이 스 별로 틀린 결과가 나올 수 있으므로, 만일 동일 값에 대한 순서까지 관리하고 싶으면
ROW_NUMBER( ) OVER (ORDER BY SAL DESC, ENAME) 같이 ORDER BY 절을 이용해 추가적인 정렬기준을 정의해야 한다.
SUM
RANGE UNBOUNDED PRECEDING : 현재 행부터 파티션 내의 첫번째 행까지
RANGE 1750~1850
ROWS 앞뒤로 5줄
AVG
FIRST_VALUE
파티션별 가장먼저 나온 함수
MIN활용해서 같은 결과 낼수 있음
SQL Server 지원 안함
LAST_VALUE
파티션별 가장나중에 나온 함수
MAX활용해서 같은 결과 낼수 있음
SQL Server 지원 안함
LAG
이전행 데이터 가져오기
SQL Server 지원 안함
LEAD
이후행 데이터 가져오기
SQL Server 지원 안함
LEAD(SAL,2,0) : SAL 2이후행 데이터 가져오기, 데이터 없으면 0으로 표시
RATIO_TO_REPORT
파티션내 전체 SUM값에 대한 비율 0<X<=1 로 표시
데이터 다 더하면 1
RATIO_TO_REPORT(SAL) OVER ()
SQL Server X
PERCENT_RANK
값이 아닌 행의 순서별 백분율
제일 빠른 데이터 0
제일 마지막 데이터 1
데이터 N개 있을시 1/(N-1) 비율로 나눔
0 0.5 1
0 0 0.5 0.75 1
같은 데이터 있을 시 RANK처럼 처리됨
SQL Server X
CUME_DIST
현재 행보다 작거나 같은 건수에 대한 누적 백분율
0<X<=1 범위
N행 출력시 1/N 비율로 나눔
0.3333 0.6667 1
SQL Server X
NTILE
전체 행을 파티션별로 N등분 한 것
12행 출력시
111/222/333/444
14행 출력시
1111/2222/333/444
'DB > SQLD & SQLP' 카테고리의 다른 글
SQL 최적화 기본 원리 (옵티마이저와 실행계획, 인덱스, 조인수행원리) (0) | 2019.03.04 |
---|---|
제21회 SQLD 시험 후기 (1) | 2016.06.08 |
[SQLD] 정리 4 ( 반정규화 ) (0) | 2016.06.03 |
[SQLD] 정리 3 (DCL / 절차형 SQL) (0) | 2016.06.02 |
[SQLD] 정리 1 (데이터 모델링의 이해, SQL 기본) (0) | 2016.05.30 |