Select语句执行步骤

来源:互联网 发布:java酒店管理系统代码 编辑:程序博客网 时间:2024/05/17 01:08

原文地址

由Select语句生成的查询结果是通过一个接一个应用它的字句来制定的。

首先应用From子句,

接着应用Where子句,

然后应用Select子句,

最后应用Order By子句来排序查询结果。

要生成Select语句的查询结果,请遵循下面的这些步骤

1.从From子句中提到的表开始

2.如果有一条Where子句,应用它的搜索条件到表的每一条记录,保留搜索条件为True的那些记录,并去掉搜索条件为False或NULL的那些记录。

3.对每个保留的记录,计算选择列表中每项的值,以生成一条查询结果记录。对于每个字段引用,使用当前记录中字段的值。

4.如果指定了Select Distinct,消除所生成的查询结果中的任何重复记录。

5.如果有一条Order By子句,按指定的那样排序查询结果。

使用Union的几个重要的限制:

两个表必须包含同样数目的字段

在第一个表中的数据类型必须与第二个表中对应字段的数据类型相同

两个表都不能用Order By子句排列。然而,组合后的查询结果可以排序


select MFR_ID,Product_id
from Products
where price > 2000.00
union
select distinct MFR,Product
from orders
where amount > 30000.00

(这个Union语句将按照默认的消除重复的记录)


select MFR_ID,Product_id
from Products
where price > 2000.00
union all
select distinct MFR,Product
from orders
where amount > 30000.00

(这句将不会消除重复的记录)

Union和排序

Order by 子句不能出现在由Union操作组合的两个select中,不管怎样,排序两个查询结果集没有太多的意义,因为它们被直接加入到UNION操作中,对用户是不可见的。然而,有UNION操作生成的组合的查询结果集可以通过在第二个select语句后指定一个Order by子句来排序。因为由Union操作生成的字段是没有命名的,Order By子句必须按字段编号指定字段。


select MFR_ID,Product_id
from Products
where price > 2000.00
union
select distinct MFR,Product
from orders
where amount > 30000.00

Order by 1,2

如果指定一个不带Where子句的量表查询,SQL产生连个表的积作为查询结果。

显示销售人员及其工作的城市的所有可能的组合

select name,city

from salesreps,offices

将生成salesreps和offices表的积,显示所有可能的销售人员/城市对。

多表查询处理原则:

1.如果语句是select语句的一个UNION,将第2步到第5步应用到每一条语句,以生成它们各自的查询结果。

2.形成在FROM子句中提到的表的乘积。如果FROM子句命名了一个表,则积就是那个表。

3.如果有一条WHERE子句,把它的搜索条件应用到积表的每一条记录,保留搜索条件为TRUE的那些记录(并去掉搜索条件为FALSE或NULL的那些记录)。

4.对于每个保留的记录,计算选择列表中每一项的值,以生成一条查询结果记录。对于每个字段引用,使用单签记录中字段的值。

5.如果指定了SELECT DISTINCT,消除所生成的查询结果中的任何重复的记录。

6.如果语句是SELECT语句的一个UNION,把各条语句的查询结果合并到一个查询结果表中。消除重复的记录,除非指定了UNION ALL。

7.如果存在一条ORDER BY子句,按指定的那样排序查询结果。

(基于SQL的DBMS实际上不会按这种方式执行查询,但是,前面定义的目的不是要描述DBMS是怎样执行查询的,相反,它构成了如何弄清楚一个特定的多表查询意味着什么的定义,即,它应该生成的查询结果集。)

查询执行顺序的扩展:

1.如果语句是SELECT语句的一个UNION,把第2步到第7不应用到每条语句,以生成它们各自的查询结果。

2.形成在FROM子句中命名的表的乘积。如果FROM子句命名了一个表,则积就是那个表。

3.如果有一条WHERE子句,应用它的搜索条件到积表的每一记录,保留其搜索条件为TRUE的那些记录。

4.如果有一条GROUP BY子句,把积表的剩余的记录安排到记录组中,以便每个组中的记录在所有的分组字段中有同样的值。

5.如果有一条HAVING子句,把它的搜索条件应用到每个记录组,保留其搜索条件为TRUE的那些组.

6.对于每个保留的记录(或记录组),计算选择列表中每一项的值,以生成一个查询结果记录。对一个简单的字段引用,使用单签记录(或记录组)中的字段值。对于一个字段函数,如果指定了GROUP BY,使用当前记录组作为它的参数;否则,使用全部的记录。

7.若果指定了SELECT DINSTINCT,则消除所生成的查询结果中任何重复的记录。

8.如果语句是SELECT语句的UNION,合并各个语句的查询结果到一个查询结果表中。消除重复的记录,除非指定了UNION ALL。

9.如果有ORDER BY子句,按指定顺序排序查询结果。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/minyangchina/archive/2009/08/20/4465614.aspx