오늘은 이어서 DB 기본문법을 완성하는 날이다.
어제는 조금 힘든 날이었다.
혼자 하는 일과 같이 하는 일의 에너지 소모 차이는 분명히 있는 것 같다.
어쨌든 가끔 그런 날도 있는 거지!
DECODE
- 비교하고자 하는 값 또는 컬럼이 조건식과 같으면 결과 값 반환
- Java의 switch문과 유사
DECODE(계산식 | 컬럼명, 조건 1, 결과 1, 조건 2, 결과 2, ..[, 아무것도 일치 안할 때])
SELECT EMP_NAME, JOB_CODE, SALARY, DECODE(JOB_CODE, 'J7', SALARY*1.1, 'J6', SALARY*1.15, 'J5', SALARY*1.2, SALARY*1.05) AS 지급급여 FROM EMPLOYEE;
CASE
- 비교하고자 하는 값 또는 컬럼이 조건식과 같으면 결과 값 반환
- Java의 if문과 유사
CASE(if문 여는 괄호 역할) WHEN 조건 1 THEN 결과 1 WHEN 조건 2 THEN 결과 2 WHEN 조건 3 THEN 결과 3 .. ELSE 결과 END(if문 닫는 괄호 역할) 별칭
SELECT EMP_ID, EMP_NAME, SALARY, CASE WHEN SALARY >= 5000000 THEN '고급' WHEN SALARY >= 3000000 THEN '중급' ELSE '초급' END 구분 FROM EMPLOYEE WHERE DEPT_CODE = 'D6' ORDER BY JOB_CODE ASC;
그룹 함수
- 하나 이상의 행을 그룹으로 묶어 연산하며 총합, 평균 등을 하나의 컬럼으로 반환하는 함수
- SUM:
해당 컬럼 값들의 총합 반환- AVG:
해당 컬럼 값들의 평균 반환- MAX/MIN:
그룹의 최대값과 최소값 반환- COUNT:
테이블 조건을 만족하는 행의 개수 반환
ORDER BY
- SELECT한 컬럼에 대해 정렬을 할 때 작성하는 구문으로
SELECT 구문의 가장 마지막에 작성하며 실행 순서 역시 가장 마지막에 수행됨
- ASC: 오름차순(기본값)
- DESC: 내림차순
SELECT DEPT_CODE, AVG(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE ORDER BY DEPT_CODE DESC;
SELECT문 해석 순서
- 5) SELECT 컬럼명, 함수, 계산식, 리터럴 [별칭]
1) FROM 테이블명
2) WHERE 조건식
3) GROUP BY 그룹으로 묶을 컬럼명|함수
4) HAVING 그룹함수를 이용한 조건식
6) ORDER BY 컬럼명|별칭|순서 정렬방식 [NULLS FIRST|LAST]
- 해석 순서는 반드시 암기 요망
GROUP BY
- 그룹 함수는 단 한 개의 결과 값만 산출하기 때문에 그룹이 여러 개일 경우 오류 발생
- 여러 개의 결과 값을 산출하기 위해 그룹 함수가 적용될 그룹의 기준을 GROUP BY절에 기술하여 사용
HAVING
- 그룹 함수로 조회할 그룹에 대한 조건을 설정할 때 사용
- GROUP BY가 먼저 선행되어야 함
- WHERE절의 조건식과는 유사하지만 다른 개념
-- 부서별 평균 급여가 300만 원 이상인 부서를 조회 /*4*/SELECT DEPT_CODE, AVG(SALARY) /*1*/FROM EMPLOYEE /*2*/GROUP BY DEPT_CODE /*3*/HAVING AVG(SALARY) >= 3000000 -- GROUP BY에서 묶은 그룹에 조건을 대입 /*5*/ORDER BY 1;
-- 부서별 급여가 300만 원 이상인 사원들의 평균을 조회 /*4*/SELECT DEPT_CODE, AVG(SALARY) /*1*/FROM EMPLOYEE /*2*/WHERE SALARY >= 3000000 -- EMPLOYEE 테이블이 모든 행에 조건을 대입 /*3*/GROUP BY DEPT_CODE /*5*/ORDER BY 1;
집계 함수
- ROLLUP:
인자로 전달받은 그룹 중 가장 먼저 지정한 그룹별로 추가적 집계 결과 반환SELECT DEPT_CODE, JOB_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY ROLLUP(DEPT_CODE, JOB_CODE) ORDER BY 1;
- CUBE:
인자로 지정된 그룹들로 가능한 모든 조합 별로 집계한 결과 반환SELECT DEPT_CODE, JOB_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY CUBE(DEPT_CODE, JOB_CODE) ORDER BY 1;
집합 연산자
- 여러 개의 SELECT 결과물을 하나의 쿼리로 만드는 연산자
- 1) UNION(합집합):
여러 개의 쿼리 결과를 합치는 연산자로 중복된 영역은 제외하여 합침SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' UNION SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000;
- 2) INTERSECT(교집합):
여러 개의 SELECT 결과에서 공통된 부분만 결과로 추출SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' INTERSECT SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000;
- 3) UNION ALL(합집합+교집합):
여러 개의 쿼리 결과를 합치는 연산자로 중복된 영역 모두 포함하여 합침SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' UNION ALL SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000;
- 4) MINUS(차집합):
선행 SELECT 결과에서 다음 SELECT 결과와 겹치는 부분을 제외한 나머지 부분 추출SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' MINUS SELECT EMP_NO, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000;
- 집합 연산은 SELECT절의 타입, 개수, 순서가 동일해야 한다.
- 집합 연산은 2개 이상의 SELECT문에도 사용 가능하다.
SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE WHERE DEPT_CODE = 'D5' UNION SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE WHERE DEPT_CODE = 'D6' UNION SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE WHERE DEPT_CODE = 'D9' UNION -- 타입, 개수, 순서가 동일 SELECT '이름', '부서코드' FROM DUAL;