109. UNION - llighter/database GitHub Wiki

The UNION [ALL] Oracle Help Centor

SQL UNION Operator W3School

UNION, INTERSECT 및 EXCEPT AWS μ„€λͺ…μ„œ >> λ°μ΄ν„°λ² μ΄μŠ€ 개발자 μ•ˆλ‚΄μ„œ

The SQL UNION Operator

The UNION operator is used to combine the result-set of two or more SELECT statements.

  • Each SELECT statement within UNION must have the same number of columns
  • The columns must also have similar data types
  • The columns in each SELECT statement must also be in the same order

UNION Syntax

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

UNION ALL Syntax

The UNION operator selects only distinct values by default. To allow duplicate values, use UNION ALL:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

μ„€μ • μ—°μ‚°μžμ— λŒ€ν•œ 평가 μˆœμ„œ

  • UNION 및 EXCEPT μ„€μ • μ—°μ‚°μžλŠ” μ’Œμš°μ„  κ²°ν•© μ—°μ‚°μžμž…λ‹ˆλ‹€.
  • μš°μ„ μˆœμœ„μ— 영ν–₯을 μ£ΌκΈ° μœ„ν•΄ κ΄„ν˜Έκ°€ μ§€μ •λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우 μ΄λŸ¬ν•œ μ„€μ • μ—°μ‚°μžμ˜ 쑰합은 μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ κ³„μ‚°λ©λ‹ˆλ‹€.

UNION Example 1 Oracle Help Center

The following statement combines the results of two queries with the UNION operator, which eliminates duplicate selected rows. This statement shows that you must match datatype (using the TO_CHAR function) when columns do not exist in one or the other table:

SELECT location_id, department_name "Department", 
   TO_CHAR(NULL) "Warehouse"  FROM departments
   UNION
   SELECT location_id, TO_CHAR(NULL) "Department", warehouse_name 
   FROM warehouses;

LOCATION_ID Department            Warehouse
----------- --------------------- --------------------------
       1400 IT
       1400                       Southlake, Texas
       1500 Shipping
       1500                       San Francisco
       1600                       New Jersey
       1700 Accounting
       1700 Administration
       1700 Benefits
       1700 Construction
...

UNION Example 2 AWS λ°μ΄ν„°λ² μ΄μŠ€ 개발자 μ•ˆλ‚΄μ„œ

λ‹€μŒ UNION μΏΌλ¦¬μ—μ„œ SALES ν…Œμ΄λΈ”μ˜ 행은 LISTING ν…Œμ΄λΈ”μ˜ ν–‰κ³Ό λ³‘ν•©λ©λ‹ˆλ‹€. 각각의 ν…Œμ΄λΈ”μ—μ„œ ν˜Έν™˜λ˜λŠ” 3개의 열이 μ„ νƒλ˜λ©°, 이 κ²½μš°μ—λŠ” ν•΄λ‹Ήν•˜λŠ” μ—΄λ“€μ˜ 이름과 데이터 ν˜•μ‹μ΄ λ™μΌν•©λ‹ˆλ‹€.

μ΅œμ’… κ²°κ³Ό 집합은 LISTING ν…Œμ΄λΈ”μ˜ 첫 번째 열을 κΈ°μ€€μœΌλ‘œ μ •λ ¬λ˜κ³  LISTID 값이 κ°€μž₯ 높은 5개의 ν–‰μœΌλ‘œ μ œν•œλ©λ‹ˆλ‹€.

select listid, sellerid, eventid from listing
union 
select listid, sellerid, eventid from sales
order by listid, sellerid, eventid desc limit 5;

listid | sellerid | eventid
--------+----------+---------
1 |    36861 |    7872
2 |    16002 |    4806
3 |    21461 |    4256
4 |     8117 |    4337
5 |     1616 |    8647
(5 rows)

λ‹€μŒ μ˜ˆμ œλŠ” κ²°κ³Ό μ§‘ν•©μ—μ„œ μ–΄λ–€ 쿼리 ν‘œν˜„μ‹μ΄ 각각의 행을 μƒμ„±ν–ˆλŠ”μ§€ λ³Ό 수 μžˆλ„λ‘ UNION 쿼리의 좜λ ₯에 λ¦¬ν„°λŸ΄ 값을 μΆ”κ°€ν•  수 μžˆλŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. 이 μΏΌλ¦¬λŠ” 첫 번째 쿼리 ν‘œν˜„μ‹μ˜ 행을 "B"(buyer)둜 μ‹λ³„ν•˜κ³  두 번째 쿼리 ν‘œν˜„μ‹μ˜ 행을 "S"(seller)둜 μ‹λ³„ν•©λ‹ˆλ‹€.

