恒拓开源面试一题

子查询和关联子查询的区别,其实都知道怎么回事就是没答上来,整理学习下

1.关联子查询

在关联子查询中,对于外部查询返回的每一行数据,内部查询都要执行一次。另外,在关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。

例子

select c.cust_id,c.cust_type_cd,c.city  from customer c  where 2 = (select count(*)  from account a  where a.cust_id = c.cust_id);

  就是一个关联子查询

2.SQL 子查询

  当一个查询是另一个查询的条件时,称之为子查询。  子查询可以使用几个简单命令构造功能强大的复合命令。  子查询最常用于SELECT-SQL命令的WHERE子句中。  子查询是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。

编辑本段语法

可用三种语法来创建子查询:  comparison [ANY | ALL | SOME] (sqlstatement)  expression [NOT] IN (sqlstatement)  [NOT] EXISTS (sqlstatement)  子查询可分为以下几个部分:

组成部分

comparison 一个 表达式及一个比较运算符,将表达式与子查询的结果作比较。  expression 用以搜寻子查询结果集的表达式。  sqlstatement SELECT 语句,遵从与其他 SELECT 语句相同的格式及规则。它必须括在括号之中。

说明

可以拿子查询代替 表达式 用于SELECT 语句字段表或 WHERE 或 HAVING 子句。在子查询之中,在 WHERE 或 HAVING 子句的表达式中,用于计算的特定值是由 SELECT 语句提供的。

使用

ANY 或 SOME 谓词,它们是同义字,来检索主查询中的记录,这些记录要满足在子查询中检索的任何记录的比较条件。下列示例将返回全部单价比任何以 25% 或更高的折扣卖出的产品高的产品:  SELECT * FROM Products  WHERE UnitPrice > ANY  (SELECT UnitPrice FROM OrderDetails  WHERE Discount >= .25);  使用 ALL 谓词只检索主查询中的这些记录,它们满足在子查询中检索的所有记录的比较条件。如果将前一个示例中的 ANY 改为 ALL,查询只会返回单价比全部以 25% 或更高的折扣卖出的产品高的产品。这是更多的限制。  用 IN 谓词,只能在主查询检索那些记录,在子查询中的某些记录也包含和它们相同的值。下列示例返回有 25% 或更高的折扣的所有产品:  SELECT * FROM Products  WHERE ProductID IN  (SELECT ProductID FROM OrderDetails  WHERE Discount >= .25);  相反,可用 NOT IN 在主查询中检索那样的记录,在子查询中没有包含与它们的值相同的记录。  在 true/false 比较中使用 EXISTS 谓词(与可选的 NOT 保留字一道)来决定子查询是否会返回任何记录。

示例

还可用子查询中的表名别名来查询子查询外的 FROM 子句的列表。下列示例返回工资等于或高于所有职位相同员工的平均工资的员工姓名。这张员工表的别名为 "T1":  SELECT LastName,  FirstName, Title, Salary  FROM Employees AS T1  WHERE Salary >=  (SELECT Avg(Salary)  FROM Employees  WHERE T1.Title = Employees.Title) Order by Title;  上例中AS保留词可选。  某些子查询在 交叉表查询中是允许的,特别是谓词(那些在 WHERE 子句中的)。将子查询作为输出(那些列在 SELECT 中的)在交叉表查询中是不允许的。

猜你喜欢

转载自sannywei.iteye.com/blog/1678187