집계함수

이강용·어제

SQLD

목록 보기
10/11

HAVING

HAVING의 개념

  • 그룹화 결과에 조건을 적용하는 절
  • WHERE가 행 조건, HAVING이 그룹 조건
  • 집계함수를 조건으로 쓸 수 있다(WHERE에서는 불가).
  • 상황별 반환 결과
상황반환 결과
GROUP BY 없음 + WHERE 조건 불충족 + COUNT(*)1행 반환(COUNT = 0)
GROUP BY 없음 + WHERE 조건 불충족 + SUM/AVG/MAX/MIN1행 반환(NULL)
GROUP BY 있음 + HAVING 조건 불충족공집합(결과 행 없음)

SELECT 컬럼1, 집계함수)컬럼2
FROM 테이블명
WHERE 행 조건식
GROUP BY 컬럼1
HAVING 그룹 조건식
ORDER BY 컬럼1;

JOIN

JOIN이란

  • 두 개 이상의 테이블을 특정 컬럼 기준으로 연결하는 연산
  • 공통 컬럼(주로 PK-FK)의 값이 일치하는 행끼리 연결
  • JOIN의 필요성
    • EMPLOYEE에는 DEPT_ID만, DEPT_NAME은 DEPARTMENT에 있음
    • 사원 이름과 부서명을 함께 조회하려면 JOIN이 필요
    • JOIN 없이는 두 테이블의 정보를 합칠 수 없음

INNER JOIN

  • 조인 조건을 만족하는 행만 반환하는 조인
  • 조인 컬럼이 NULL이거나 상대 테이블에 매칭이 없는 행은 결과에서 제외
  • JOIN이라고 하면 일반적으로 INNER JOIN을 의미
  • 등가 조인(EquiJoin)
    • 조인 조건에 = 연산자를 사용하는 조인
    • INNER JOIN의 = 조건이 Equi JOIN에 해당
    • INNER JOIN은 =, BETWEEN, <, > 등도 사용 가능하므로 모두 Equi Join은 아님

(2) INNER JOIN

  • Oracle 전통 문법(WHERE 절 조인)

SELECT E.EMP_NAME, E.DEPT_ID, D.DEPT_NAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT_ID;

  • ANSI 표준 문법(JOIN ~ ON)

SELECT E.EMP_NAME, E.DEPT_ID, D.DEPT_NAME
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D ON E.DEPT_ID = D.DEPT_ID;

OUTER JOIN

OUTER JOIN

LEFT OUTER JOIN

  • 왼쪽 테이블의 모든 행을 결과에 포함
  • 오른쪽에 이치 행이 없으면 오른쪽 컬럼을 NULL로 채움
  • OUTER는 생략 가능(LEFT JOIN = LEFT OUTER JOIN)
  • Oracle 전통 문법

SELECT E.EMP_NAME, E.DEPT_ID, D.DEPT_NAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT_ID;

  • ANSI 표준 문법

SELECT E.EMP_NAME, E.DEPT_ID, D.DEPT_MAME
FROM EMPLOYEE E
LEFT OUTER JOIN DEPARTMENT D ON E.DEPT_ID = D.DEPT_ID
ORDER BY E.EMP_ID;

RIGHT OUTER JOIN

  • 오른쪽 테이블의 모든 행을 결과에 포함
  • 테이블 순서를 바꾸면 LEFT OUTER JOIN으로 변환 가능

FULL OUTER JOIN

  • 양쪽 테이블의 모든 행을 결과에 포함
  • LEFT OUTER JOIN과 RIGHT OUTER JOIN을 UNION한 것과 동일
  • Oracle 전통 문법(+)로는 표현할 수 없으며, ANSI 표준 문법을 사용

SELECT E.EMP_NAME,
COALESCE(E.DEPT_ID, D.DEPT_ID) AS DEPT_ID,
D.DEPT_NAME
FROM EMPLOYEE E
FULL OUTER JOIN DEPARTMENT D ON E.DEPT_ID = D.DEPT_ID
ORDER BY COALESCE(E.DEPT_ID, D.DEPT_ID), E.EMP_ID;

  • Oracle에서 FULL OUTER JOIN 대체
SELECT E.EMP_NAME,
       COALESCE(E.DEPT_ID, D.DEPT_ID) AS DEPT_ID,
       D.DEPT_NAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT_ID (+)  -- Left Outer Join

UNION

SELECT E.EMP_NAME,
       COALESCE(E.DEPT_ID, D.DEPT_ID) AS DEPT_ID,
       D.DEPT_NAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_ID (+) = D.DEPT_ID;  -- Right Outer Join 
profile
HW + SW = 1

0개의 댓글