04高级查询

来源:互联网 发布:华中农业大学学报软件 编辑:程序博客网 时间:2024/06/06 02:16

SQL 子查询 基本概念

  当一个查询是另一个查询的条件时,称之为子查询。

子查询可以使用几个简单命令构造功能强大的复合命令。

  子查询最常用于SELECT-SQL命令的WHERE子句中。子查询是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。

语法

      简单子查询语法: select ...... from  表1 where 列1 >(子查询)    


更全面的语法:可用三种语法来创建子查询:  

 

   1:       comparison [ANY | ALL | SOME] (sqlstatement) 

 

   2:      expression [NOT] IN (sqlstatement)  

 

   3:      [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 中的)在交叉表查询中是不允许的。

 

 

IN和NOT IN子查询

 

使用比较运算符时,要求子查询只能返回一条或空的记录

 

IN后面的子查询则可以返回多条记录

 

not in 是 in 取反的效果.

 

 

Exists 和 not Exists 子查询

 

Exists关键字能检测数据是否存在

 

 

示例:如果存在数据库MySchool,则先删除,然后创建

if exists (select * from sysdatabases where name='MySchool')

 drop database MySchool

go

Create database MySchool

...  ...       创建数据库的具体代码略

go

 

Not Exists 就是Exists取反,表示不存在.

 

子查询注意事项:

 

子查询语句可以嵌套在SQL语句中任何表达式出现的位置

 

在子查询的SELECT子句中不能出现TEXT, NTEXT 或IMAGE 等二进制数据类型的列

 

只出现在子查询中而没有出现在父查询中的表不能包含在输出列中

 

 

 

原创粉丝点击