sql中union主要用于合并多個select語句的結果集并去除重復行,而union all則保留所有行包括重復數據。1. 合并相似數據:如使用union將結構相同的customers_us和customers_eu表中的客戶信息合并,自動去除customer_id為1的重復記錄;2. 數據清洗和報表生成:如通過union all將月度和季度銷售數據整合成統一報表,用sales_type字段區分數據來源;3. 數據遷移和整合:如將old_db1.customers與old_db2.users的數據通過字段映射插入到新結構的new_data_warehouse.customers表中,實現不同結構數據的統一存儲。
SQL中UNION主要用于合并多個SELECT語句的結果集,去除重復行。它能把結構相似的數據整合在一起,方便查詢和分析。UNION ALL則保留所有行,包括重復的。
結果集合并的3種典型場景:
合并相似數據,數據清洗和報表生成,以及數據遷移和整合。
如何使用UNION合并來自不同表的相似數據?
假設我們有兩個表:customers_us和customers_eu,分別存儲美國和歐洲的客戶信息。這兩個表的結構相同,但數據來源不同。
CREATE TABLE customers_us ( customer_id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(100) ); CREATE TABLE customers_eu ( customer_id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(100) ); INSERT INTO customers_us (customer_id, first_name, last_name, email) VALUES (1, 'John', 'Doe', 'john.doe@example.com'), (2, 'Jane', 'Smith', 'jane.smith@example.com'); INSERT INTO customers_eu (customer_id, first_name, last_name, email) VALUES (3, 'Alice', 'Johnson', 'alice.johnson@example.com'), (1, 'John', 'Doe', 'john.doe@example.com'); -- 故意插入重復數據
要合并這兩個表的數據,可以使用UNION:
SELECT customer_id, first_name, last_name, email FROM customers_us UNION SELECT customer_id, first_name, last_name, email FROM customers_eu;
這個查詢會返回所有客戶的信息,但會自動去除重復的行(例如,customer_id為1的記錄只會出現一次)。如果想保留所有行,包括重復的,可以使用UNION ALL:
SELECT customer_id, first_name, last_name, email FROM customers_us UNION ALL SELECT customer_id, first_name, last_name, email FROM customers_eu;
這樣,customer_id為1的記錄會出現兩次。
UNION在數據清洗和報表生成中的作用是什么?
在數據清洗方面,UNION可以用來合并不同來源的數據,這些數據可能因為格式不一致或者數據質量問題需要清洗。比如,某個字段在不同表中使用了不同的命名,或者某些數據項缺失,我們可以通過UNION把這些數據整合起來,然后進行統一的處理。
在報表生成方面,UNION可以將不同類型的報表數據合并成一個總報表。例如,我們可以將按月統計的銷售數據和按季度統計的銷售數據合并起來,生成一個更全面的銷售報表。
假設我們有兩個表:monthly_sales和quarterly_sales,分別存儲月度和季度銷售數據。
CREATE TABLE monthly_sales ( month INT, year INT, total_sales DECIMAL(10, 2) ); CREATE TABLE quarterly_sales ( quarter INT, year INT, total_sales DECIMAL(10, 2) ); INSERT INTO monthly_sales (month, year, total_sales) VALUES (1, 2023, 1000.00), (2, 2023, 1200.00), (3, 2023, 1500.00); INSERT INTO quarterly_sales (quarter, year, total_sales) VALUES (1, 2023, 3700.00), -- 第一季度總銷售額 (2, 2023, 4000.00); -- 第二季度總銷售額
要生成一個包含月度和季度銷售數據的報表,可以使用UNION:
SELECT year, month AS period, total_sales, 'Monthly' AS sales_type FROM monthly_sales UNION ALL SELECT year, quarter AS period, total_sales, 'Quarterly' AS sales_type FROM quarterly_sales;
這個查詢會返回一個包含所有月度和季度銷售數據的報表,其中sales_type字段用于區分不同的數據類型。
如何利用UNION進行數據遷移和整合?
在數據遷移和整合過程中,UNION可以用來合并來自不同數據庫或者不同表的數據,將它們整合到一個新的數據庫或者表中。這在系統升級、數據倉庫建設等場景中非常常見。
例如,假設我們需要將兩個舊數據庫中的數據遷移到一個新的數據倉庫中。這兩個數據庫中的表結構可能略有不同,但包含相似的數據。我們可以使用UNION將這些數據整合起來,然后插入到新的數據倉庫中。
假設我們有兩個數據庫:old_db1和old_db2,分別存儲客戶信息。這兩個數據庫中的表結構略有不同。
old_db1中的表結構:
CREATE TABLE old_db1.customers ( id INT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100) ); INSERT INTO old_db1.customers (id, name, email) VALUES (1, 'John Doe', 'john.doe@example.com'), (2, 'Jane Smith', 'jane.smith@example.com');
old_db2中的表結構:
CREATE TABLE old_db2.users ( user_id INT PRIMARY KEY, full_name VARCHAR(100), email_address VARCHAR(100) ); INSERT INTO old_db2.users (user_id, full_name, email_address) VALUES (3, 'Alice Johnson', 'alice.johnson@example.com'), (4, 'Bob Williams', 'bob.williams@example.com');
要將這兩個數據庫中的數據遷移到一個新的數據倉庫中,可以使用UNION:
CREATE TABLE new_data_warehouse.customers ( customer_id INT PRIMARY KEY, full_name VARCHAR(100), email VARCHAR(100) ); INSERT INTO new_data_warehouse.customers (customer_id, full_name, email) SELECT id, name, email FROM old_db1.customers UNION ALL SELECT user_id, full_name, email_address FROM old_db2.users;
這個查詢會將old_db1.customers和old_db2.users中的數據合并起來,然后插入到new_data_warehouse.customers表中。注意,我們需要在SELECT語句中指定正確的字段名,以便將數據正確地插入到目標表中。