分享

SQL中SELECT语句的执行顺序

 wghbeyond 2011-05-04
好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序, 往往组织的 SQL 语句缺少很好的逻辑, 凭感觉 "拼凑" ( 不好意思, 如果您的 SQL 语句也经常 "拼凑", 那您是不是得好好反省一下呢?, 呵呵). 确实是爽了自己, 可苦了机器, 服务器还需要在我们的杂乱无章的 SQL 语句中寻找它下一句需要执行的关键字在哪里. 效率嘛, 由于我们的感觉神经对秒以下的变化实在不敏感, 暂且就认为自已写的 SQL 顺序无关紧要, "反正没什么变化!", 呵呵.其实服务器对每句 SQL 解析时间都会有详细记录的, 大家可以看一下自已按习惯写的 SQL 和按标准顺序写的SQL解析时间差别有多大.
  因此, 考试#大建议大家在平时工作中 SQL 语句按标准顺序写, 一是专业, 二是实用, 呵呵, 不过觉得最主要的是心里感觉舒服.
  标准的 SQL 的解析顺序为:
  (1).FROM 子句, 组装来自不同数据源的数据
  (2).WHERE 子句, 基于指定的条件对记录进行筛选
  (3).GROUP BY 子句, 将数据划分为多个分组
  (4).使用聚合函数进行计算
  (5).使用 HAVING 子句筛选分组
  (6).计算所有的表达式
  (7).使用 ORDER BY 对结果集进行排序
  举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的.
  标准顺序的 SQL 语句为:
  select 考生姓名, max(总成绩) as max总成绩
  from tb_Grade
  where 考生姓名 is not null
  group by 考生姓名
  having max(总成绩) > 600
  order by max总成绩
  在上面的示例中 SQL 语句的执行顺序如下:
  (1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
  (2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
  (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
  (4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
  (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
  (7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多