본문 바로가기
개발 공부 Today I Learned

[국비 3일차 TIL] SQL 함수 - 그룹화, 조인, 서브쿼리

by 개발자신입 2023. 11. 23.
반응형

 

-- GROUP BY

-- 결과 값을 원하는 열로 묶어 출력

-- GROUP BY절에 명시해야지만 SELECT절에서 사용 가능!

 

SELECT AVG(SAL), JOB, DEPTNO

FROM EMP

GROUP BY DEPTNO, JOB

ORDER BY DEPTNO, JOB;

 

-- HAVING

-- GROUP BY와 함께 쓰인다.

-- WHERE절과의 차이점 : WHERE절은 출력 대상 행을 제한, HAVING절은 그룹화 된 대상을 제한

 

SELECT DEPTNO, JOB, AVG(SAL)

FROM EMP

GROUP BY DEPTNO, JOB

    HAVING AVG(SAL) >= 2000

ORDER BY DEPTNO, JOB;

 

-- 실행 순서 --

 

SELECT DEPTNO, AVG(SAL)

FROM EMP

WHERE SAL > 2000

GROUP BY DEPTNO

    HAVING AVG(SAL) > 2000

ORDER BY DEPTNO ;

 

FROM

WHERE

GROUP BY

HAVING

SELECT

ORDER BY

 

 

-- 그룹화와 관련된 함수

 -- ROLLUP

(GROUP BY)보다 더 간결함, 중간 합산을 해줌

 

SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL)

FROM EMP

GROUP BY ROLLUP(DEPTNO,JOB);

 

-- 어느 한 쪽을 먼저 그룹화 한 후, ROLLUP 적용

SELECT DEPTNO, JOB, COUNT(*)

FROM EMP

GROUP BY JOB, ROLLUP(DEPTNO);

 

-- CUBE (부서와 상관없이 직책별 분류)

 

SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL)

FROM EMP

GROUP BY CUBE(DEPTNO, JOB)

ORDER BY DEPTNO, JOB;

 

-- JOIN (FROM절에 여러 테이블 선언하기)

 

-- 간략하게 보기 위해 테이블에 별칭 주기

-- EMP는 E, DEPT는 D로 표현

 

SELECT * FROM EMP E, DEPT D

WHERE E.DEPTNO = D.DEPTNO

ORDER BY EMPNO;

 

-- SELECT절의 * 사용

-- 열이 어떤 순서로 출력될지 명확히 알 수 없어서 수정이 어려울 수 있다.

 

-- 조인 종류

-- 등가 조인(equi join) 이퀴 조인

-- 내부 조인(inner join)

-- 단순 조인(simple join)

-- 비등가 조인(non-equi join)

 

SELECT E.EMPNO, E.ENAME, D.DNAME, D.LOC

FROM EMP E, DEPT D

WHERE E.DEPTNO = D.DEPTNO;

 

SELECT E.EMPNO, E.ENAME, E.SAL

FROM EMP E, DEPT D

WHERE E.SAL < 2500

AND E.EMPNO < 9999;

 

-- 큰 테이블을 만든 뒤, 조건을 걸어준다.

 

SELECT E.ENAME, E.SAL, S.GRADE FROM EMP E, SALGRADE S

WHERE S.LOSAL <= SAL AND S.HISAL >= SAL;

 

SELECT E.ENAME, E.SAL, S.GRADE

FROM EMP E, SALGRADE S

WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

 

-- 테이블 복사하기

-- CREATE TABLE 신규 테이블명 AS SELECT * FROM 복사할 테이블명 [WHERE]

-- [] 대괄호 부분은 있어도 되고 없어도 되는 부분

 

CREATE TABLE EMP_NEW AS SELECT * FROM EMP;

 

 

-- 자체 조인(self join)

-- 같은 테이블인 경우 따로 복사할 필요 없이 별칭만 다르게 해줘도 적용 가능

-- EX) EMP E1, EMP E2

 

-- 외부 조인

-- 왼쪽 외부 조인(LEFT OUTER JOIN) : WHERE TABLE1.COL1 = TABLE2.COL1(+)

-- 오른쪽 외부 조인(RIGHT OUTER JOIN) : WHERE TABLE1.COL1(+) = TABLE2.COL1

-- 같은 테이블을 비교

-- (+)기호는 덤으로 덧붙여주는 의미

-- 원하는 쪽의 내용을 다 나오게 해주는 (+)

-- NULL 값은 안 나오는데 (+)를 붙여주면 전부 보임.

 

SELECT E.EMPNO, E.ENAME, E.MGR, EN.ENAME AS MANAGER

FROM EMP E, EMP_NEW EN

WHERE E.MGR = EN.EMPNO(+);

 

 

-- 서브쿼리 = SELECT

-- SELECT문 안에 들어가있는 SELECT (WHERE절에 들어가있음)

-- () 괄호로 묶어서 사용함

-- ORDER BY절을 사용할 수 없음

-- 서브쿼리로 가능한 것은 JOIN으로도 가능함

 

SELECT ENAME, SAL

FROM EMP

WHERE ENAME = 'JONES';

 

SELECT ENAME, SAL

FROM EMP

WHERE SAL > (SELECT SAL FROM EMP

            WHERE ENAME = 'JONES');

 

-- 조건을 추가하려면 서브쿼리 뒤에 AND를 사용하면 됨

 

SELECT ENAME, SAL, DEPTNO FROM EMP

WHERE SAL > (SELECT AVG(SAL) FROM EMP) AND DEPTNO = 20;

 

-- 다중행 서브쿼리

-- IN

-- ANY, SOME

-- ALL

-- EXISTS

 

SELECT ENAME, SAL, DEPTNO FROM EMP

WHERE ENAME IN ('SCOTT', 'ADAMS');

반응형

댓글