예제 테이블
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/