테이블에 조인을 하는 것을 지정하기 위해 Join이라는 키워드를 사용합니다.
컴마를 사용하여 분리하고 단순히 조인을 위해 여러 테이블을 나열합니다.
*정의
조인되는 두 테이블에서 곱집합을 반환하는 것으로, 두 번재 테이블의 각 행과 첫 번째 테이블의 각 행들이 한 번씩 결합한 열을 만든 것입니다.
레코드를 걸러내기 위해서 어떤 서술어도 적용하지 않지만 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;
여러 줄을 하나의 열로 병합하기 위해 그룹 컨캣 표기붑을 사용합니다.
SELECT DepartmentID, group_concat(LastName) as LastNames
FROM employee
GROUP BY DepartmentID;
SELECT DepartmentID,
listagg(LastName, ', ') WITHIN GROUP (ORDER BY LastName) as LastNames
FROM employee
GROUP BY DepartmentID;
SELECT DepartmentID,
GROUP_CONCAT(LastName ORDER BY LastName SEPARATOR ',') as LastNames
FROM employee
GROUP BY DepartmentID;
질의를 하기 전 함수 _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;