UNION()
當需要從多個不同的表中合並相似的數據時UNION操作是非常有用的在某些情況下也許是為了獲得更快的訪問速度或者為了將表更容易地分布在不同的硬件上數據庫的設計者可能會將單個邏輯數據表設計為多個在物理上完全分開的表在這種情況下UNION操作就可以從多個表中獲取數據並將其合並到一個數據集中
盡管LIBRARY數據庫中沒有重復的數據但UNION操作將執行消除列表中重復記錄的處理如果有一個以上的作者具有相同的姓氏那麼UNION列表中僅會包含一個這樣的姓氏如果想在結果集中包含所有的記錄則必須使用UNION ALL操作符
首先添加另外一個作者記錄John M BrysonStrategic Planning for Public and NonprofitOrganizations: A Guide to Strengthening and Sustaining Organizational Achievement一書的作者(與數據庫中已經存在的Bill Bryson並無關系)為了將這條多余的記錄添加到BOOKS表中將使用所要求的最少數據來插入該記錄AU_ID和AU_LAST_NAME:
INSERT INTO authors (au_id au_last_name)
VALUES ( Bryson)
在這一小節開頭曾經介紹過一個UNION查詢從該查詢的結果中可以看到結果列表中只出現了一個Bryson現在可以運行一個與之非常類似的新查詢
SELECT
booksbk_title AS title
FROM books
UNION ALL
SELECT
authorsau_last_name
FROM authors;
當運行UNION ALL查詢時查詢結果將會產生較大的差別結果列表中不僅僅包含了兩個名為Bryson的作者而且還失去了原來的排序UNION合並的每一個子集都按照從每一個查詢中返回的原始順序進行排序(請注意位於數據集末尾的Bryson)第二個查詢的結果只是簡單地追加到第一個查詢的結果之後如表所示
表 UNION ALL查詢的結果
(續表)
實際上在某些情況下數據是不同的然而它們在某個方面具有相似性例如一個機構中的成員就具有很多不同的角色對於學校來說其中的人員包括教師學生管理員或校長對於工廠來說有工人經理後勤人員和銷售人員可以想象這些角色在數據庫中分別屬於自己的表但是可以使用UNION操作來合並這些表中的角色只查詢人員的姓氏和名字每一個人員都必定具有這兩個字段 從而創建一個總的人員列表
JOIN操作通過將多個表連接起來從而向結果集中添加更多有關的詳細信息UNION對截然不同的表執行操作刪除無關的字段並將列表縮減為最常用的幾個列
在一個查詢中可以使用多少個UNION操作是有實際限制的實踐表明可以運行上千個UNION操作實際可以使用的UNION數量取決於硬件條件(CPURAM)和具體的RDBMS實現
返回目錄SQL實戰新手入門
編輯推薦
Oracle索引技術
高性能MySQL
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/SQL/201311/16465.html