
SQL子查询完全指南SQL Ultimate Course查询嵌套技巧【免费下载链接】sql-ultimate-courseThe most comprehensive SQL guide from a real-world expert! Learn everything from basics to advanced queries, optimizations, and real-world SQL项目地址: https://gitcode.com/gh_mirrors/sq/sql-ultimate-courseSQL子查询是SQL查询中强大而灵活的工具它允许你在一个查询中嵌套另一个查询从而解决复杂的数据检索问题。本指南将带你从基础到高级掌握SQL子查询的核心技巧和实际应用场景让你的SQL查询能力提升到新高度。什么是SQL子查询子查询Subquery是嵌套在另一个SQL查询中的查询语句也称为内部查询。外部查询可以使用子查询的结果来进一步过滤、计算或处理数据。子查询就像一个数据过滤器或计算器帮助你从数据库中提取更精确的信息。子查询的主要优势在于可以将复杂问题分解为简单的逻辑步骤减少多步查询的需要提高代码可读性和维护性实现JOIN难以完成的复杂逻辑图SalesDB数据模型展示了本文示例中使用的表结构和关系包括Products、Orders、Customers和Employees表。子查询的基本类型根据返回结果的不同子查询可以分为三种基本类型1. 标量子查询Scalar Subquery返回单个值的子查询通常用于SELECT、WHERE或HAVING子句中。SELECT AVG(Sales) FROM Sales.Orders;2. 行子查询Row Subquery返回单行多列的结果通常用于与单行比较。SELECT CustomerID FROM Sales.Orders;3. 表子查询Table Subquery返回多行多列的结果集通常用于FROM子句中作为临时表。SELECT OrderID, OrderDate FROM Sales.Orders;子查询在不同子句中的应用FROM子句中的子查询将子查询结果作为临时表使用也称为派生表Derived Table。示例查找价格高于平均价格的产品SELECT * FROM ( SELECT ProductID, Price, AVG(Price) OVER () AS AvgPrice FROM Sales.Products ) AS t WHERE Price AvgPrice;任务客户销售排名使用子查询结合窗口函数对客户销售总额进行排名SELECT *, RANK() OVER (ORDER BY TotalSales DESC) AS CustomerRank FROM ( SELECT CustomerID, SUM(Sales) AS TotalSales FROM Sales.Orders GROUP BY CustomerID ) AS t;SELECT子句中的子查询在SELECT列表中使用子查询可以为每一行返回一个计算值。示例显示产品信息及总订单数SELECT ProductID, Product, Price, (SELECT COUNT(*) FROM Sales.Orders) AS TotalOrders FROM Sales.Products;JOIN子句中的子查询子查询可以作为JOIN操作的一部分创建更灵活的连接条件。示例客户及其总销售额SELECT c.*, t.TotalSales FROM Sales.Customers AS c LEFT JOIN ( SELECT CustomerID, SUM(Sales) AS TotalSales FROM Sales.Orders GROUP BY CustomerID ) AS t ON c.CustomerID t.CustomerID;子查询与运算符的结合使用比较运算符中的子查询使用比较运算符, , , , , 结合子查询进行值比较。示例查找价格高于平均价格的产品SELECT ProductID, Price, (SELECT AVG(Price) FROM Sales.Products) AS AvgPrice FROM Sales.Products WHERE Price (SELECT AVG(Price) FROM Sales.Products);IN运算符中的子查询IN运算符允许你在WHERE子句中指定多个值非常适合与返回多个结果的子查询一起使用。示例查找德国客户的订单SELECT * FROM Sales.Orders WHERE CustomerID IN ( SELECT CustomerID FROM Sales.Customers WHERE Country Germany );使用NOT IN可以排除特定条件的结果SELECT * FROM Sales.Orders WHERE CustomerID NOT IN ( SELECT CustomerID FROM Sales.Customers WHERE Country Germany );ANY/SOME运算符中的子查询ANY运算符允许你将一个值与子查询返回的多个值进行比较。示例查找薪资高于任何男性员工的女性员工SELECT EmployeeID, FirstName, Salary FROM Sales.Employees WHERE Gender F AND Salary ANY ( SELECT Salary FROM Sales.Employees WHERE Gender M );高级子查询技术相关子查询Correlated Subquery相关子查询是引用外部查询列的子查询它会为外部查询的每一行执行一次。示例显示客户详情及各自的订单总数SELECT *, (SELECT COUNT(*) FROM Sales.Orders o WHERE o.CustomerID c.CustomerID) AS TotalSales FROM Sales.Customers AS c;EXISTS运算符EXISTS运算符用于检查子查询是否返回任何行返回布尔值TRUE或FALSE。示例检查是否存在德国客户的订单SELECT * FROM Sales.Orders AS o WHERE EXISTS ( SELECT 1 FROM Sales.Customers AS c WHERE Country Germany AND o.CustomerID c.CustomerID );使用NOT EXISTS可以检查不存在的情况SELECT * FROM Sales.Orders AS o WHERE NOT EXISTS ( SELECT 1 FROM Sales.Customers AS c WHERE Country Germany AND o.CustomerID c.CustomerID );子查询最佳实践保持简洁每个子查询只做一件事避免过于复杂的嵌套使用别名为子查询结果集指定有意义的别名提高可读性注意性能相关子查询可能导致性能问题考虑使用JOIN替代测试独立运行先单独测试子查询确保返回预期结果考虑替代方案某些情况下JOIN或窗口函数可能比子查询更高效总结SQL子查询是处理复杂数据检索的强大工具从简单的标量查询到高级的相关子查询掌握这些技巧将极大提升你的SQL查询能力。通过本文介绍的各种子查询类型和应用场景你可以开始在实际项目中灵活运用子查询解决复杂问题。完整的子查询示例代码可以在项目的scripts/18_Subqueries.sql文件中找到包含了从基础到高级的各种子查询技术实现。无论你是SQL初学者还是有经验的开发者掌握子查询都是提升SQL技能的关键一步。通过不断练习和应用这些技巧你将能够编写更高效、更优雅的SQL查询。要开始使用本项目中的SQL子查询示例你可以克隆仓库git clone https://gitcode.com/gh_mirrors/sq/sql-ultimate-course【免费下载链接】sql-ultimate-courseThe most comprehensive SQL guide from a real-world expert! Learn everything from basics to advanced queries, optimizations, and real-world SQL项目地址: https://gitcode.com/gh_mirrors/sq/sql-ultimate-course创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考