[SQL] SQL JOIN 문법 정리
SQL 문을 실제 실행하면서 확인할 수 있는 사이트이다. 해당 사이트를 활용해 기본 문법을 실행하면서 정리해보자.
W3Schools - SQL Tryit Editor v1.6
기본 문법 후 Join 문법까지 익힌다면 대부분의 SQL 처리는 가능하다고 생각한다.
출처- https://medium.com/@aakriti.sharma18/joins-in-sql-4e2933cedde6
위 사진하나로 JOIN 에 대해 모두 파악이 가능하다. 그래도 하나씩 살펴보자.
이해를 돕기 위해
A Table
+----------+------+
| OrderID | Name |
+----------+------+
| 1000 | A.0 |
| 1001 | A.1 |
| 1002 | A.2 |
+----------+------+
B Table
+----------+------+
| OrderID | Name |
+----------+------+
| 1000 | B.0 |
| 1003 | B.3 |
| 1004 | B.4 |
+----------+------+
가 있다고 가정한다.
INNER JOIN
A, B 의 교집합만 조회
SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, OrderDetails.Quantity
FROM Orders
INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID;
-- 별칭 사용
SELECT o.OrderID, o.CustomerID, o.EmployeeID, od.Quantity
FROM Orders AS o
INNER JOIN OrderDetails AS od ON o.OrderID = od.OrderID;
- ON 절의 조건을 통해 OrderID 가 동일한 데이터만 가져온다.
- A, B 의 OrderID 가 동일하지 않은 데이터들은 모두 무시된다.
- 이때 별칭을 사용해 간단하게 테이블 이름을 불러올 수 있다.
+----------+--------+--------+
| OrderID | A.Name | B.Name |
+----------+--------+--------+
| 1000 | A.0 | B.0 |
+----------+--------+--------+
- OrderID 가 동일한 행은 하나이뿐이다.
- A, B 의 교집합을 나타낸다.
LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, OrderDetails.Quantity
FROM Orders
LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID;
- LEFT 조인은 말 그대로 A 쪽 데이터에 B 를 추가하는 것이다. B 의 데이터에 NULL 값이 존재하더라도 A 에 널값을 그대로 JOIN 시킨다.
+----------+--------+--------+
| OrderID | A.Name | B.Name |
+----------+--------+--------+
| 1000 | A.0 | B.0 |
| 1001 | A.1 | NULL |
| 1002 | A.2 | NULL |
+----------+--------+--------+
- 위 테이블은 A, B 의 OrderID 를 Join 시킨 테이블이다.
- OrderID 1001, 1002 의 B.OrderID 데이터가 null 값이라면 위와 같이 Null 값이 들어간 테이블이 조회된다.
LEFT EXCLUSIVE JOIN
SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, OrderDetails.Quantity
FROM Orders
LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
WHERE OrderDetails.OrderID IS NULL;
- A 의 LEFT JOIN 후 교집합을 뺀 부분이다.
- 순수하게 A 의 데이터라고 할 수 있다.
+----------+--------+--------+
| OrderID | A.Name | B.Name |
+----------+--------+--------+
| 1001 | A.1 | NULL |
| 1002 | A.2 | NULL |
+----------+--------+--------+
- B 의 OrderID 가 NULL 값인 데이터만 조회된다.
RIGHT JOIN
SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, OrderDetails.Quantity
FROM Orders
RIGHT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID;
- B 의 데이터를 기준으로 A 의 데이터를 추가해 테이블을 생성한다.
- 사실 A, B 위치를 바꾸고 LEFT 를 사용해도 동일한 결과이다.
+----------+--------+--------+
| OrderID | A.Name | B.Name |
+----------+--------+--------+
| 1000 | A.0 | B.0 |
| 1003 | NULL | B.3 |
| 1004 | NULL | B.4 |
+----------+--------+--------+
- B 의 데이터가 전체 조회되고 A 의 데이터가 추가된다.
RIGHT EXCLUSIVE JOIN
SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, OrderDetails.Quantity
FROM Orders
RIGHT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
WHERE OrderDetails.OrderID IS NULL;
- B 의 데이터를 기준으로 교집합을 제외한 데이터를 출력한다.
+----------+--------+--------+
| OrderID | A.Name | B.Name |
+----------+--------+--------+
| 1003 | NULL | B.3 |
| 1004 | NULL | B.4 |
+----------+--------+--------+
- B 의 데이터가 전체 조회되고 A 와의 교집합이 없는 데이터만 출력된다.
UNION
- 여러 쿼리에서 반환되는 결과를 통합해준다.
- 모든 SELECT 구문에서 나타나는 컬럼의 수와 순서가 동일해야한다.
- 컬럼의 데이터 타입이 호환가능해야한다.
(SELECT * FROM A)
UNION
(SELECT * FROM B);
- A, B 의 컬럼 수와 순서 및 타입이 동일하다고 가정하자.
+----------+------+
| OrderID | Name |
+----------+------+
| 1000 | A.0 |
| 1001 | A.1 |
| 1002 | A.2 |
| 1000 | B.0 |
| 1003 | B.3 |
| 1004 | B.4 |
+----------+------+
- A, B 의 모든 컬럼을 나타내는 것이 Union 이다.
DISTINCT
- UNION 연산자는 중복되는 값은 자동으로 제거해 반환한다.
- 기본적으로 DISTINCT 가 추가되어있는 것과 같다.
(SELECT OrderID FROM A)
UNION
(SELECT OrderID FROM B);
위와 같이 진행한다면
+----------+
| OrderID |
+----------+
| 1000 |
| 1001 |
| 1002 |
| 1003 |
| 1004 |
+----------+
위 처럼 중복된 값이 제거되어 반환된다.
FULL OUTER JOIN
- 오라클에서는 사용할 수 있지만 MySQL 에서는 Outer Join 을 직접 제공하지는 않는다.
- 그래서 Union 을 사용해 구현할 수 있다.
(SELECT * FROM A LEFT JOIN B ON A.OrderID = B.OrderID)
UNION
(SELECT * FROM A RIGHT JOIN B ON A.OrderID = B.OrderID);
+----------+--------+----------+--------+
| OrderID | Name | OrderID | Name |
+----------+--------+----------+--------+
| 1000 | A.0 | 1000 | B.0 |
| 1001 | A.1 | NULL | NULL |
| 1002 | A.2 | NULL | NULL |
| NULL | NULL | 1003 | B.3 |
| NULL | NULL | 1004 | B.4 |
+----------+--------+----------+--------+
FULL OUTER JOIN (EXCLUSIVE)
(SELECT * FROM A LEFT JOIN B ON A.OrderID = B.OrderID WHERE B.OrderID IS NULL)
UNION
(SELECT * FROM A RIGHT JOIN B ON A.OrderID = B.OrderID WHERE A.OrderID IS NULL);
+----------+--------+----------+--------+
| OrderID | Name | OrderID | Name |
+----------+--------+----------+--------+
| 1001 | A.1 | NULL | NULL |
| 1002 | A.2 | NULL | NULL |
| NULL | NULL | 1003 | B.3 |
| NULL | NULL | 1004 | B.4 |
+----------+--------+----------+--------+
댓글남기기