-- 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');
'개발 공부 Today I Learned' 카테고리의 다른 글
[국비 5일차 TIL] 뷰, 시퀀스, 동의어, 제약 조건 (0) | 2023.11.27 |
---|---|
[국비 4일차 TIL] 서브쿼리, DML, DDL, DCL (0) | 2023.11.24 |
[국비 2일차 TIL] 오라클 데이터베이스 함수 (내장, 숫자, 다중행) (1) | 2023.11.22 |
[국비 1일차 TIL] 오라클 SQL 데이터베이스 기초 공부 (1) | 2023.11.21 |
[2023. 11] 비전공자 개발자가 되기 위해 국비 학원 시작 (1) | 2023.11.21 |
댓글