H2 數據庫中的子查詢與聯合查詢關鍵字

在 H2 數據庫處理複雜查詢時,子查詢和聯合查詢關鍵字就像精密的 “組合工具”,能把多個簡單的查詢邏輯拼接成強大的檢索能力,輕鬆應對多條件關聯、數據合併等場景。

子查詢相關關鍵字

子查詢是嵌套在其他查詢中的查詢語句,IN、NOT IN、EXISTS、NOT EXISTS等關鍵字是連接內外查詢的橋樑,讓數據篩選更靈活。

IN子查詢適合外層查詢字段與內層查詢結果集做匹配,比如查詢購買過 “智能手機” 的用户信息:

SELECT user_id, username 
FROM users 
WHERE user_id IN (
    SELECT DISTINCT user_id 
    FROM orders 
    WHERE order_id IN (
        SELECT order_id 
        FROM order_items 
        WHERE product_name = '智能手機'
    )
);

內層查詢先找出包含 “智能手機” 的訂單 ID,中層查詢根據訂單 ID 找到對應的用户 ID,外層查詢最終獲取這些用户的信息,三層嵌套精準定位目標數據。

EXISTS子查詢更注重 “是否存在” 的判斷,當內層查詢有結果時,外層查詢就返回對應記錄。比如查詢至少有 3 條訂單的用户:

SELECT user_id, username 
FROM users u 
WHERE EXISTS (
    SELECT 1 
    FROM orders o 
    WHERE o.user_id = u.user_id 
    GROUP BY o.user_id 
    HAVING COUNT(order_id) >= 3
);

這裏內層查詢只要找到符合 “訂單數≥3” 的用户 ID,外層就會選中該用户,相比IN子查詢,在大數據量下性能更穩定。

NOT EXISTS則與EXISTS相反,用於篩選內層查詢無結果的記錄,比如查詢從未下過單的用户:

SELECT user_id, username 
FROM users u 
WHERE NOT EXISTS (
    SELECT 1 
    FROM orders o 
    WHERE o.user_id = u.user_id
);

只要用户在訂單表中沒有匹配記錄,就會被篩選出來,邏輯清晰且執行高效。

聯合查詢關鍵字

當需要合併多個查詢結果時,UNION和UNION ALL關鍵字能將多個SELECT語句的結果集合併成一個,適用於數據分散在多張表或需按不同條件查詢同一批數據的場景。

UNION會自動去除合併結果中的重複記錄,比如合併 “已支付” 和 “已發貨” 的訂單編號(去重):

SELECT order_no, '已支付' AS status 
FROM orders 
WHERE pay_time IS NOT NULL

UNION

SELECT order_no, '已發貨' AS status 
FROM orders 
WHERE ship_time IS NOT NULL;

如果某個訂單既已支付又已發貨,UNION會只保留一條記錄,避免重複。

UNION ALL則保留所有記錄,包括重複的,執行速度比UNION更快,適合確定無重複數據或需要保留重複數據的場景。比如合併今年和去年的銷售額統計:

SELECT '2023年' AS year, SUM(pay_amount) AS total_sales 
FROM orders 
WHERE YEAR(order_time) = 2023

UNION ALL

SELECT '2024年' AS year, SUM(pay_amount) AS total_sales 
FROM orders 
WHERE YEAR(order_time) = 2024;

兩年的數據自然不會重複,用UNION ALL能減少去重計算,提升查詢效率。

使用聯合查詢時,要注意各SELECT語句的字段數量和類型必須一致,否則會報錯。比如下面的寫法就會出錯:

-- 錯誤示例:字段數量不一致
SELECT order_no FROM orders WHERE status = '已支付'
UNION
SELECT order_no, pay_amount FROM orders WHERE status = '已發貨';

子查詢關鍵字擅長 “由內及外” 的精準篩選,聯合查詢關鍵字則擅長 “橫向合併” 的結果整合。在實際業務中,查詢用户消費等級(用子查詢計算消費總額)、合併多渠道數據報表(用聯合查詢)等場景,都能通過這些關鍵字快速實現,讓複雜查詢邏輯變得條理清晰、執行高效。