Select语句执行步骤

原文地址

由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子句,按指定顺序排序查询结果。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/minyangchina/archive/2009/08/20/4465614.aspx

### 回答1: MySQLSELECT语句执行顺序如下: 1. FROM:指定要查询的表或视图。 2. JOIN:如果查询涉及到多个表,需要使用JOIN关键字将它们连接起来。 3. WHERE:指定查询条件,只有符合条件的记录才会被返回。 4. GROUP BY:按照指定的列对结果进行分组。 5. HAVING:指定分组后的条件,只有符合条件的分组才会被返回。 6. SELECT:指定要查询的列。 7. DISTINCT:去除重复的记录。 8. ORDER BY:指定结果的排序方式。 9. LIMIT:指定返回结果的数量。 以上是MySQL SELECT语句执行顺序,需要注意的是,不是所有的SELECT语句都需要按照这个顺序执行,有些语句可能会省略其中的一些步骤。 ### 回答2: MySQLSELECT语句执行顺序可以分为以下9个步骤: 1. 执行FROM子句,获取表中的数据。 2. 执行WHERE子句,筛选出符合条件的数据。 3. 执行GROUP BY子句,将数据按照指定的列进行分组。 4. 执行HAVING子句,筛选出符合条件的分组。 5. 执行SELECT子句,选择需要查询的列。 6. 执行DISTINCT关键字,去除重复的行。 7. 执行ORDER BY子句,按照指定的列对结果集进行排序。 8. 执行LIMIT子句,指定返回的结果数量。 9. 最后输出查询结果。 需要注意的是,执行顺序并不一定按照上述顺序执行,某些步骤可能被优化或者省略,例如如果查询中没有WHERE子句,则不需要执行WHERE子句。此外,MySQL还支持查询缓存,如果查询缓存中已经存在相同的查询结果,则直接返回缓存结果,不需要执行上述步骤。 在优化查询性能时,可以使用多种技巧来优化各个步骤。例如,可以使用索引来加速查询的WHERE条件,使用分区表来加速GROUP BY操作,使用EXPLAIN关键字来分析查询性能等。 ### 回答3: MySQLSELECT语句是关系型数据库中最常用的查询语句,在操作数据时必须掌握其执行顺序。SELECT语句执行顺序分为以下六个步骤: 1. FROM子句:指定要查询的表及其所在的数据库。如果在查询时使用了多个表,那么就需要使用JOIN等操作将这些表联接起来。 2. JOIN子句:根据指定的连接条件将要查询的表连接起来。JOIN子句在FROM子句之后执行,但是在WHERE子句之前执行。 3. WHERE子句:指定查询的条件。WHERE子句在JOIN子句之后执行,但是在GROUP BY子句之前执行。 4. GROUP BY子句:将查询的结果分组。GROUP BY子句在WHERE子句之后执行,但是在HAVING子句之前执行。 5. HAVING子句:指定按组过滤后的查询结果。HAVING子句在GROUP BY子句之后执行,但是在SELECT子句之前执行。 6. SELECT子句:指定要查询的列及其计算方式。SELECT子句在所有子句中最后执行。 需要注意的是,SELECT语句中的ORDER BY子句并不是查询执行顺序的一部分,而是在查询结束后对查询结果进行排序的语句。因此,ORDER BY子句总是在SELECT语句执行完毕之后执行。 总之,了解SELECT语句执行顺序是操作关系型数据库的基本要求,只有深入理解每个步骤的顺序,才能更好地优化数据库查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值