SQL 문을 실제 실행하면서 확인할 수 있는 사이트이다. 해당 사이트를 활용해 기본 문법을 실행하면서 정리해보자.

W3Schools - SQL Tryit Editor v1.6

기본 문법 후 Join 문법까지 익힌다면 대부분의 SQL 처리는 가능하다고 생각한다.

image 출처- 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

image

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

image

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

image

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

image

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

image

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

image

  • 오라클에서는 사용할 수 있지만 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)

image

(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    |
+----------+--------+----------+--------+

업데이트:

댓글남기기