首页 > 试题广场 >

其执行顺序应该是?

[单选题]
对于满足SQL92标准的SQL语句:
select foo,count(foo)from pokes where foo>10group by foo having count (*)>5 order by foo
其执行顺序应该是?
  • FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY
  • FROM->GROUP BY->WHERE->HAVING->SELECT->ORDER BY
  • FROM->WHERE->GROUP BY->HAVING->ORDER BY->SELECT
  • FROM->WHERE->ORDER BY->GROUP BY->HAVING->SELECT
推荐
答案是A
1、from子句组装来自不同数据源的数据;  
2、where子句基于指定的条件对记录行进行筛选; 
3、group by子句将数据划分为多个分组; 
4、使用聚集函数进行计算; 
5、使用having子句筛选分组; 
6、select计算所有的表达式; 
7、使用order by对结果集进行排序。 
编辑于 2015-11-07 16:30:15 回复(3)
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。

      每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。下面是对应用于SQL server 2000和SQL Server 2005的各个逻辑步骤的简单描述。


( 8 ) SELECT  ( 9 ) DISTINCT   ( 11 ) < Top  Num >   < select  list >
(
1 ) FROM   [ left_table ]
(
3 ) < join_type >   JOIN   < right_table >
(
2 ) ON   < join_condition >
(
4 ) WHERE   < where_condition >
(
5 ) GROUP   BY   < group_by_list >
(
6 ) WITH   < CUBE  |  RollUP >
(
7 ) HAVING   < having_condition >
(
10 ) ORDER   BY   < order_by_list >

逻辑查询处理阶段简介

  1. FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
  2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
  3. OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
  4. WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
  5. GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
  6. CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
  7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.
  8. SELECT:处理SELECT列表,产生VT8.
  9. DISTINCT:将重复的行从VT8中移除,产生VT9.
  10. ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
  11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。

发表于 2015-11-26 09:44:01 回复(0)
有FROM、WHERE、GROUP BY、HAVING、聚合函数的语句,
1、先执行where子句查找符合条件的数据;
2、使用group by 子句对数据进行分组;
3、对group by 子句形成的组运行聚集函数计算每一组的值
4、最后用having 子句去掉不符合条件的组。
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据;
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据。
发表于 2015-11-23 19:18:17 回复(0)
ORDER BY 是对所有的结果集进行排序,是SECLET选择后的排序。
发表于 2016-09-09 11:19:48 回复(0)
from->where->group by->having->select->order by
发表于 2021-09-09 10:42:20 回复(0)

有FROM、WHERE、GROUP BY、HAVING、聚合函数的语句,
1、先执行where子句查找符合条件的数据;
2、使用group by 子句对数据进行分组;
3、对group by 子句形成的组运行聚集函数计算每一组的值
4、最后用having 子句去掉不符合条件的组。
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据;
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据。
发表于 2019-03-18 14:43:32 回复(0)

A FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

解析:

1.FROM:从指定的表中读取数据 2.WHERE:对数据进行过滤,满足条件的数据才会被保留下来 3.GROUP BY:对数据进行分组,根据指定的字段进行分组 4.HAVING:对分组后的数据进行进一步过滤,满足条件的才会被保留下来 5.SELECT:选择需要输出的字段 6.ORDER BY:对结果进行排序

所以上述语句执行顺序应该是: FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

也就是选择pokes表,筛选foo>10的数据,按照foo进行分组并筛选count(foo)>5的数据,选择foo和count(foo)字段并且按照foo排序。

发表于 2023-01-27 19:44:22 回复(0)
1.from
2.where
3.group by 
4聚集函数
5.having
6,select
7.order by
发表于 2022-05-03 09:42:54 回复(0)
先从from的表中挑出符合where条件的元组,按照groupby中属性进行分组,挑出符合having聚集函数中的元组,最后选择select中挑选的属性列,按照orderby中的升降序排显示出来先表后元组再列排序
发表于 2021-03-08 10:36:48 回复(0)
先使用group by,然后用having,然后select,最后使用order by。
发表于 2016-01-20 15:59:39 回复(0)