SQL查询语句执行的逻辑顺序
一、简介
大家都知道SELECT语句是用来查询数据表中的数据的,构成SELECT语句的还有各种元素(where、from、group by等),不同元素又代表了不同的处理逻辑,那么这些元素在执行查询时处理的顺序是怎么样的?
本文就说明每个元素在执行查询时的逻辑顺序和作用。
二、逻辑查询和物理查询
逻辑查询,是一个术语名词,其意思是SQL查询在处理的原理和概念,理解SQL语句背后的查询逻辑是为了让我们把查询知识更好的融会贯通。在分析逻辑查询的原理时,往往表面上会看似效率低下。
但是真正在执行的时候,数据库服务器引擎实行物理查询,数据库服务器引擎不会按部就班的按照逻辑查询的方式和步骤去执行,它会在遵守“逻辑查询”的规范和要求的前提下,实行优化方案。
三、执行顺序
对于大多数编程语言,代码的执行是按照编写时的顺序处理的,在SQL中有所不同。就select来说,虽然它出现在语句的首部,但是它实际上并不是第一个处理的元素。
通过示例代码更好的描述select查询的逻辑。
select empid,YEAR(orderdate) as orderyear,COUNT(*) as numorder
from Sales.Orders
where custid=71
group by empid,YEAR(orderdate)
having COUNT(*) >1
order by empid,orderyear
SQL语句解读:
此查询要查出客户ID为71其下的订单,按照员工ID和订单年份进行分组,并且对分组后的数据进行筛选,筛选订单数量大于1的。
查询显示的字段信息有:员工ID、订单年份和订单数量,并按照员工ID和订单年份进行了排序。
查询语句的执行顺序:
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
按照执行逻辑我们可以对比下示例中的语法,可以得出一个结论,SQL语句的逻辑执行顺序不是按照我们编写的语法格式顺序去执行的。
将语法按照逻辑执行顺序编写,分析每个元素子句执行的功能:

四、SQL语句的元素不按照编写的顺序执行
SQL设计师想把编写SQL语句的构思,就好像我们说一段话一样,让我们更好的编写查询语句。试想,一个人对另一个人下达一个指令,通常是这样描述:“给我厨房里左上方抽屉中的车钥匙”。
我们按照这样的方式去编写SQL语句就变道很直观。但如果你对机器或者计算机程序去表达指令,你就不得不以操作的角度去表达你的指令,指令会像这样描述:“去厨房,打开左上方的抽屉,拿车钥匙,带给我”。
所以我们编写SQL语句时,就可以像人与人之间表达指令一样,就像查询语句先从SELECT开始(你需要什么),而逻辑查询就像机器执行指令的概念一样(先去找到执行地点,所以它首先处理FROM)。
SQL查询语句执行的逻辑顺序的更多相关文章
- SQL查询语句执行的顺序是-----------------
MSSQL逻辑查询的步骤 摘自:Microsoft SQL Server 2005技术内幕:T-SQL查询: 逻辑查询处理中的各个阶段 本节介绍逻辑查询处理所涉及的各个阶段.我先简要描述一下每个阶段, ...
- SQL查询语句执行流程
msyql执行流程 你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:: select * from T where ID=10: 我们看到的只是输入一条语句,返回一个结果,却不知 ...
- SQL查询语句执行速度快,存储过程执行慢
今天一个生成10w条数据的存储过程执行了95s,但是单独执行SQL语句只需要28s,查资料后发现原来这是存储过程的机制导致的,也就是传说中的参数嗅探 网上的一段话: (1)可能是发生了参数嗅探,第一次 ...
- 浅谈SQL优化入门:1、SQL查询语句的执行顺序
1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...
- SQL逻辑查询语句执行顺序 需要重新整理
一.SQL语句定义顺序 1 2 3 4 5 6 7 8 9 10 SELECT DISTINCT <select_list> FROM <left_table> <joi ...
- python 3 mysql sql逻辑查询语句执行顺序
python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...
- mysql第四篇--SQL逻辑查询语句执行顺序
mysql第四篇--SQL逻辑查询语句执行顺序 一.SQL语句定义顺序 SELECT DISTINCT <select_list> FROM <left_table> < ...
- oracle中sql查询语句的执行顺序
查询语句的处理过程主要包含3个阶段:编译.执行.提取数据(sql查询语句的处理主要是由用户进程和服务器进程完成的,其他进程辅助配合) 一.编译parse 在进行编译时服务器进程会将sql语句的正文放入 ...
- MySQL数据库详解(一)执行SQL查询语句时,其底层到底经历了什么?
一条SQL查询语句是如何执行的? 前言 大家好,我是WZY,今天我们学习下MySQL的基础框架,看一件事千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MyS ...
随机推荐
- 【Ubuntu】安装配置apahce
安装apachesudo apt-get install apache2 安装目录 /etc/apache2配置文件 /etc/apache2/apache2.conf默认网站根目录 /var/www ...
- ubuntu编译安装protobuf
测试环境:Ubuntu 16.04 LTS 到protobuf的release页面 下载源码:https://github.com/protocolbuffers/protobuf/releases/ ...
- Java项目打包成exe的详细教程
Java项目打包成exe的详细教程 把Java项目打包成exe共分为以下两步: 1. 利用Eclipse先把Java项目先打成jar包 2. 利用exe4j工具把jar包转成exe 这里以Java项目 ...
- python-Event事件处理进程同步
#!/usr/bin/python from multiprocessing import Process,Event import os,time def A(e): print "blo ...
- Java代码解决ElasticSearch的Result window is too large问题
调用ElasticSearch做分页查询时报错: QueryPhaseExecutionException[Result window is too large, from + size must b ...
- 我爱Markdown (1)
作为一个程序员,用Word, Excel等写技术文档实在是不那么方便.而我,作为一个Unix/Linux程序员,写技术文档还是喜欢用Wiki等在线写作工具.虽然Wiki已经很酷了,但跟Markdown ...
- ognl,jstl,struts2标签中符号#,$,%的用法
STRUTS2标签操作Map <s:iterator value="sundayMap"> <td colspan="7" ...
- SSIS教程:创建简单的ETL包 -- 4. 增加错误处理流程(Adding Error Flow Redirection)
为了处理在转换过程中可能发生的错误,MicrosoftIntegration Services 允许根据每个组件和每个列来决定如何处理无法转换的数据. 可以选择忽略某些列中的失败.重定向整个失败的行或 ...
- 实例-PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别-获取前台公用文-dirname-PHP的"魔术常量"-str_replace
Part1:实例 $_SERVER[PHP_SELF], $_SERVER[SCRIPT_NAME], $_SERVER['REQUEST_URI'] 在用法上是非常相似的,他们返回的都是与当前正在使 ...
- (JSP)关于手机端(尤其是苹果手机)pdf文件无法打开的解决方案
流的方式下载附件 <!-- @author :daisy @date : 2011-12-04 @note : 从数据库中读取BLOB图片显示 --> <%@page import= ...