
SELECT * FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
# 이처럼 동일한 컬럼을 기준으로 합친다.
SELECT * FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.ENAME LIKE '임%'
ORDER BY ENAME;
# 추가적인 조건을 걸수도 있다 -> 임~ 인 튜플만 출력됨
EQUI JOIN과 마찬가지로 ISO 표준 SQL이다.
INNER JOIN은 ON문을 사용하여 테이블을 연결한다.
그냥 EQUI JOIN과 동일하다고 보면 됨
SELECT * FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO
AND EMP.ENAME LIKE '임%'
ORDER BY ENAME;
두 개의 테이블에서 교집합을 조회한다.
SELECT DEPTNO FROM EMP
INTERSECT
SELECT DEPTNO FROM DEPT;
# EMP와 DEPT의 DEPTNO에서 동일한 값을 조회



SELECT * FROM EMP CROSS JOIN DEPT;
SELECT DEPTNO FROM EMP
UNION
SELECT DEPTNO FROM EMP;
SELECT DEPTNO FROM EMP
UNION ALL
SELECT DEPTNO FROM EMP;
# 위는 20, 30, 40 아래는 20, 30, 30, 20, 40
SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM EMP;
# 40
SELECT * FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM DEPT
WHERE DEPTNO = 10);
# WHERE 안의 SELECT문을 서브쿼리라고 하며 밖의 SELECT문은 메인쿼리라고 한다.
SELECT ENAME, DNAME, SAL FROM EMP, DEPT
WHERE EMP.DEPTNO-DEPT.DEPTNO AND EMP.EMPNO
IN (SELECT EMPNO FROM EMP WHERE SAL > 2000);
# EMP에서 급여가 2000이 넘는 사원을 조회하고 메인쿼리의 사원번호와 비교하여 같은것만 조회
SELECT * FROM EMP
WHERE DEPTNO <= ALL (20, 30);
# DEPTNO가 20,30 보다 작거나 같으면 조회
SELECT ENAME, DNAME, SAL FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
AND EXISTS (SELECT 1 FROM EMP WHERE SAL > 2000);
# 급여가 2000보다 큰 직원이 있으면 AND 뒷 내용이 TRUE
SELECT ENAME, SAL, (SELECT AVG(SAL) FROM EMP) AS "평균급여" FROM EMP
WHERE EMPNO = 1000;
# 괄호 안 SELECT문은 한 행 및 한 칼럼만 조회 됨
SELECT DECODE (DEPTNO, NULL, '전체합계', DEPTNO), SUM(SAL) FROM EMP
GROUP BY ROLLUP(DEPTNO);
# GROUP BY로 부서별 급여합계를 구하고 ROLLUP을 통해 부서별 전체 합계를 추가로 계산한다.
# DECODE문을 통해 DEPTNO가 NULL이면 전체합계를 출력한다.
SELECT DEPTNO, GROUPING(DEPTNO), JOB, GROUPING(JOB), SUM(SAL) FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);
# 소계와 합계로 계산된 데이터는 GROUPING 출력이 1로 나온다.
SELECT DEPTNO, DECODE(GROUPING(DEPTNO), 1, '전체합계') TOT,
JOB, DECODE(GROUPING(JOB), 1, '전체합계') T_DEPT), SUM(SAL) FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);
# 이를 이용해 DECODE문에 활용 가능하다.
SELECT DEPTNO, JOB, SUM(SAL) FROM EMP
GROUP BY GROUPING SETS(DEPTNO, JOB);
SELECT DEPTNO, JOB, SUM(SAL) FROM EMP
GROUP BY CUBE(DEPTNO, JOB);
# 전체합계, 직업별 합계, 부서별 합계, 부서별 직업별 합계 모두 조회
SELECT WINDOW_FUNCTION(ARGUMENTS) OVER(PARTITION BY 칼럼 ORDER BY WINDOWING절) FROM 테이블명;
SELECT EMPNO, ENAME, SAL
SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING) TOTSAL FROM EMP;
# PRECEDING은 첫번째 행, FOLLOWING은 마지막 행이므로 모든 합계를 계산
SELECT EMPNO, ENAME, SAL
SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND
CURRENT ROW) TOTSAL FROM EMP;
# PRECEDING은 첫번째 행, FOLLOWING은 현재 행이므로 계속해서 누적합계가 계산
SELECT EMPNO, ENAME, SAL
SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN CURRENT ROW AND
UNBOUNDED FOLLOWING) TOTSAL FROM EMP;
# 따라서 이처럼 적으면 현재행부터 마지막까지의 합계를 계산
RANK : 특정항목 및 파티션에 대해 순위를 계산, 동일한 순위는 동일한 값 부여
DENSE_RANK : 동일한 순위를 하나의 건수로 계산
ROW_NUMBER : 동일한 순위에 대해서 고유의 순위를 부여
SELECT ENAME, SAL,
RANK() OVER (ORDER BY SAL DESC) ALL_RANK,
RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK FROM EMP
# ALL_RANK는 SAL로 등수를 계산하고 내림차순으로 조회
# JOB_RANK는 JOB으로 파티션을 만들고 JOB별 순위를 조회
SELECT ENAME, SAL, SUM(SAL) OVER (PARTITION BY MGR) SUM_MGR FROM EMP;
# 같은 관리자에 파티션을 만들고 합계를 계산
SELECT DEPTNO, ENAME, SAL,
FIRST VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC
ROWS UNBOUNDED PRECEDING) AS DEPT_A FROM EMP;
# 파티션에서 조회된 행 중 첫 번째 값을 가지고 온다.
# SAL 내림차순으로 조회하였으므로 의미상 가장 급여가 많은 사원이 조회된다.
SELECT DEPTNO, ENAME, SAL,
LAST VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWTING) AS DEPT_A FROM EMP;
# 파티션에서 조회된 행 중 마지막 값을 가지고 온다.
# 현재 행에서부터 마지막 행까지의 파티션에 대해 조회하므로 어쨌든 마지막 행
SELECT DEPTNO, ENAME, SAL,
LAG(SAL) OVER(ORDER BY SAL DESC) AS PRE_SAL FROM EMP;
# 이전 값을 가져온다.
# SAL 칼럼을 한칸씩 아래로 땡겨서 PRE_SAL에 출력한다고 보면 됨
SELECT DEPTNO, ENAME, SAL,
LEAD(SAL,2) OVER(ORDER BY SAL DESC) AS PRE_SAL FROM EMP;
# 지정된 위치의 값을 가져온다.
# 여기서는 SAL 칼럼의 2번째 값을 가져온다.
SELECT DEPTNO, ENMAE, SAL,
PERCENT RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS PERCENT_SAL FROM EMP;
# 같은 부서에서 자신의 급여 퍼센트를 구한다
SELECT DEPTNO, ENMAE, SAL,
NTILE(4) OVER(ORDER BY SAL DESC) AS N_TILE FROM EMP;
# 급여가 높은 순으로 4개로 나누어 분류한다.