sql中合并結果集主要使用union操作符,分為union和union all兩種用法。1. union會去除重復行,性能較慢;2. union all保留所有行,包括重復數據,性能更好。兩者均要求合并的列數量和數據類型一致。若列名不一致,結果集列名以第一個select語句為準,可通過別名統一。合并后排序需在最后使用order by子句。union用于合并結構相似的多個結果集為一個,適用于相同實體分布在不同表的情況;join則用于基于關聯條件連接不同表的不同實體,是列的合并而非行的堆疊。正確選擇union或join取決于數據關系及需求。
SQL中合并結果集,主要就是用UNION,簡單來說,就是把兩個或多個SELECT語句的結果堆疊在一起。但要注意,不是隨便什么結果都能合并的,列的數量和數據類型得對得上。
解決方案
UNION操作符主要有兩種用法:UNION和UNION ALL。
- UNION: 這個會去除重復的行,相當于DISTINCT操作,所以性能會稍微慢一點。
- UNION ALL: 這個會保留所有行,包括重復的,所以性能更好。如果你確定結果集里不會有重復數據,或者重復數據沒關系,那就用UNION ALL。
基本語法是這樣的:
SELECT column1, column2 FROM table1 UNION [ALL] SELECT column1, column2 FROM table2;
舉個例子,假設我們有兩個表,customers_europe和customers_america,結構一樣,都包含customer_id和customer_name兩列。
-- 創建示例表 CREATE TABLE customers_europe ( customer_id INT, customer_name VARCHAR(255) ); CREATE TABLE customers_america ( customer_id INT, customer_name VARCHAR(255) ); -- 插入一些數據 INSERT INTO customers_europe (customer_id, customer_name) VALUES (1, 'Alice'), (2, 'Bob'); INSERT INTO customers_america (customer_id, customer_name) VALUES (3, 'Charlie'), (1, 'Alice'); -- 注意這里有重復的 customer_id
如果我們想把這兩個表的數據合并在一起,可以使用UNION:
SELECT customer_id, customer_name FROM customers_europe UNION SELECT customer_id, customer_name FROM customers_america;
結果會是:
customer_id | customer_name -------------|-------------- 1 | Alice 2 | Bob 3 | Charlie
可以看到,重復的(1, ‘Alice’)被去掉了。
如果我們用UNION ALL:
SELECT customer_id, customer_name FROM customers_europe UNION ALL SELECT customer_id, customer_name FROM customers_america;
結果會是:
customer_id | customer_name -------------|-------------- 1 | Alice 2 | Bob 3 | Charlie 1 | Alice
重復的(1, ‘Alice’)被保留了。
結果集合并時列名不一致怎么辦?
有時候,兩個SELECT語句的列名可能不一樣,但實際上它們代表的是相同的信息。這時候,UNION會使用第一個SELECT語句的列名作為結果集的列名。
比如,customers_europe表的customer_name列叫name:
SELECT customer_id, name AS customer_name FROM customers_europe UNION SELECT customer_id, customer_name FROM customers_america;
結果集的列名會是customer_id和customer_name。重要的是,列的順序和數據類型要匹配。
如何在合并結果集后排序?
可以在UNION語句的最后加上ORDER BY子句。注意,ORDER BY只能放在整個UNION語句的最后,不能放在單個SELECT語句里。
SELECT customer_id, customer_name FROM customers_europe UNION SELECT customer_id, customer_name FROM customers_america ORDER BY customer_name;
這樣,結果集會按照customer_name列排序。
UNION和JOIN的區別是什么?什么時候用哪個?
UNION是用來合并行的,把兩個或多個結構相似的結果集堆疊在一起。JOIN是用來合并列的,把兩個或多個表基于某些關聯條件連接在一起。
簡單來說,如果你的數據分布在不同的表里,但它們代表的是同一種實體(比如上面例子里的客戶),你需要把它們合并成一個結果集,那就用UNION。如果你的數據分布在不同的表里,它們代表的是不同的實體,但它們之間有關聯關系(比如客戶和訂單),你需要把它們的信息合并在一起,那就用JOIN。