두 개 이상의 테이블에서 행을 결합하는 방법이다.
관계형 데이터 베이스에서 중요한 기능 중에 하나로
테이블 간의 관계를 이용해서 새로운 테이블로서 저장되거나,
그 자체로서 이용할 수 있는 결과 셋을 만들어 낸다.
관계형 데이터 베이스의 구조적 특징으로 정규화를 수행하면
테이블이 여러개로 나눠지게 되고
이 테이블 끼리는 관계(Relationship)을 갖게 된다.정규화를 함으로써 관계형 데이터베이스는 중복성을 줄이고 이상현상을 해결할 수 있는데
이로 인해서 저장 공간과 확장성이 향상되게 된다.
또한 이런 나눠진 테이블에서 각 테이블에 저장된 데이터를 효과적으로 검색하기 위해
JOIN 이 필요하다.
두 테이블의 교집합을 반환한다.
즉, JOIN 조건에 만족하는 행만 반환한다.
테이블에 조인을 하라는 것을 지정하기 위해 JOIN 키워드를 사용한다.
다음 예제와 같이 ON 키워드에 JOIN에 대한 구문을 지정하는데 사용한다.SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID;
SELECT 구문의 FROM 절에서 그것들을 분리하는 컴마를 사용해서
단순히 조인을 위한 여러 테이블을 나열하기만 한다SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID;
조인 구문에서 동등 비교만 사용한다.
다른 비교연산자<와 같은
를 사용하는 것은 동등 조인으로서의 조인 자격을 박탈하는 것이다.
동등 조인의 결과 릴레이션의 차수는
첫 번째 릴레이션과 두 번째 릴레이션의 차수를 합한 것.
동등 조인의 한 유형으로 조인 구문이 조인된 테이블에서
동일한 컬럼 명을 가진 2개의 테이블에서 모든 컬럼을 비교함으로써,
암시적으로 일어나는 구분이다.
결과적으로 나온 자연 조인 테이블은
동일한 이름의 컬럼의 각 쌍에 대한 하나의 컬럼만 포함하고 있다.
자연 조인은 반드시 두 테이블 간에 동일한 이름의 속성이 있어야 사용할 수 있다.
INNER JOIN과 달리 조인 조건에 맞지 않는 행들도 결과에 포함시킨다.
이는 한쪽 테이블에는 값이 존재하지만
다른 테이블에는 값이 존재하지 않을 때 유용하게 사용될 수 있습니다.
왼쪽 테이블의 모든 행과 오른쪽 테이블에서 JOIN 조건을 만족하는 행만 반환한다.
만약 오른쪽에 일치하는 행이 없다면 NULL 값을 반환한다.
오른쪽 테이블의 모든행과 왼쪽 테이블에서 JOIN 조건을 만족하는 행만 반환한다.
만약 왼쪽 테이블에 일치하는 행이 없다면 NULL 값을 반환한다.
두 테이블의 합집합을 반환한다.
즉, JOIN 조건에 만족하지 않는 행도 포함하여 왼쪽과 오른쪽의 테이블의 모든 행을 반환한다.
"Employees" 테이블과 "Departments" 테이블 간의 공통된
DepartmentID
를 기준으로 조인을 수행
JOIN 전
INNER JOIN 후
OUTER JOIN 후
데이터베이스에서 동일한 테이블을 자체적으로 조인하는 것을 의미한다.
즉, 하나의 테이블을 여러 번 복사하여
각각의 복사본을 서로 다른 별칭(alias)을 사용하여 조인하는 것이다.
SELF JOIN 테이블 내의 데이터를 비교하거나
계층 구조를 처리하는 등의 경우에 유용하게 사용된다.
일반적으로 테이블 내의 관계를 나타내기 위해 사용된다.
예를 들어, "Employees" 테이블에서
각 직원의 상사를 나타내는 "ManagerID" 열이 있다고 가정하자.이 경우 Self Join을 사용하여 각 직원과 그 직원의 상사를 연결할 수 있다.
예시
SELF JOIN QUERY
SELECT e.EmployeeName AS Employee, m.EmployeeName AS Manager FROM Employees e LEFT JOIN Employees m ON e.ManagerID = m.EmployeeID;
SELF JOIN 전
SELF JOIN 후
SQL을 어떻게 작성하느냐에 따라 성능이 크게 좌우한다.
어떤 질이를 수행할 것인지 명확하게 정의한 후, 비효율을 제거하여 최적의 SQL 을 작성해야한다.
조인 조건이 명확하지 않을 경우,
의도치 않게CROSS JOIN(Cartesian Product)
가 수행될 수 있다.
CROSS JOIN(Cartesian Product)
두 개 이상의 테이블을 조인하지 않고, 단순히 테이블 간의
모든 가능한 행의 조합
을 생성합니다.각 테이블의 모든 행과 조합되기 때문에
결과 테이블의 크기는 조인하는 테이블의 행의 수를 모두 곱한 값이 된다.이러한 이유로 Cartesian Product는 테이블의 크기가 큰 경우
결과가 매우 커질 수 있으며, 성능 문제를 야기할 수 있다.따라서 일반적으로 Cartesian Product는 조인 조건을 명시적으로 지정하지 않는 한 피해야 한다.
예시
CROSS JOIN 전
CROSS JOIN 후
집함을 최소할 방법이 있으면 조건을 먼저 적용하여 관계 맺을 집합을 최소화하는 것이 효율적이다.
인덱스를 활용하면 조인 연산의 비용을 극적으로 낮출 수 있다.