• Home
  • About
    • Che1's Blog photo

      Che1's Blog

      Che1's Dev Blog

    • Learn More
    • Facebook
    • Instagram
    • Github
    • Steam
    • Youtube
  • Posts
    • All Posts
    • Django
    • Python
    • Front-end
    • Algorithm
    • etc
    • All Tags
  • Projects

[SQL] JOIN, UNION

07 Oct 2017

Reading time ~4 minutes

예제 테이블

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

중복되는 값이 나타나는 것을 볼 수 있다.

위로


SQL 목차
  • [SQL] JOIN, UNION
  • [SQL] DELETE
  • [SQL] UPDATE
  • [SQL] INSERT INTO
  • [SQL] SELECT를 꾸며주는 옵션 모음
  • [SQL] WHERE
  • [SQL] SELECT
  • [SQL] SQL 이란?

Reference

W3School: https://www.w3schools.com/sql/



SQL Share Tweet +1