기타/자격증

[SQLD] SQL 활용

Jinn 2023. 11. 14. 02:23
JOIN

여러 개의 테이블을 사용해서 새로운 테이블을 만드는 것

  • EQUI JOIN(등가 조인)
SELECT * FROM emp, dept
WHERE emp.deptno = dept.deptno;

=를 사용해서 테이블을 연결한다.

 

  • INNER JOIN
SELECT * FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno;

ON을 사용해서 테이블을 연결한다.

 

  • INTERSECT 연산
SELECT deptno FROM emp
INTERSECT
SELECT deptno FROM dept;

두 테이블의 교집합을 출력한다.

 

  • Non-EQUI JOIN(비등가 조인)

=을 사용하지 않고 >, <, >=, <= 등을 사용한다.

정확하게 일치하지 않는 것을 조인한다.

 

  • OUTER JOIN

LEFT OUTER JOIN: 두 테이블에서 같은 것을 조회하고 왼쪽 테이블에만 있는 것을 포함해서 조회한다.

RIGHT OUTER JOIN: 두 테이블에서 같은 것을 조회하고 오른쪽 테이블에만 있는 것을 포함해서 조회한다.

 

  • CROSS JOIN
SELECT * FROM emp CROSS JOIN dept;

조건구 없이 테이블을 하나로 조인한다.

카테시안 곱이 발생해서 두 테이블의 행의 수를 곱한만큼의 행이 조회된다.

 

  • UNION 연산

두 테이블을 하나로 합친다. 합치면서 중복을 제거한다. UNION ALL을 사용하면 중복을 제거하지 않는다.

두 테이블의 칼럼수, 데이터 타입이 모두 일치해야 한다.

 

  • MINUS 연산

두 테이블의 차집합을 조회한다.

 

서브쿼리

SELECT문 내에서 또 다른 SELECT문을 사용하는 것

  • WHERE구에 SELECT문 사용
SELECT * FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE deptno = 10);

 

  • FROM구에 SELECT문 사용 (인라인 뷰, Inline view)
SELECT * FROM (SELECT ROWNUM num, ename FROM emp) a
WHERE num < 5;

FROM구에 SELECT문을 사용한 것을 Inline view라고 한다. 가상의 테이블을 만드는 효과가 있다.

 

단일 행 서브쿼리와 다중 행 서브쿼리
단일 행 서브쿼리 - 서브쿼리 실행 결과가 하나의 행만 조회된다.
- 비교 연산자 =, <, >, <=, >=, <>를 사용한다.
다중 행 서브쿼리 - 서브쿼리 실행 결과가 여러 개의 행이 조회된다.
- IN, ANY, ALL, EXISTS를 사용한다.

 

IN(서브쿼리) - 메인쿼리의 비교조건이 서브쿼리의 결과 중 하나라도 동일하면 참이다.
ALL(서브쿼리) - 메인쿼리와 서브쿼리의 결과가 모두 동일하면 참이다.
ANY(서브쿼리) - 메인쿼리와 비교조건이 서브쿼리의 결과 중 하나 이상 동일하면 참이다.
EXISTS(서브쿼리) - 메인쿼리와 서브쿼리의 결과가 하나라도 존재하면 참이다.

 

파티션

대용량의 테이블을 여러 개의 데이터 파일에 나누어 저장한다.

Range 파티션 - 칼럼값의 범위를 기준으로 나누어 저장한다.
- 예) sal 속성값 2000~4000은 Datafile1.dbf에 저장하고 5000~7000은 Datafile2.dbf에 저장한다.
List 파티션 - 특정 값을 기준으로 나누어 저장한다.
- 예) deptno 속성값이 10인 것은 Datafile1.dbf에 저장하고 20인 것은 Datafile2.dbf에 저장한다.
Hash 파티션 - DBMS가 내부적으로 해시함수를 사용해서 나누어 저장한다.

 

파티션 인덱스
Global Index - 여러 개의 파티션에서 하나의 인덱스를 사용한다.
Local Index - 파티션 별로 각자의 인덱스를 사용한다.
Prefixed Index - 파티션 키와 인덱스 키가 동일하다.
Non Prefixed Index - 파티션 키와 인덱스 키가 다르다.

 

윈도우 함수

행과 행 간의 관계를 정의하기 위해서 제공되는 함수이다.

순위, 합계, 편균, 행 위치 등을 조작할 수 있다.

SELECT 윈도우함수() OVER (PARTITION BY 칼럼 ORDER BY 칼럼)
FROM 테이블;​

 

  • 순위 함수
ROW_NUMBER - 동일한 순위에 대해서 고유의 순위를 부여한다. 예) 1, 2, 3, 4
RANK - 동일한 순위는 동일한 값이 부여된다. 예) 1, 2, 2, 4
DENSE_RANK - 동일한 순위를 하나의 건수로 계산한다. 예) 1, 2, 2, 3
  • 집계 함수
SUM - 파티션 별로 합계를 계산한다.
AVG - 파티션 별로 평균을 계산한다.
COUNT - 파티션 별로 행의 수를 계산한다.
MAX, MIN - 파티션 별로 최대값, 최소값을 계산한다.
  • 행 순서 관련 함수
FIRST_VALUE - 파티션에서 가장 처음에 나오는 값을 구한다.
- MIN 함수로 같은 결과를 구할 수 있다.
LAST_VALUE - 파티션에서 가장 나중에 나오는 값을 구한다.
- MAX 함수로 같은 결과를 구할 수 있다.
LAG - 이전 행을 가지고 온다.
LEAD - 특정 위치의 행을 가지고 온다. 기본값 1
  • 비율 관련 함수

 

그룹 함수
  • ROLLUP: GROUP BY 칼럼에 대해서 subtotal을 계산한다.
  • CUBE: 결합 가능한 모든 집계를 계산한다.
  • GROUPING SET: GROUP BY에 나오는 칼럼의 순서와 관계없이 개별적으로 처리한다.
  • GROUPING: 그룹 함수에 의해서 소계, 합계 등이 계산되면 1을 반환하고 그렇지 않으면 0을 반환한다.