🔍 Inline View에서는 연관 서브 쿼리를 활용할 수 없음
SELECT C.광고매체명, B.광고명, A.광고시작일자
FROM 광고게시 A, 광고 B, 광고매체 C, [ㄱ] D
WHERE A.광고시작일자 = D.광고시작일자
AND A.광고매체ID = D.광고매체ID
AND A.광고ID = B.광고ID
AND A.광고매체ID = C.광고매체ID
ORDER BY C.광고매체명;
ㄱ 에 다음과 같은 연관 서브 쿼리를 활용하는 방법은 적용될 수 없는 점 유의
SELECT D.광고매체ID, MIN(D.광고시작일자) AS 광고시작일자
FROM 광고게시 D
WHERE D.광고매체ID = C.광고매체ID
GROUP BY D.광고매체ID
🔍 GROUP BY 절은 NULL 데이터도 집계에 포합합니다.
🔍 기본적인 정렬 순서는 오름차순(ASC) 입니다.
🔍 오라클에서는 NULL 값을 가장 큰 값으로 간주합니다. 즉, 오름차순 정렬일 경우 가장 마지막에 위치합니다.
🔍 SQL Server에서는 NULL 값을 가장 작은 값으로 간주합니다. 즉, 오름차순 정렬일 경우 가장 앞쪽에 위치합니다.
🔍 여러 테이블로부터 필요한 칼럼을 조회하기 위해 전체 테이블 개수에서 최소 N-1 개만큼의 JOIN 조건이 필요합니다.
🔍 NULLIF(표현식1, 표현식2) 함수는 표현식 1, 표현식 2가 같으면 NULL, 아니면 표현식 1을 반환합니다.
🔍 NVL(인수1, 인수2) 함수는 인수1이 NULL이면 인수2를 반환하고, NULL이 아니면 그대로 인수1을 반환합니다.
🔍 USING 조건절을 이용한 EQUI JOIN 에서도 JOIN 칼럼에 대해 ALIAS나 테이블 이름 같은 접두사를 붙일 수 없습니다.
USING T.STADIUM_ID = S.STADIUM_ID
-> USING(STADIUM_ID)
🔍 CROSS JOIN 은 테이블 간 조건이 없는 경우 생길 수 있는 모든 데이터 조합을 말합니다.
🔍 UNION 결과물의 컬럼명은 첫번 째 테이블의 컬럼명을 따라갑니다.
🔍 집합 연산자를 사용한 SQL의 ORDER BY 절은 가장 마지막 줄에 한번만 사용할 수 있습니다.
🔍 SET OPERATOR (수직 결합) 종류
1) UNION : 합집합
2) INTERSECT : 교집합
3-1) MINUS : 차집합 (ORACLE)
3-2) EXCEPT : 차집합 (SQL-SERVER)
4) UNION ALL : 합집합 (ALL만 중복 인정)
SET OPERATOR 이용한 결합은 위치 기반(POSITIONAL 방식) 결합을 실시합니다.
복수의 SET OPERATOR의 경우 위, 아래 - 위, 아래 순서로 연산이 이루어집니다.
🔍 전체 합계와 동시에 그룹별 합계를 한번에 구하고 싶은 경우 ROLLUP, CUBE, GROUPING SETS 함수를 사용합니다.
🔍 CUBE 함수와 ROLLUP 함수는 인자가 1개일 때는 결과가 동일합니다.
ROLLUP 함수 : 하나씩 증가하는 형태
GROUP BY ROLLUP(A) - 전체 합계, 칼럼 A소계
GROUP BY ROLLUP(A, B) - 전체 합계, 칼럼 A소계, 칼럼 A, B 조합 소계
CUBE 함수 : 모든 가능한 것
GROUP BY CUBE(A) - 전체 합계, 칼럼 A 소계
GROUP BY CUBE(A, B) - 전체 합계, 칼럼 A 소계, 칼럼 B 소계, 칼럼 A, B 조합 소계
* 가능한 모든 조합의 소계 및 합계를 생성하기 때문에 시스템에 무리가 갈 수 있다.
GROUPING SETS 함수
GROUP BY GROUPING SETS(A) - 칼럼 A 소계
GROUP BY GROUPING SETS(A, B) - 칼럼 A 소계, 칼럼 B 소계
🔍 계층형 질의
START WITH : 계층 구조 전개의 시작 위치 지정
CONNECT BY : 다음에 전개 될 자식 데이터 지정
PRIOR : CONNECT BY 절에 사용되며, 현재 읽은 칼럼을 지정
PRIOR 자식 = 부모 형태를 사용하면 계층 구조에서 부모->자식 방향으로 전개하는 순 방향 전개를 함
반대는 역 방향 전개
NOCYCLE : 동일한 데이터가 전개되지 않음
ORDER SIBLINGS BY : 형제 노드 간의 정렬 수행
LEVEL : 루트 데이터면 1, 그 하위 데이터면 2, LEAF 데이터까지 1씩 증가
CONNECT_BY_ISLEAF : 해당 데이터가 리프 데이터면 1, 아니면 0
CONNECT_BY_ISCYCLE : 해당 데이터가 조상이면 1, 아니면 0 (CYCLE 옵션 사용했을 시에만 사용 가능)
SYS_CONNECT_BY_PATH : 루트 데이터부터 현재 전개할 데이터까지 경로 표시
CONNECT_BY_ROOT : 현재 전개할 데이터의 루트 데이터를 표시 (단항 연산자)
🔍 다중 칼럼 서브 쿼리는 서브쿼리 결과로 여러 개의 칼럼이 반환되어 메인 쿼리의 조건과 비교되는데,
SQL Server에서는 현재 지원하지 않는 기능입니다.
🔍 윈도우 함수 모음
[순위 관련 함수]
- RANK
: 파티션 내의 ORDER BY에 의한 순위를 구하는 함수로 동일한 순위에 대해 동일한 순위를 부여 ex) 1, 2, 2, 4
- DENSE_RANK
: 순위를 구하는 함수로 동일한 순위를 하나의 등수로 취급 ex) 1, 2, 2, 3
- ROW_NUMBER
: 동일한 값이라도 고유한 순위 부여 ex) 1, 2, 3, 4
[집계 관련 함수]
- SUM
- MAX, MIN
- AVG
- COUNT
[행 순서 관련 함수] - SQL Server 지원 X
- FIRST_VALUE
: 파티션 별 윈도우의 처음 값
- LAST_VALUE
: 파티션 별 윈도우의 마지막 값
- LAG
: 파티션 별 윈도우에서 이전 몇 번째 행의 값
- LEAD
: 파티션 별 윈도우에서 이후 몇 번째 행의 값
[비율 관련 함수]
- RATIO_TO_REPORT
: 파티션 내 주어진 칼럼 값의 합계에 대한 행별 백분율을 소수점으로 구하는 함수
- PERCENT_RANK
: 파티션 별 윈도우에서 제일 먼저 나오는 것을 0으로 제일 늦게 나오는 것을 1로 하여 값이 아닌 행의 순서별 백분율을 구함
- CUME_DIST
: 파티션 별 윈도우의 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 구하는 함수
- NTILE
: 파티션 별 전체 건수를 주어진 인자로 N등분한 결과를 반환
🔍 GROUP BY 및 집계함수를 사용하지 않고 HAVING 절을 사용한다고 해서 SQL 문장 오류가 발생하지 않습니다.
🔍 단일 행 서브쿼리의 비교 연산자는 다중 행 서브쿼리 비교 연산자로 사용할 수 없지만 반대의 경우는 가능합니다.
🔍 실제 데이터를 저장하고 있는 뷰를 생성하는 기능을 지원하는 DBMS도 있습니다.
🔍 뷰의 특징 및 사용 장점
테이블은 실제 데이터를 가지고 있는 반면, 뷰는 실제 데이터를 가지고 있지 않습니다. (가상 테이블)
뷰는 실행 시점에 SQL 재작성하여 수행됩니다.
1. 독립성
: 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 됩니다.
2. 편리성
: 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있습니다.
3. 보안성
: 직원의 급여 정보와 같이 숨기고 싶은 정보가 존재할 때 사용할 수 있습니다.
🔍 산술 연산자의 우선 순위는 (), *, /, +, - 의 우선순위를 가집니다.
🔍 DROP과 TRUNCATE는 Auto Commit, DELETE은 사용자 Commit으로 수행됩니다.
DROP | TRUNCATE | DELETE |
DDL | DDL (일부 DML 성격 가짐) | DML |
Rollback 불가능 | Rollback 불가능 | Commit 이전 Rollback 가능 |
Auto Commit | Auto Commit | 사용자 Commit |
테이블이 사용했던 Storage 모두 Release | 테이블 사용했던 Storage 중 최초 테이블 생성 시 할당 된 Storage만 남기고 Release | 데이터를 모두 Delete 해도 사용했던 Storage는 Release 되지 않음 |
테이블의 정의 자체를 완전 삭제 | 테이블을 최소 생성된 초기 상태로 만듦 | 데이터만 삭제 |