DB - DAY 4

NewTypeAsuka·2023년 3월 9일
0

DB@

목록 보기
5/15

오늘은 이어서 DB 기본문법을 완성하는 날이다.

어제는 조금 힘든 날이었다.

혼자 하는 일과 같이 하는 일의 에너지 소모 차이는 분명히 있는 것 같다.

어쨌든 가끔 그런 날도 있는 거지!

1. 선택 함수

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;

2. 그룹 함수

그룹 함수

  • 하나 이상의 행을 그룹으로 묶어 연산하며 총합, 평균 등을 하나의 컬럼으로 반환하는 함수

  • SUM:
    해당 컬럼 값들의 총합 반환
  • AVG:
    해당 컬럼 값들의 평균 반환
  • MAX/MIN:
    그룹의 최대값과 최소값 반환
  • COUNT:
    테이블 조건을 만족하는 행의 개수 반환

3. GROUP BY와 HAVING 등

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;

4. 집합 연산(Set Operation)

집합 연산자

  • 여러 개의 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;

0개의 댓글