책 [SQLD 자격검정 실전문제]과 한종구 강사님의 시험대비 유튜브 강의를 참고하여 공부하며 정리한 내용입니다.
💡조인 JOIN
관계형 데이터베이스의 핵심적인 기능으로, 두 개 이상의 테이블을 하나의 테이블로 결합하는 명령어이다.
조인 방식 설명 INNER JOIN 동일한 데이터의 값을 기준으로 실행되는 JOIN NATURAL JOIN 양 테이블 간 동일한 컬럼명을 기준으로 자동으로 실행되는 INNER JOIN CROSS JOIN 결합하는 테이블 간 조건이 없을 때 실행되는 JOIN OUTER JOIN 기준이 되는 테이블은 다른 테이블에 값이 없어도 실행되는 INNER JOIN
INNER JOIN
INNER JOIN
가장 보편적인 JOIN 방법으로, 테이블 간에 매칭되는 모든 데이터 조합 중 특정 컬럼끼리 값이 같은 것만 출력한다.
INNER는 생략가능하다.SELECT * FROM 테이블 A (INNER) JOIN 테이블 B ON A.COL1 = B.COL2;
NATURAL JOIN
NATURAL JOIN
* 시험에 잘 안나오며 실무에서도 거의 사용하지 않는 방식이라고 한다.
테이블 간에 동일한 이름의 컬럼에 대해 자동으로 실행되는 EQUI JOIN이다.
WHERE절에서 JOIN 조건을 사용하거나, ON절 또는 USING절을 사용할 수 없다.SELECT * FROM 테이블 A NATURAL JOIN 테이블 B;
CROSS JOIN
CROSS JOIN
테이블 간에 동일한 이름의 컬럼에 대해 자동으로 실행되는 EQUI JOIN이다.
WHERE절에서 JOIN 조건을 사용하거나, ON절 또는 USING절을 사용할 수 없다.SELECT * FROM 테이블 A NATURAL JOIN 테이블 B;
OUTER JOIN
OUTER JOIN
기준이 되는 테이블에 매칭되는 값이 없어도 NULL값으로 출력된다.
ORACLE 문법의 경우 콤마와 WHERE절의+
기호로 OUTER JOIN을 표현하며, 기준이 되는 테이블에+
기호를 사용한다.SELECT * FROM 테이블 A LEFT OUTER JOIN 테이블 B ON A.COL1 = B.COL2;
ORACLE 문법)
SELECT * FROM 테이블 A, 테이블 B WHERE A.COL1(+) = B.COL2;
ON
절ON절을 통해 동일하지 않은 이름을 가진 컬럼 간에도 조인 조건을 사용할 수 있다.
- WHERE절과 혼용하여 사용할 수 있다.
USING
절USING절에서는 테이블 간에 데이터 유형도 동일한 공통 컬럼으로 조인 조건을 사용한다.
SELECT * FROM 테이블 A JOIN 테이블 B ON A.COL = B.COL; SELECT * FROM 테이블 A JOIN 테이블 B USING(COL);
데이터 증가
조인으로 인해 데이터가 증가할 수 있기 때문에 신중하게 사용해야 한다.
- 조인 조건을 잘못 설정할 경우 데이터가 증가할 수 있다.
- 중복 데이터가 있을 경우에는 데이터가 증가할 수 있다.
💡서브쿼리 Sub Query
하나의 SQL에 포함되어 있는 또 다른 SQL을 말한다.
SELECT
,FROM
,WHERE
,HAVING
,ORDER BY
,SET
절 등에서 사용 가능하다.- 시작과 끝을 괄호
()
로 감싸서 표현한다.
서브쿼리 설명 단일행 서브쿼리 =
,<
,>
,<>
연산자 사용다중행 서브쿼리 IN
,ALL
,ANY
,EXISTS
연산자 사용
서브쿼리 설명 스칼라 서브쿼리 SELECT
절의 서브쿼리인라인 뷰 FROM
절의 서브쿼리중첩 서브쿼리 WHERE
절의 서브쿼리
스칼라 서브쿼리
SELECT
절에서 사용되는 서브쿼리로, 성능에 매우 불리하다.SELECT COLUMN AS COLA, (SELECT COL2 FROM 테이블 B WHERE B.COL3 = A.COL1) AS COLB FROM 테이블 A;
03_인라인뷰
인라인 뷰
SQL의 핵심이다.
FROM
절에서 사용되는 서브쿼리로, 동적 뷰라고도 한다.SELECT A.COLUMN1 AS COLA, B.COLUMN2 AS COLB FROM 테이블 A, (SELECT COLUMN2, COL FROM 테이블) B WHERE A.COL = B.COL;
EXISTS
/ NOT EXIST
EXISTS
/NOT EXIST
EXISTS
서브쿼리의 결과가 존재한다면 메인쿼리의 결과가 출력된다.# 서브쿼리에 포함되는 데이터만 메인쿼리를 수행하여 출력한다. SELECT * FROM 테이블 A WHERE EXISTS (SELECT * FROM 테이블 B WHERE B.COL = A.COL);
NOT EXISTS
서브쿼리의 결과가 존재하지 않는다면 메인쿼리의 결과가 출력된다.# 서브쿼리에 포함되지 않는 데이터만 메인쿼리를 수행하여 출력한다. SELECT * FROM 테이블 A WHERE NOT EXISTS (SELECT * FROM 테이블 B WHERE B.COL = A.COL);
비등가 조인
조인할 때 특정 범위나 연산자 조건으로도 조인을 수행할 수 있다.
SELECT A.COLA, B.COLB FROM 테이블 A JOIN 테이블 B ON A.COL BETWEEN B.COL1 AND B.COL2
계층형 SQL
계층적인 데이터 구조를 가진 테이블 내에서 데이터를 쉽게 출력하기 위한 SQL 문법
SELECT 컬럼명 FROM 테이블 WHERE 조건 START WITH 시작조건 CONNECT BY [NOCYCLE] PRIOR 관계 방향 ORDER [SIBLINGS] BY 정렬 조건;
START WITH
계층구조의 전개 시작 위치를 설정한다. 즉, 루트 데이터를 지정한다.PRIOR
자식 = 부모
형태면 순방향 전개 (부모 ▶ 자식)부모 = 자식
형태면 역방향 전개 (자식 ▶ 부모)
계층형 SQL 컬럼 및 함수 설명 LEVEL
ROOT부터 한 단계씩 내려가면서 증가하는 번호 CONNECT_BY_LEAF
각 전개별 최하위 리프=1 CONNECT_BY_ISCYCLE
자식 노드가 다시 본인의 부모 노드가 되는 경우=1 SYS_CONNECT_BY_PATH
ROOT로부터 각 행까지 전개된 데이터 경로 CONNECT_BY_ROOT
각 전개한 데이터의 ROOT 데이터
💡그룹 함수
테이블 내 데이터를 각 컬럼별로 그룹화하여 집계하는 함수이다.
UNION
,UNION ALL
등으로 대체 가능하다.
그룹 함수 | 설명 |
---|---|
ROLLUP | 해당 컬럼의 소계 및 총계 출력 |
GROUPING | 컬럼의 소계 여부 출력 |
GROUPING SETS | 집계 대상 컬럼에 대한 소계 출력 |
CUBE | 결합 가능한 모든 경우의 수에 대한 집계 |
ROLLUP
ROLLUP
계층 구조이기 때문에 기준 컬럼이 2개 이상일 때 순서에 따라 출력이 달라진다.
SELECT COL1, COL2, SUM(COL3) AS SUM_COL3 FROM 테이블 GROUP BY ROLLUP (COL1, COL2);
GROUPING SETS
GROUPING SETS
집계 대상 컬럼에 대한 소계를 구하는 그룹 함수로, 기준 컬럼의 순서에 상관없이 결과가 동일하다.
SELECT COL1, COL2, SUM(COL3) AS SUM_COL3 FROM 테이블 GROUP BY GROUPING SETS (COL1, COL2);
CUBE
CUBE
결합 가능한 모든 값에 대한 다차원 집계를 구하는 그룹 함수로, 기준 컬럼의 순서에 상관없이 결과가 동일하다.
* 모든 경우에 대해 집계하기 때문에 다른 함수에 비해 성능상 불리하다.
SELECT COL1, COL2, SUM(COL3) AS SUM_COL3 FROM 테이블 GROUP BY CUBE (COL1, COL2);
(시험에 잘 나오지는 않지만 가끔 나오는 내용들을 위주로 정리하였다.)
💡윈도우 함수
데이터를 분석하거나 통계적인 계산을 하는 함수이다.
- 복잡하게 구해야 하는 로직을 쉽게 처리할 수 있다.
- 함수 자체를 중첩하여 사용할 수 없다.
분류 윈도우 함수 순서, 순위 RANK, DENSE_RANK, ROW_NUMBER
집계, 계산 SUM, AVG, COUNT, MAX, MIN
ROWS, 위치 FRIST_VALUE, LAST_VALUE, LAG, LEAD
백분율, 비율 CIME_DIST, RATIO_TO_REPORT, PERCENT_RANK, NTILE
SELECT COL1, COL2, ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) AS 행번호 DENSE_RANK() OVER (PARTITION BY COL1 ORDER BY COL2) AS 순서 SUM(COL2) OVER (PARTITION BY COL1) AS 합계 FROM 테이블;
SUM
과 ORDER BY
SUM
SUM
의 경우ORDER BY
를 사용할 경우 누적합계를 계산할 수 있다.SELECT COL1, COL2, SUM(COL2) OVER (PARTITION BY COL1 ORDER BY COL2) AS 누적합계 SUM(COL2) OVER (PARTITION BY COL1) AS 합계 FROM 테이블;
NTILE
NTILE
파라미터 값(N)으로 등분하여 포함되는 구간값을 출력한다.
SELECT COL1, COL2, NTILE(3) OVER (PARTITION BY COL1 ORDER BY COL2) AS 3구간 FROM 테이블;
2과목 2장에서는 SQL의 활용에 대해 소개하였다.
SQL의 활용 방법으로 조인, 서브쿼리, 함수 등을 소개하였다. 어떤 함수가 어떠한 성격을 가지고 있는지를 알고 있는 것이 중요할 것 같다.
많은 종류의 함수가 나오다보니 단순 암기보다는 실습을 통해 익히는 것이 가장 효과적이니까 직접 실습해보는 것을 추천한다.
핵심내용만 요약되어있어 짧은 시간에 보기 매우 유용했습니다.