English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL FULL JOIN 문

이 튜토리얼에서는 SQL Full Join을 사용하여 두 테이블에서 데이터를 검색하는 방법을 배울 수 있습니다.

사용하여 조인합니다.

FULL JOIN은 매칭되든 아니든 연결 테이블의 모든 행을 반환하므로, 완전한 조인은 LEFT JOINRIGHT JOIN是完全联接외부 조인의 하나입니다.라는 이름도 붙여줍니다.full outer join

하위 비엔(Venn) 도표는 완전한 조인의 작동 방식을 설명합니다。

주의:외부 조인은 결과 집합에 행을 포함하는 조인으로, 연결되려는 두 테이블의 행 사이에 불일치가 있을 수 있습니다.

이를 명확히 이해하기 위해 다음을 보겠습니다employeesdepartments표。

+--------+--------------+------------+---------+
| emp_id | emp_name     | hire_date  | dept_id |
+--------+--------------+------------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |       4 |
|      2 | Tony Montana | 2002-07-15 |       1 |
|      3 | Sarah Connor | 2005-10-18 |       5 |
|      4 | Rick Deckard | 2007-01-03 |       3 |
|      5 | Martin Blank | 2008-06-24 |    NULL |
+--------+--------------+------------+---------+

+---------+------------------+
| dept_id | dept_name        |
+---------+------------------+
|       1 | 행정   |
|       2 | Customer Service |
|       3 | 재무          |
|       4 | Human Resources  |
|       5 | 판매            |
+---------+------------------+
테이블: employees
테이블: departments

이제, 모든 직원의 이름과 사용 가능한 부서의 이름을 검색하고 싶다면, 다른 테이블에 해당하는 행이 있는与否에 관계없이, 이 경우 완전한 조인을 사용할 수 있습니다. 다음과 같이 합니다.

다음 문장은 일반적인 dept_id 필드를 사용하여 employee와 department 테이블을 조인하여 모든 부서와 모든 직원의 세부 정보를 검색합니다.

SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 FULL JOIN departments AS t2
ON t1.dept_id = t2.dept_id ORDER BY emp_name;

일부 데이터베이스(예: Oracle, MySQL)는 완전한 조인을 지원하지 않습니다. 이 경우 UNION ALL 연산자를 사용하여 LEFT JOIN과 RIGHT JOIN을 결합할 수 있습니다. 다음과 같이 합니다:

SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 LEFT JOIN departments AS t2
ON t1.dept_id = t2.dept_id
UNION ALL
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 RIGHT JOIN departments AS t2
ON t1.dept_id = t2.dept_id ORDER BY emp_name;

명령을 실행하면 다음과 같은 출력을 얻게 됩니다:

+--------+--------------+------------+------------------+
| emp_id | emp_name     | hire_date  | dept_name        |
+--------+--------------+------------+------------------+
|   NULL | NULL         | NULL       | Customer Service |
|      1 | Ethan Hunt   | 2001-05-01 | Human Resources  |
|      1 | Ethan Hunt   | 2001-05-01 | Human Resources  |
|      5 | Martin Blank | 2008-06-24 | NULL             |
|      4 | Rick Deckard | 2007-01-03 | 재무          |
|      4 | Rick Deckard | 2007-01-03 | 재무          |
|      3 | Sarah Connor | 2005-10-18 | 판매            |
|      3 | Sarah Connor | 2005-10-18 | 판매            |
|      2 | Tony Montana | 2002-07-15 | 행정   |
|      2 | Tony Montana | 2002-07-15 | 행정   |
+--------+--------------+------------+------------------+

그러나 보시다시피, 결과에는 포함됩니다departmentsemployees테이블의 모든 행.

추가로:조인 쿼리에서, 왼쪽 테이블은 JOIN 절에서 가장 왼쪽에 나타나는 테이블이고, 오른쪽 테이블은 절에서 가장 오른쪽에 나타나는 테이블입니다.

주의:외부 조인을 실행할 때, DBMS(데이터베이스 관리 시스템)가 어떤 행도 일치시키지 못하면, 데이터가 존재하지 않음을 나타내기 위해 NULL을 열에 넣습니다.