JOIN

이강용·약 15시간 전

SQLD

목록 보기
11/11

CROSS JOIN/SELF JOIN

CROSS JOIN

  • 두 테이블의 모든 행 조합을 반환하는 조인
  • 결과 행 수는 두 테이블 행 수의 곱
  • 카테시안 곱(Cartesian Product)이라고도 함
  • 조인 조건을 빠뜨리면 의도치 않은 CROSS JOIN이 발생

CROSS JOIN

  • Oracle 전통 문법
SELECT E.EMP_NAME, D.DEPT_NAME
FROM EMPLOYEE E, DEPARTMENT D;
  • WHERE 조건이 없으면 자동으로 카테시안 곱이 발생

  • ANSI 표준 문법

SELECT E.EMP_NAME, D.DEPT_NAME
FROM EMPLOYEE E
   CROSS JOIN DEPARTMENTD D;

SELF JOIN

  • 같은 테이블을 두 번 조인하는 방식
  • 반드시 서로 다른 별칭을 사용해야 함
  • 계층 구조나 자기참조 컬럼이 있을 때 사용
  • EMPLOYEE의 MANAGER_ID는 EMP_ID를 참조하는 자기 참조 컬럼임

ON절

  • JOIN 조건을 ON 절에 명시하는 ANSI 표준 문법
  • 조인 조건과 행 필터 조건을 분리할 수 있음
  • 컬럼명이 달라도 사용 가능
  • ON 절에서 테이블 별칭을 사용할 수 있음

USING 절

  • 공통 컬럼명만 명시해 조인하는 방법
  • 컬럼명을 반드시 괄호로 묶음
  • USING 컬럼에는 테이블명·별칭을 붙일 수 없음

USING절 주의사항

  • USING 컬럼에 테이블명·별칭을 붙이면 오류가 발생
  • SELECT E.DEPT_ID FROM EMPLOYEE E JOIN DEPARTMENT D USING(DEPT_ID) -> 오류
  • SELECT E.DEPT_ID FROM EMPLOYEE JOIN DEPARTMENT USING(DEPT_ID) -> 정상

NATURAL JOIN

  • 공통 컬럼을 자동으로 찾아 모두 조인 조건으로 사용
  • ON·USING 절과 함께 사용할 수 없음
  • 조인 컬럼에는 테이블명·별칭을 붙일 수 없음

서브쿼리의 개념과 분류

서브쿼리란?

  • 서브쿼리는 SQL문 안에 포함되어 실행되는 또 다른 SELECT 문
  • 서브쿼리를 포함하는 바깥쪽 SQL 문을 메인쿼리라고 함
  • 메인쿼리에 필요한 값을 계산하거나, 비교 대상을 제공
  • 서브쿼리는 반드시 괄호 ()로 감싸야함
  • 서브쿼리 안에 또 다른 서브 쿼리를 중첩할 수 있음
  • 서브쿼리에는 일반적으로 ORDER BY 절을 사용할 수 없음
    • 단, 인라인 뷰의 TOP-N 처리에는 예외적으로 사용
SELECT 컬럼
   FROM 테이블
   WHERE 컬럼 비교 연산자(SELECT ... FROM ... WHERE...),
절분류 명칭용도
SELECT 절스칼라 서브쿼리 (Scalar Subquery)메인 쿼리의 컬럼 위치에서 단일 값(단일 행, 단일 열)을 반환하여 연산이나 출력에 사용
FROM 절인라인 뷰 (Inline View / Derived Table)임시 테이블 형태로 결과를 생성하여 주로 조인 대상이나 가상의 테이블로 사용
WHERE 절중첩 서브쿼리 (Nested Subquery)조건절에서 데이터를 필터링하기 위한 비교 기준으로 사용 (단일 행, 다중 행, 연관 서브쿼리 등)
HAVING 절그룹 조건 서브쿼리그룹화(GROUP BY)된 결과에 대한 집계 조건(HAVING)에서 필터링 기준으로 사용
INSERT / UPDATE / DELETEDML 문장 내 서브쿼리데이터를 삽입(SELECT 결과를 INSERT), 수정(SET 절에서 값 변경), 삭제(WHERE 절 조건)할 때 사용

단일행 서브쿼리

(1) 단일행 서브쿼리의 개념과 연산자

  • 단일행 서브쿼리는 결과가 1행 1열로 반환되는 서브쿼리
  • 단일 값과 비교하므로 단일행 비교 연산자(=, <>,>,<,>=,<=)를 사용
  • 집계함수(MAX, MIN, AVG 등)를 쓰면 자연스럽게 1행 1열이 반환
  • 결과가 2행 이상이면 오류가 발생
  • 공집합인 경우 집계 함수는 NULL 1행을 반환하며, =비교는 UNKNOWN이 됨
SELECT 컬럼
   FROM 테이블
   WHERE [=|<>\>|<|>=|<=](SELECT 단일값 FROM 테이블)
profile
HW + SW = 1

0개의 댓글