SQL+Joins(inner, outer, cross, theta join)

매일 공부(ML)·2022년 1월 1일
0

ML expert road map

목록 보기
2/3

Intro

  1. 명시적 조인 표현

테이블에 조인을 하는 것을 지정하기 위해 Join이라는 키워드를 사용합니다.

  1. 암시적 조인 표현

컴마를 사용하여 분리하고 단순히 조인을 위해 여러 테이블을 나열합니다.


교차 조인

*정의

조인되는 두 테이블에서 곱집합을 반환하는 것으로, 두 번재 테이블의 각 행과 첫 번째 테이블의 각 행들이 한 번씩 결합한 열을 만든 것입니다.

레코드를 걸러내기 위해서 어떤 서술어도 적용하지 않지만 WHERE구문을 사용하면 더 걸러낼 순 있습니다.

*코드

#명시적 조인 표현

SELECT * 
FROM employee CROSS JOIN department;

# 암시적 조인 표현

SELECT * 
FROM employee, department;

*결과


내부 조인

*정의

가장 흔하게 쓰이는 방식으로, 조인 구문에 2개의 테으블의 컬럼 값을 결합하여 새로운 결과 테이블을 생성합니다.

*질의어

조인 구문을 충족하는 일치되는 결과인 열을 찾기 위해 각 테이블의 열을 비교합니다. 만약 충족이 되면, 각 열의 컬럼 값은 결과 열로 결합 됩니다.

#명시적 조인 표현

SELECT *
FROM employee INNER JOIN department
  ON employee.DepartmentID = department.DepartmentID;


#암시적 조인 표현

SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;


동일 조인

비교자 기반의 조인으로 동등비교만합니다.


SELECT *
FROM employee JOIN department
  ON employee.DepartmentID = department.DepartmentID;
  
  
  
SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;


#USING추가: 동일 조인 내에 컬럼들이 동일하게 갖고 있을 경우

SELECT *
FROM employee INNER JOIN department USING (DepartmentID);

자연조인

동일 조인의 유형으로 동일한 컬럼명을 가진 2개의 테이블의 컬럼들을 비교하여 암시적으로 일어나는 구문으로 조인된 테이블은 동일한 이름을 가진 컬럼의 각 쌍에 대해 단 하나의 컬럼만 포함합니다.

SELECT *
FROM employee NATURAL JOIN department;

#명시적 using구문을 이용하여 권한자 없이 생성


왼쪽외부조인

SELECT *
FROM employee LEFT OUTER JOIN department
  ON employee.DepartmentID = department.DepartmentID;

*오라클 대체 구문

SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID(+)

*사이베이스 대체 구문

SELECT *
FROM employee, department
WHERE employee.DepartmentID *= department.DepartmentID

오른쪽 외부 조인

부가적인 결과 열은 이탤릭체로 표현합니다.

SELECT *
FROM employee RIGHT OUTER JOIN department
  ON employee.DepartmentID = department.DepartmentID;

*오라클 대체 구문

SELECT *
FROM employee, department
WHERE employee.DepartmentID(+) = department.DepartmentID

오른쪽과 왼쪽 외부 조인은 기능적으로 동일하기에 순서만 변경되면 서로 대체가 가능합니다.


완전 외부 조인

SELECT *
FROM employee FULL OUTER JOIN department
  ON employee.DepartmentID = department.DepartmentID;

일부 데이터베이스에선 직접적으로 지원이 되지 않으나 좌우 테이블에서 각 단일 테이블의 열의 내부 조인과 UNION ALL select의 사용을 통해서 비슷하게 구현은 가능합니다.

SELECT employee.LastName, employee.DepartmentID,
       department.DepartmentName, department.DepartmentID
FROM employee
INNER JOIN department ON employee.DepartmentID = department.DepartmentID

UNION ALL

SELECT employee.LastName, employee.DepartmentID,
       cast(NULL as varchar(20)), cast(NULL as integer)
FROM employee
WHERE NOT EXISTS (
    SELECT * FROM department
             WHERE employee.DepartmentID = department.DepartmentID)

UNION ALL

SELECT cast(NULL as varchar(20)), cast(NULL as integer),
       department.DepartmentName, department.DepartmentID
FROM department
WHERE NOT EXISTS (
    SELECT * FROM employee
             WHERE employee.DepartmentID = department.DepartmentID)

자가 조인

자기 자신에 조인을 시키는 것입니다.

SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country
FROM Employee F INNER JOIN Employee S ON F.Country = S.Country
WHERE F.EmployeeID < S.EmployeeID
ORDER BY F.EmployeeID, S.EmployeeID;


병합 열

여러 줄을 하나의 열로 병합하기 위해 그룹 컨캣 표기붑을 사용합니다.


MySQL

SELECT DepartmentID, group_concat(LastName) as LastNames
FROM employee
GROUP BY DepartmentID;

Oracle 11g R2

SELECT DepartmentID,
  listagg(LastName, ', ') WITHIN GROUP (ORDER BY LastName) as LastNames
FROM employee
GROUP BY DepartmentID;

CUBRID

SELECT DepartmentID,
  GROUP_CONCAT(LastName ORDER BY LastName SEPARATOR ',') as LastNames
FROM employee
GROUP BY DepartmentID;

PostgreSQL

질의를 하기 전 함수 _group_concat와 집합 group_concat가 생성됩니다.

CREATE OR REPLACE FUNCTION _group_concat(text, text)
RETURNS text AS $$
SELECT CASE
WHEN $2 IS NULL THEN $1
WHEN $1 IS NULL THEN $2
ELSE $1 operator(pg_catalog.||) ', ' operator(pg_catalog.||) $2
END
$$ IMMUTABLE LANGUAGE SQL;

error// Join SQL
CREATE AGGREGATE group_concat (
BASETYPE = text,
SFUNC = _group_concat,
STYPE = text
);

SELECT DepartmentID, group_concat(LastName) as LastNames
FROM employee
GROUP BY DepartmentID;


#9.0버전

SELECT DepartmentID, string_agg(LastName, ', ') as LastNames
FROM employee
GROUP BY DepartmentID;
profile
성장을 도울 아카이빙 블로그

0개의 댓글