예제 테이블
Customers
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglun | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Orders
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10308 | 2 | 7 | 1996-09-18 | 3 |
| 10365 | 3 | 3 | 1996-11-27 | 2 |
| 10355 | 4 | 6 | 1996-11-15 | 1 |
| 10383 | 4 | 8 | 1996-12-16 | 3 |
| 10278 | 5 | 8 | 1996-08-12 | 2 |
| 10280 | 5 | 2 | 1996-08-14 | 1 |
| 10384 | 5 | 3 | 1996-12-16 | 3 |
Suppliers
| SupplierID | SupplierName | ContactName | Address | City | PostalCode | Country | Phone |
|---|---|---|---|---|---|---|---|
| 1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | Londona | EC1 4SD | UK | (171) 555-2222 |
| 2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA | (100) 555-4822 |
| 3 | Grandma Kelly's Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA | (313) 555-5735 |
| 4 | Tokyo Traders | Yoshi Nagase | 9-8 Sekimai Musashino-shi | Tokyo | 100 | Japan | (03) 3555-5011 |
| 5 | Cooperativa de Quesos 'Las Cabras' | Antonio del Valle Saavedra | Calle del Rosal 4 | Oviedo | 33007 | Spain | (98) 598 76 54 |
JOIN
JOIN 절은 서로 다른 테이블에서 가져온 레코드들을 공통된 필드를 기준으로 합쳐준다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름1
옵션 JOIN 테이블이름2 ON 테이블이름1.필드이름 = 테이블이름2.필드이름
JOIN 절의 옵션은 아래와 같다.
INNER: 두 테이블 모두에 기준 필드의 값이 있는 레코드만 가져온다.

LEFT: 왼쪽 테이블(테이블이름1)에 있는 모든 레코드를 가져오고, 기준 필드의 값과 매치되는 레코드들을 오른쪽 테이블(테이블이름2)에서 가져온다.
왼쪽 테이블의 기준 필드 값과 매치되는 값이 오른쪽 테이블에 없으면null값을 가져온다.

RIGHT: 오른쪽 테이블(테이블이름2)에 있는 모든 레코드를 가져오고, 기준 필드의 값과 매치되는 레코드들을 왼쪽 테이블(테이블이름1)에서 가져온다.
오른쪽 테이블의 기준 필드 값과 매치되는 값이 왼쪽 테이블에 없으면null값을 가져온다.

FULL OUTER: 기준 필드의 값과 매치되는 레코드가 어느 한쪽 테이블에라도 있으면 해당 레코드를 해당 테이블에서 가져온다.
결과 테이블이 매우 커질 수 있으므로 주의해야한다.

예제 테이블을 보면 Orders 테이블의 CustomerID 필드는 Customers 테이블의 CustomerID 필드를 참조하고 있다.
아래는 Orders, Customers 테이블 양쪽 모두에 동일한 CustomerID 필드 값을 가지는 레코드들을 모두 가져오는 INNER JOIN 의 예이다.
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
Result
| OrderID | CustomerName | OrderDate |
|---|---|---|
| 10278 | Berglunds snabbköp | 1996-08-12 |
| 10280 | Berglunds snabbköp | 1996-08-14 |
| 10308 | Ana Trujillo Emparedados y helados | 1996-09-18 |
| 10355 | Around the Horn | 1996-11-15 |
| 10365 | Antonio Moreno Taquería | 1996-11-27 |
| 10383 | Around the Horn | 1996-12-16 |
| 10384 | Berglunds snabbköp | 1996-12-16 |
Orders 테이블과 Customers 테이블 양쪽 모두에서 동일한 CustomerID 값을 가지는 레코드들을 모두 가져와서, OrderID, CustomerName, OrderDate 필드의 순서로 나타내었다.
Self JOIN
Self JOIN 은 테이블을 자기 스스로와 결합시킨다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름 예명1, 테이블이름 예명2
WHERE 조건;
아래 명령은 Customers 테이블에서 City 필드의 값이 같은 레코드들을 가져온다.
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID AND A.City=B.City
ORDER BY A.City;
Result
| CustomerName1 | CustomerName2 | City |
|---|---|---|
| Ana Trujillo Emparedados y helados | Antonio Moreno Taquería | México D.F. |
| Antonio Moreno Taquería | Ana Trujillo Emparedados y helados | México D.F. |
UNION
UNION 은 두 개 이상의 SELECT 문으로 얻어진 결과 테이블을 합칠 때 사용한다.
UNION 은 아래와 같은 조건이 갖추어져야 실행할 수 있다.
UNION이 적용되는 각각의SELECT문은 동일한 개수의 필드를 가져와야한다.- 필드들은 같은 데이터 타입을 가져야한다.
- 각각의
SELECT문은 같은 순서로 필드들을 가져와야한다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름1
UNION
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름2;
아래는 Customers 테이블과 Suppliers 테이블의 모든 레코드를 합친 뒤, Customers 테이블의 레코드는 Customer 를, Suppliers 테이블의 레코드는 Supplier 를 값으로 가지는 Type 필드와 ContactName, City, Country 필드를 가져와 결과 테이블을 구성하는 명령이다.
SELECT 'Supplier' AS type, ContactName, City, Country
FROM Suppliers
UNION
Select 'Customer', ContactName, City, Country
From Customers;
Result
| type | ContactName | City | Country |
|---|---|---|---|
| Customer | Ana Trujillo | México D.F. | Mexico |
| Customer | Antonio Moreno | México D.F. | Mexico |
| Customer | Christina Berglund | Luleå | Sweden |
| Customer | Maria Anders | Berlin | Germany |
| Customer | Thomas Hardy | London | UK |
| Supplier | Antonio del Valle Saavedra | Oviedo | Spain |
| Supplier | Charlotte Cooper | Londona | UK |
| Supplier | Regina Murphy | Ann Arbor | USA |
| Supplier | Shelley Burke | New Orleans | USA |
| Supplier | Yoshi Nagase | Tokyo | Japan |
UNION ALL
UNION 은 기본적으로 두 테이블을 합칠 때, 고유한 값만을 남긴다. 중복되는 값을 남기고 싶으면 UNION ALL 을 사용한다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름1
UNION ALL
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름2;
아래 명령은 Customers 과 Suppliers 테이블의 모든 레코드들의 City 필드 값을 보여주는 UNION 명령이다.
SELECT City
FROM Customers
UNION
SELECT City
FROM Suppliers
Result
| City |
|---|
| Ann Arbor |
| Berlin |
| London |
| Londona |
| Luleå |
| México D.F. |
| New Orleans |
| Oviedo |
| Tokyo |
아래는 똑같은 명령을 UNION ALL 으로 수행한 결과이다.
SELECT City
FROM Customers
UNION ALL
SELECT City
FROM Suppliers
Result
| City |
|---|
| Berlin |
| México D.F. |
| México D.F. |
| London |
| Luleå |
| Londona |
| New Orleans |
| Ann Arbor |
| Tokyo |
| Oviedo |
중복되는 값이 나타나는 것을 볼 수 있다.
Reference
W3School: https://www.w3schools.com/sql/