51일차 - SQL (조인)

Yohan·2024년 5월 3일
0

코딩기록

목록 보기
73/156
post-custom-banner

ANSI 표준 조인

SQL에서 테이블 간의 연결을 정의하는 방법 중 하나로, ANSI(SQL 표준을 개발한 기구)에서 제시한 표준화된 형식

ANSI 조인의 종류

INNER JOIN

  • 두 테이블 간에 연관컬럼을 이용하여 관계가 있는 데이터를 매칭하여 조인

OUTER JOIN

  1. 조인 조건을 만족하지 않는 행들도 조회할 때 사용하는 조인기법
  2. OUTER조인 연산자 기호는 (+)기호
  3. INNER조인은 조인 조건을 만족하지 않으면 해당 행을 조회하지 않지만 OUTER JOIN은 방향(LEFT, RIGHT, FULL)에 맞게 조건에 매칭되지 않는 행들도 모두 NULL로 처리해서 조회
  4. OUTER 생략 가능 (LEFT OUTER JOIN = LEFT JOIN, RIGHT OUTER JOIN = RIGHT JOIN)

LEFT OUTER JOIN

  • 조인되는 왼쪽 테이블은 모두 조회하고, 오른쪽 테이블은 조인조건에 매칭된 것만 조회

RIGHT OUTER JOIN

  • 조인되는 오른쪽 테이블은 모두 조회하고, 왼쪽 테이블은 조건에 매칭된것만 조회

FULL OUTER JOIN

  • 왼쪽 조인테이블, 오른쪽 조인테이블을 모두 보여주고 매칭되면 매칭데이터까지 합쳐서 보여줌

ON (ANSI 표준 조인)

  1. FROM절 뒤, WHERE 절 앞
  2. JOIN 키워드 뒤에는 조인할 테이블명을 명시
  3. ON 키워드 뒤에는 조인 조건을 명시
  4. 조인 조건 서술부(ON절) 일반 조건 서술부 (WHERE절)를 분리해서 작성하는 방법
  5. ON절을 이용하면 JOIN 이후의 논리연산이나 서브쿼리와 같은 추가 서술이 가능
-- 사원이 46명, 부서가 16개
-- 부서에 소속된 사원이 41명
-- 사원이 존재하는 부서 14명
-- INNER JOIN의 결과 : 사원정보조회 41건
-- LEFT JOIN : INNER 41건 + 부서가 없는 사원 5 = 46건
-- RIGHT JOIN : INNER 41건 + 사원이 없는 부서 2 = 43건
-- FULL JOIN : INNER 41 + 5 + 2 =48건

오라클 조인

SQL문의 WHERE 절에서 조인 조건을 명시하는 방식

  • 일반적으로 ANSI 표준 조인을 사용하는 것이 더 좋다.

오라클 조인의 종류

  1. 오라클 INNER JOIN: 두 테이블 간의 일치하는 행만 결과에 포함합니다. 이 경우, WHERE 절에서 두 테이블의 컬럼이 일치하는 조건을 명시
  2. 오라클 OUTER JOIN: 왼쪽 테이블의 모든 행을 결과에 포함하며, 오른쪽 테이블에서 일치하는 행이 없는 경우 NULL 값을 사용합니다. 이 경우, WHERE 절에서 (+) 기호를 사용하여 조인 조건을 명시
    -> LEFT OUTER JOIN일 경우 오른쪽에 +, RIGHT OUTER JOIN 일 경우에는 왼쪽에 +
// LEFT OUTER JOIN
SELECT
  column1, column2, ...
FROM
  table1, table2
WHERE
  table1.column = table2.column(+);

// RIGHT OUTER JOIN
SELECT
  column1, column2, ...
FROM
  table1, table2
WHERE
  table1.column(+) = table2.column;

NATURAL JOIN과 USING절

NATURAL JOIN

  1. 동일한 이름을 갖는 컬럼들에 대해 자동으로 조인조건을 생성
  2. 즉, 자동으로 2개 이상의 테이블에서 같은 이름을 가진 컬럼을 찾아 INNER조인을 수행
  3. 이 때 조인되는 동일 이름의 컬럼은 데이터 타입이 같아야 하며, 별칭이나 테이블명을 자동 조인 컬럼 앞에 표기하면 안됨
SELECT 
    A.emp_no, A.emp_nm, dept_cd, B.dept_nm
--    *
FROM tb_emp A
NATURAL JOIN tb_dept B -- 공통부분인 dept_cd에는 테이블명 표기 X
;
  1. SELECT * 문법을 사용하면, 공통 컬럼은 집합에서 한번만 표기
  2. 공통 컬럼이 n개 이상이면 조인 조건이 n개로 처리
// employees와 departments의 공동 컬럼으로 조인
SELECT
  employees.id, employees.name, departments.department_name
FROM
  employees
NATURAL JOIN
  departments;

USING 절

  1. 명시적으로 일치하는 컬럼 이름을 지정하여 JOIN을 수행
  2. USING을 사용하면 원하는 컬럼에 대해서면 선택적 조인조건 부여 가능
  3. USING절에서도 조인 컬럼에 대해 별칭이나 테이블명을 표기하면 안됨
SELECT
  employees.id, employees.name, departments.department_name
FROM
  employees
JOIN
  departments
USING (department_id);

Cross Join

  • 두 테이블의 모든 가능한 조합을 반환하는 조인 방식
  • 두 테이블 간의 카디션 곱(Cartesian Product)을 생성
SELECT
  products.product_name, colors.color_name
FROM
  products
CROSS JOIN
  colors;

Self Join

  • 테이블을 자기 자신과 조인하는 방식, 주로 테이블 내에서의 계층적이거나 순환적인 관계를 표현할 때 사용. 하나의 테이블에서만 필요한 정보를 비교하거나 결합가능
  • 테이블에 별칭을 사용하여, 같은 테이블의 두 개의 인스턴스로 취급되게끔 하여 테이블 간의 조인처럼 작업을 수행할 수 있음
SELECT
  e1.name AS employee_name, e2.name AS manager_name
FROM
  employees AS e1
INNER JOIN
  employees AS e2
ON
  e1.manager_id = e2.id;

전체 구조

SELECT [DISTINCT] { 열이름 .... } 
FROM  테이블 또는 뷰 이름
JOIN  테이블 또는 뷰 이름
ON    조인 조건
WHERE 조회 조건
GROUP BY  열을 그룹화
HAVING    그룹화 조건
ORDER BY  정렬할 열 [ASC | DESC];
profile
백엔드 개발자
post-custom-banner

0개의 댓글