很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我将重点讨论嵌套子查询(nested subqueries)(我将在以后介绍相关子查询)。
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
USE AdventureWorks ;
GO
SELECT DISTINCT c.LastName, c.FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID WHERE EmployeeID IN
(SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN
(SELECT ProductID
FROM Production.Product p
WHERE ProductNumber LIKE'FW%')));
GO
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
当你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,这时你可能发现嵌套子程序就很有用。
-------------------------------------------------
以上是我摘至CSDN上面的一篇文章:下面是我的想法
生成一个卖平垫圈的销售人员列表--------现在我们来分析这个句子,这个句子有很多定语,一个定语指向一个子查询。 分析成一个(卖平垫圈的)(销售的)(人员的)列表。可知需要三个子查询,从内到外。
这只是我粗劣的表达,我还是个菜鸟,我希望有更多的人能够思考怎么用我们汉语的规则来学习计算机的原理。而不是通过英文做桥梁。而是一个中到计算机的直接映射。
尽管扣偶的分吧!!!
分享到:
- 2007-10-06 09:08
- 浏览 1471
- 评论(0)
- 论坛回复 / 浏览 (0 / 3227)
- 查看更多
相关推荐
在数据库系统中,SQL(Structured Query Language)是用于管理关系数据库的标准语言,而词法分析和语法分析是编译原理中的基础概念,对于理解SqlParser的工作原理至关重要。 首先,我们来谈谈SQL。SQL包含了数据...
“SQL Server 与 Oracle 数据库实现子查询方法比较” 数据库查询都是通过 SELECT 语句来完成的,子查询就是在一个 SELECT 语句中嵌套另一个 SELECT 语句,通过子查询的嵌套可以实现复杂的数据查询功能。在 SQL ...
### 在ADO(SQL)中使用SELECT的语法之六——子查询的使用方法 #### 一、子查询概述 在SQL查询语言中,子查询是一个非常重要的概念。子查询是指在一个SQL命令内部嵌套另一个完整的SQL查询命令。通过使用子查询,我们...
本讲主要围绕子查询的概念、类型、使用方法以及子查询的语法进行详细讲解。 首先,子查询能够解决的问题主要有两类:一是找出满足特定条件的数据,二是为外部查询(主查询)提供所需的信息。例如,我们可能想知道...
- 该SQL语法分析Demo可以作为基础,扩展支持更复杂的SQL特性,如JOIN操作(内连接、外连接)、子查询、聚合函数(COUNT, SUM, AVG, MAX, MIN等)、自定义函数等。 - 这样的工具在实际开发中很有用,例如,用于SQL...
### SQL子查询和嵌套查询详解 #### 一、引言 在数据库查询语言SQL中,子查询和嵌套查询是非常强大的工具,它们允许开发者在复杂的业务逻辑中精确地提取所需的数据。本文将深入探讨子查询和嵌套查询的概念、语法以及...
- Subquery:子查询用于在一个查询中嵌套另一个查询。 - TRUNCATE:快速清空表,不记录单个行的删除。 - UPDATE:修改表中现有记录的值。 13.3 MySQL 实用工具语句: - DESCRIBE:显示表的结构信息。 - USE:切换到...
1. 高级查询:使用联接(JOIN)、子查询、聚合函数(GROUP BY, SUM, COUNT等)来构建复杂的查询。 2. 参数化查询:利用参数化查询可以防止SQL注入攻击,提高代码复用性。 3. 缓存管理:了解查询缓存机制,适时清理...
3. 子查询:SQL Server使用 `IN (SELECT ...)`,Oracle则更倾向于 `EXISTS (SELECT 1 FROM ...)`。 4. 分页查询:SQL Server 使用 `OFFSET ... ROWS FETCH NEXT ... ROWS ONLY`,Oracle则使用 `ROWNUM` 和子查询来...
支持复杂的SQL,例如嵌套/子查询等。 这是小弟为了一个Oracle项目的应急之作,我们的系统(Delphi的三层架构)一直运行在sql server下面, 当时客户指定需要的是支持Oracle版本的应用系统, 这个系统不小,如果...
- 优化JOIN操作,减少不必要的笛卡尔积和子查询,提高JOIN效率。 4. SQL查询分析器在实际工作中的应用: - 数据报表生成:通过编写复杂的SQL查询,快速生成各类数据报表。 - 数据挖掘:利用分析器进行大数据探索...
总结来说,SQL子查询和嵌套查询是数据库查询语言的重要组成部分,它们允许我们构建更复杂的查询结构,以满足对数据库的精细化操作和数据分析。熟练掌握子查询的使用,能够极大地提高数据库管理的效率和精度。
总的来说,多表查询和子查询是SQL中不可或缺的部分,它们让我们能够有效地整合和分析分布在不同表中的数据,从而提供有价值的业务洞察。掌握这两项技能对于任何数据库管理员或数据分析师来说都是非常重要的。在实际...
支持SELECT、INSERT、UPDATE、DELETE等基本操作,以及复杂的JOIN、GROUP BY、HAVING、子查询等高级功能。 2. **结果集查看**:执行查询后,分析器会以表格形式展示查询结果,支持排序、筛选、导出等功能,方便用户...
"查询.doc"可能提供了更具体的查询挑战,如多表查询、子查询、联接操作以及复杂的条件过滤。 通过学习和实践这些内容,用户能够熟练掌握SQL Server查询分析器的使用,并提升SQL编程技能,从而更好地管理和操作SQL ...
YACC(Yet Another Compiler-Compiler)则是一个根据上下文无关文法产生式(即BNF范式)的语法分析器生成工具,它使用自下而上的语法分析方法来构造语法分析器。YACC输入文件同样由三部分组成:定义部分、语法规则...
这包括了对索引的建议,以及可能的子查询优化等策略,从而提升数据库的整体性能。 除此之外,此工具可能还包含了错误检查和修复功能,能帮助用户在执行查询前发现潜在的问题。对于初学者或经验丰富的开发者来说,...
在大数据环境下,理解并熟练运用Hive的子查询语法是提升数据分析能力的关键一步。 此外,Hive与Hadoop的结合,使得它成为大数据处理的重要工具。数据仓库的概念使得Hive能够存储大量非结构化和半结构化数据,并提供...
总结起来,"C++ SQL生成语法树"是一个涉及词法分析、语法分析、设计模式应用以及数据库查询处理的复杂工程。通过这个过程,我们可以构建一个强大的工具,用于解析和理解SQL查询,从而在数据库管理和开发中发挥重要...