이 μΏΌλ¦¬λŠ” $10,000 μ΄μƒμ˜ ν‹°μΌ“ κ±°λž˜μ— λŒ€ν•΄ κ΅¬λ§€μžμ™€ 판맀자λ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€. UNION μ—°μ‚°μžμ˜ μ–΄λŠ ν•œμͺ½μ—μ„œ 두 쿼리 ν‘œν˜„μ‹μ˜ μœ μΌν•œ 차이점은 SALES ν…Œμ΄λΈ”μ— λŒ€ν•œ 쑰인 μ—΄μž…λ‹ˆλ‹€.

select listid, lastname, firstname, username,
pricepaid as price, 'S' as buyorsell
from sales, users
where sales.sellerid=users.userid
and pricepaid >=10000
union
select listid, lastname, firstname, username, pricepaid,
'B' as buyorsell
from sales, users
where sales.buyerid=users.userid
and pricepaid >=10000
order by 1, 2, 3, 4, 5;

listid | lastname | firstname | username |   price   | buyorsell
--------+----------+-----------+----------+-----------+-----------
209658 | Lamb     | Colette   | VOR15LYI |  10000.00 | B
209658 | West     | Kato      | ELU81XAA |  10000.00 | S
212395 | Greer    | Harlan    | GXO71KOC |  12624.00 | S
212395 | Perry    | Cora      | YWR73YNZ |  12624.00 | B
215156 | Banks    | Patrick   | ZNQ69CLT |  10000.00 | S
215156 | Hayden   | Malachi   | BBG56AKU |  10000.00 | B
(6 rows)

μ€‘λ³΅λœ 행이 λ°œκ²¬λ˜λŠ” 경우 결과에 이런 행을 μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ, λ‹€μŒ μ˜ˆμ œμ—μ„œλŠ” UNION ALL μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이벀트 ID의 νŠΉμ • μ‹œλ¦¬μ¦ˆμ— λŒ€ν•΄, μΏΌλ¦¬λŠ” 각 μ΄λ²€νŠΈμ™€ κ΄€λ ¨λœ 각각의 νŒλ§€μ— λŒ€ν•΄ 0개 μ΄μƒμ˜ 행을 λ°˜ν™˜ν•˜κ³  κ·Έ 이벀트의 각 λͺ©λ‘μ— λŒ€ν•΄ 0개 λ˜λŠ” 1개의 행을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 이벀트 IDλŠ” LISTING 및 EVENT ν…Œμ΄λΈ”μ—μ„œ 각각의 행에 κ³ μœ ν•˜μ§€λ§Œ, SALES ν…Œμ΄λΈ”μ—μ„œ 이벀트 및 λͺ©λ‘ ID의 λ™μΌν•œ 쑰합에 λŒ€ν•΄ μ—¬λŸ¬ 개의 판맀 건이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°κ³Ό μ§‘ν•©μ˜ μ„Έ 번째 열은 ν–‰μ˜ 원본을 μ‹λ³„ν•©λ‹ˆλ‹€. ν–‰μ˜ μΆœμ²˜κ°€ SALES ν…Œμ΄λΈ”μΈ 경우 SALESROW 열에 "YES"둜 ν‘œμ‹œλ©λ‹ˆλ‹€. (SALESROWλŠ” SALES.LISTID의 λ³„μΉ­μž…λ‹ˆλ‹€.) ν–‰μ˜ μΆœμ²˜κ°€ LISTING ν…Œμ΄λΈ”μΈ 경우 SALESROW 열에 "No"둜 ν‘œμ‹œλ©λ‹ˆλ‹€.

이 경우, κ²°κ³Ό 집합은 λͺ©λ‘ 500, 이벀트 7787에 λŒ€ν•΄ 3개의 판맀 ν–‰μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. 즉, 이 λͺ©λ‘ 및 이벀트 쑰합에 λŒ€ν•΄ 3κ°€μ§€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 두 λͺ©λ‘ 501 및 502μ—μ„œλŠ” μ–΄λ–€ νŒλ§€λ„ μƒμ„±λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ, 쿼리가 이듀 λͺ©λ‘ ID에 λŒ€ν•΄ μƒμ„±ν•˜λŠ” μœ μΌν•œ ν–‰μ˜ μΆœμ²˜λŠ” LISTING ν…Œμ΄λΈ”μž…λ‹ˆλ‹€(SALESROW = 'No').

select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
7787 |    500 | Yes
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(6 rows)

ALL ν‚€μ›Œλ“œ 없이 같은 쿼리λ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 κ²°κ³Όμ—λŠ” 판맀 거래 쀑 ν•˜λ‚˜λ§Œ μœ μ§€λ©λ‹ˆλ‹€.

select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(4 rows)