深入了解With SQL

With SQL,即通用表表達式(Common Table Expressions),是一種用於定義帶有命名查詢的臨時表格的語法格式。With SQL 結構類似於子查詢,但比起子查詢,它更易於理解、維護和重用。在本文中,我們將以多個方面來深入探討 With SQL 的使用方法和優勢。

一、簡介

With SQL 或稱為 CTE(Common Table Expressions),是標準 SQL 中一個非常強大且十分實用的特性。它允許我們在 SQL 查詢中使用諸如 SELECT、INSERT、DELETE 和 UPDATE 等操作。可類比編程語言中的變量,With SQL 在 SQL 查詢過程中起到了變量的作用,減少了多次複雜查詢重複操作,同時也提高了查詢的性能。

CTE 可以在 WITH 子句中定義多個表,這些表的名稱和定義與查詢的其餘部分分開。常見的使用場景包括:遞歸查詢,過濾重複數據,使用窗口函數進行排序。

WITH employees_working_in_USA AS (
  SELECT * 
  FROM employees 
  JOIN departments ON employees.department_id = departments.department_id
  WHERE departments.country = 'USA'
)
SELECT * FROM employees_working_in_USA;

上述示例展示了一個簡單的 With SQL 查詢。該查詢首先創建一個名為 employees_working_in_USA 的臨時表格,其中存儲了來自 employees 表和 departments 表的所有員工和其工作部門信息,且只選擇部門在美國的員工。然後,該查詢從 employees_working_in_USA 表中選擇所有列。

二、新增列、表或子查詢

With SQL 查詢中,我們不僅可以選擇常規查詢的列,還可以添加新的列或子查詢。這使我們可以在查詢中計算一些值或使用其他更高級別的查詢。

WITH revenue AS (
  SELECT order_id, (quantity * price) AS order_revenue
  FROM order_details
)
SELECT MAX(order_revenue)
FROM revenue;

上述示例展示了一個 With SQL 查詢,具有從 order_details 表計算總收入的計算列(即使用 quantity 和 price 計算 order_revenue)。這種計算列可以被其他查詢繼續使用。

With SQL 還可以被用作子查詢的一部分。這意味着您可以從一個 With SQL 查詢中選擇並連接數據,而不必為每個子查詢重複執行相同的工作。

WITH high_sales AS (
    SELECT region, SUM(sales) AS total_sales
    FROM sales
    GROUP BY region
    HAVING SUM(sales) >= 1000000
)
SELECT * FROM employees 
WHERE department_id IN (
    SELECT department_id FROM high_sales
);

三、遞歸查詢

遞歸查詢是 With SQL 最為重要的應用之一。遞歸查詢主要是針對有父子結構關係的數據表進行處理,並且對於需要多次遞歸訪問相同表格的操作,使用 With SQL 可以減少重複代碼並提高性能。

WITH RECURSIVE tree(id, name, parent_id) AS (
    SELECT id, name, parent_id
    FROM menu
    WHERE name = 'Home'
  UNION ALL
    SELECT m.id, m.name, m.parent_id
    FROM menu m
    INNER JOIN tree t ON m.parent_id = t.id
)
SELECT * FROM tree;

上述示例中,我們使用了遞歸查詢來獲取“Home”節點的所有子節點信息,這裡的 menu 表必須具有自引用關係,即有父節點和子節點的關聯。查詢首先從 menu 表中選出根節點 name=’Home’ 的項,然後使用 union all 遞歸地加入所有子項,直到完全遍歷完所有子節點。

四、使用連接數據

With SQL 還可以被用作連接數據的一種方式。下面是一個使用 With SQL 和 INNER JOIN 語句來連接兩個數據表的查詢示例:

WITH ActiveOrders AS (
    SELECT order_id
    FROM orders
    WHERE order_status = 'Active'
)
SELECT *
FROM customers c
INNER JOIN ActiveOrders o ON c.customer_id = o.customer_id;

上述示例中,我們先創建一個名為 ActiveOrders 的 With SQL 查詢,它選擇所有狀態為“Active”的訂單。然後,我們將其與 customers 表格 INNER JOIN 在一起,以檢索所有客戶和其關聯的活動訂單。

總結

With SQL 是 SQL 查詢中非常實用的特性之一。使用 With SQL 可以減少在代碼中的冗餘,同時提高查詢的可讀性和性能。本文介紹了幾個使用 With SQL 的示例,您可以根據需求和場景進行靈活運用。

原創文章,作者:VMSKD,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/371643.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VMSKD的頭像VMSKD
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是數據庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • SQL Server Not In概述

    在今天的軟件開發領域中,數據庫查詢不可或缺。而SQL Server的”Not In”操作符就是這個領域中非常常用的操作符之一。雖然”Not In…

    編程 2025-04-25
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • Oracle Start With詳解

    一、Start With概述 Start With是Oracle中連接查詢的一個重要語句,它允許我們在一個遞歸查詢中藉助樹結構進行查詢,並且支持多種關聯查詢方式。通過Start W…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25

發表回復

登錄後才能評論