SQL: JOINS
이 SQL 자습서에서는 구문, 일러스트레이션 및 예제를 통해 SQL JOINS의 사용법을 설명합니다.
설명
SQL JOIN은 여러 테이블에서 데이터를 검색하는 데 사용됩니다.
SQL 조인은 SQL문에 여러 테이블이 나열될 때마다 실행됩니다.
SQL 조인에는 네 가지 유형이 있습니다.
- SQL INNER JOIN (단순 조인이라고도 함)
- SQL LEFT OUTER JOIN(LEFT JOIN이라고도 함)
- SQL RIGHT OUTER JOIN(RIGHT JOIN이라고도 함)
- SQL FULL OUTER JOIN(FULL JOIN이라고도 함)
그런 다음 SQL JOIN 구문을 설명하고 SQL JOIN의 시각적 다이어그램을 살펴보고 몇 가지 예를 살펴 보겠습니다.
DDL/DML 예제
자습서를 따르려면 테이블을 만드는 DDL과 데이터를 채우는 DML을 받습니다.
그런 다음 자신의 데이터베이스에서 예제를 사용해보십시오.
SQL INNER JOIN(단순 조인)
이미 SQL INNER JOIN을 사용하는 SQL 문을 작성했을 수 있습니다.
가장 일반적인 유형의 SQL 조인입니다.
SQL INNER JOIN은 조인 조건을 충족하는 여러 테이블의 모든 행을 리턴합니다.
구문
SQL의 INNER JOIN 구문은 다음과 같습니다.
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
삽화
이 그림에서 SQL INNER JOIN은 그림자가 있는 영역을 반환합니다.
SQL INNER JOIN은 table1과 table2가 교차하는 레코드를 리턴합니다.
예
쿼리에서 INNER JOIN을 사용하는 방법의 예를 살펴 보겠습니다.
이 예제에는 다음 데이터가 있는 customers라는 테이블이 있습니다.
customer_id | last_name | first_name | favorite_website |
---|---|---|---|
4000 | 잭슨 | 조 | techonthenet.com |
5000 | 스미스 | 제인 | digminecraft.com |
6000 | Ferguson | 사만다 | bigactivities.com |
7000 | Reynolds | 알렌 | checkyourmath.com |
8000 | 앤더슨 | Paige | NULL |
9000 | 존슨 | Derek | techonthenet.com |
그리고 다음 데이터를 가진 orders라는 테이블이 있습니다.
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2016/04/18 |
2 | 5000 | 2016/04/18 |
3 | 8000 | 2016/04/19 |
4 | 4000 | 2016/04/20 |
5 | NULL | 2016/05/01 |
다음 SQL 문을 입력합니다.
Try it
SELECT customers.customer_id, orders.order_id, orders.order_date
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
네 개의 레코드가 선택됩니다.
다음이 표시되는 결과입니다.
customer_id | order_id | order_date |
---|---|---|
4000 | 4 | 2016/04/20 |
5000 | 2 | 2016/04/18 |
7000 | 1 | 2016/04/18 |
8000 | 3 | 2016/04/19 |
이 예에서는 customers 테이블과 orders 테이블 모두에 일치하는 customer_id 값을 가진 customers 테이블과 orders 테이블의 모든 행을 반환합니다.
customers 테이블에서 customer_id가 6000과 9000인 행은 두 테이블에 모두 존재하지 않으므로 생략됩니다.
orders 테이블의 order_id가 5인 행은 customers 테이블에 NULL의 customer_id가 없으므로 생략됩니다.
오래된 구문
마지막으로 위의 INNER JOIN 예제에서는 이전 암시적 구문을 사용하여 다음과 같이 다시 작성할 수 있다는 점에 유의해야 합니다.
(그러나 여전히 INNER JOIN 키워드 구문을 사용하는 것이 좋습니다) Try it
SELECT customers.customer_id, orders.order_id, orders.order_date
FROM customers, orders
WHERE customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
SQL LEFT OUTER JOIN
또 다른 조인 유형을 LEFT OUTER JOIN이라고 합니다.
이 조인 유형은 ON 조건에 지정된 왼쪽 테이블의 모든 행과 조인된 필드가 동일한 다른 테이블의 행만 리턴합니다.
(결합 조건이 충족됨)
구문
SQL에서 LEFT OUTER JOIN의 구문은 다음과 같습니다.
SELECT columns
FROM table1
LEFT (OUTER) JOIN table2
ON table1.column = table2.column;
일부 데이터베이스에서는 OUTER 키워드가 생략되고 단순히 LEFT JOIN으로 작성됩니다.
삽화
이 그림에서 SQL LEFT OUTER JOIN은 음영 영역을 반환합니다.
SQL LEFT OUTER JOIN은 table1의 모든 레코드와 table2의 레코드 중 table1과 교차하는 레코드만 리턴합니다.
예
다음으로 SELECT 문에서 LEFT OUTER JOIN을 사용하는 방법을 보여주는 예제를 살펴 보겠습니다.
이전 예제와 동일한 customers 테이블을 사용합니다.
customer_id | last_name | first_name | favorite_website |
---|---|---|---|
4000 | 잭슨 | 조 | techonthenet.com |
5000 | 스미스 | 제인 | digminecraft.com |
6000 | Ferguson | 사만다 | bigactivities.com |
7000 | Reynolds | 알렌 | checkyourmath.com |
8000 | 앤더슨 | Paige | NULL |
9000 | 존슨 | Derek | techonthenet.com |
그리고 다음 데이터를 포함하는 orders 테이블.
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2016/04/18 |
2 | 5000 | 2016/04/18 |
3 | 8000 | 2016/04/19 |
4 | 4000 | 2016/04/20 |
5 | NULL | 2016/05/01 |
다음 SQL 문을 입력합니다.
Try it
SELECT customers.customer_id, orders.order_id, orders.order_date
FROM customers
LEFT OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
6개의 레코드가 선택됩니다.
다음이 표시되는 결과입니다.
customer_id | order_id | order_date |
---|---|---|
4000 | 4 | 2016/04/20 |
5000 | 2 | 2016/04/18 |
6000 | NULL | NULL |
7000 | 1 | 2016/04/18 |
8000 | 3 | 2016/04/19 |
9000 | NULL | NULL |
이 LEFT OUTER JOIN의 예는 customers 테이블의 모든 행과 조인된 필드가 동일한 orders 테이블의 행만 리턴합니다.
customers 테이블의 customer_id 값이 orders 테이블에 없으면 orders 테이블의 모든 필드가 결과 세트에 NULL로 표시됩니다.
보시다시피, customer_id가 6000 및 9000 인 행은 LEFT OUTER JOIN을 통해 포함되지만 order_id 및 order_date 필드는 NULL로 표시됩니다.
SQL RIGHT OUTER JOIN
다른 조인 유형을 SQL RIGHT OUTER JOIN이라고 합니다.
이 유형의 조인은 ON 조건에 지정된 오른쪽 테이블의 모든 행과 조인된 필드가 동일한 다른 테이블의 행만 반환합니다.
(결합 조건이 충족됨)
구문
SQL에서 RIGHT OUTER JOIN의 구문은 다음과 같습니다.
SELECT columns
FROM table1
RIGHT (OUTER) JOIN table2
ON table1.column = table2.column;
일부 데이터베이스에서는 OUTER 키워드가 생략되고 단순히 RIGHT JOIN으로 작성됩니다.
삽화
이 시각적 다이어그램에서 SQL 오른쪽의 외부 조인은 음영 처리된 영역을 리턴합니다.
SQL RIGHT OUTER JOIN은 table2의 모든 레코드와 table1의 레코드 중 table2와 교차하는 레코드만 리턴합니다.
예
다음으로 SELECT 문에서 RIGHT OUTER JOIN을 사용하는 방법을 보여주는 예제를 살펴 보겠습니다.
이전 예제와 동일한 customers 테이블을 사용합니다.
customer_id | last_name | first_name | favorite_website |
---|---|---|---|
4000 | 잭슨 | 조 | techonthenet.com |
5000 | 스미스 | 제인 | digminecraft.com |
6000 | Ferguson | 사만다 | bigactivities.com |
7000 | Reynolds | 알렌 | checkyourmath.com |
8000 | 앤더슨 | Paige | NULL |
9000 | 존슨 | Derek | techonthenet.com |
그리고 다음 데이터를 포함하는 orders 테이블.
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2016/04/18 |
2 | 5000 | 2016/04/18 |
3 | 8000 | 2016/04/19 |
4 | 4000 | 2016/04/20 |
5 | NULL | 2016/05/01 |
다음 SQL 문을 입력합니다.
Try it
SELECT customers.customer_id, orders.order_id, orders.order_date
FROM customers
RIGHT OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
다섯 개의 레코드가 선택됩니다.
다음이 표시되는 결과입니다.
customer_id | order_id | order_date |
---|---|---|
NULL | 5 | 2016/05/01 |
4000 | 4 | 2016/04/20 |
5000 | 2 | 2016/04/18 |
7000 | 1 | 2016/04/18 |
8000 | 3 | 2016/04/19 |
이 RIGHT OUTER JOIN 예제에서는 orders 테이블의 모든 행과 조인된 필드가 동일한 customers 테이블의 행만 반환합니다.
orders 테이블의 customer_id 값이 customers 테이블에 없으면 customers 테이블의 모든 필드가 결과 세트에 NULL로 표시됩니다.
보시다시피 order_id가 5 인 행은 RIGHT OUTER JOIN을 통해 포함되지만 customer_id 필드는 NULL로 표시됩니다.
SQL FULL OUTER JOIN
다른 조인 유형을 SQL FULL OUTER JOIN이라고 합니다.
이 유형의 조인은 왼쪽 테이블과 오른쪽 테이블의 모든 행을 반환하며 조인 조건이 충족되지 않는 위치에는 널값이 있습니다.
구문
SQL FULL OUTER JOIN의 구문은 다음과 같습니다.
SELECT columns
FROM table1
FULL (OUTER) JOIN table2
ON table1.column = table2.column;
일부 데이터베이스에서는 OUTER 키워드가 생략되고 단순히 FULL JOIN으로 작성됩니다.
삽화
이 시각도에서 SQL FULL OUTER JOIN은 음영 영역을 리턴합니다.
SQL FULL OUTER JOIN은 table1과 table2 레코드를 모두 리턴합니다.
예
SELECT 문에서 FULL OUTER JOIN을 사용하는 방법을 보여주는 예제를 살펴 보겠습니다.
이전 예제와 동일한 customers 테이블을 사용합니다.
customer_id | last_name | first_name | favorite_website |
---|---|---|---|
4000 | 잭슨 | 조 | techonthenet.com |
5000 | 스미스 | 제인 | digminecraft.com |
6000 | Ferguson | 사만다 | bigactivities.com |
7000 | Reynolds | 알렌 | checkyourmath.com |
8000 | 앤더슨 | Paige | NULL |
9000 | 존슨 | Derek | techonthenet.com |
그리고 다음 데이터를 포함하는 orders 테이블.
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2016/04/18 |
2 | 5000 | 2016/04/18 |
3 | 8000 | 2016/04/19 |
4 | 4000 | 2016/04/20 |
5 | NULL | 2016/05/01 |
다음 SQL 문을 입력합니다.
Try it
SELECT customers.customer_id, orders.order_id, orders.order_date
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
7개의 레코드가 선택됩니다.
다음이 표시되는 결과입니다.
customer_id | order_id | order_date |
---|---|---|
NULL | 5 | 2016/05/01 |
4000 | 4 | 2016/04/20 |
5000 | 2 | 2016/04/18 |
6000 | NULL | NULL |
7000 | 1 | 2016/04/18 |
8000 | 3 | 2016/04/19 |
9000 | NULL | NULL |
이 FULL OUTER JOIN 예제는 orders 테이블의 모든 행과 customers 테이블의 모든 행을 반환합니다.
조인 조건이 충족되지 않을 때마다 결과 세트의 해당 필드에 널값이 확장됩니다.
즉, customers 테이블의 customer_id 값이 orders 테이블에 존재하지 않으면 orders 테이블의 모든 필드가 결과 세트에 NULL로 표시됩니다.
또한 orders 테이블의 customer_id 값이 customers 테이블에 없으면 customers 테이블의 모든 필드가 결과 집합에서 NULL로 표시됩니다.
보시다시피 customer_id가 6000 및 9000 인 행은 포함되지만 레코드의 order_id 및 order_date 필드에는 NULL 값이 포함되어 있습니다.
order_id가 5인 행도 포함되지만 해당 레코드의 customer_id 필드에는 널값이 있습니다.
<前/次:BETWEEN>