SQL 查询总是先执行SELECT语句吗?你们都错了!
SELECT语句中子句的顺序。SELECT语句中使用时必须遵循的次序。
经过一段时间的学习,我们知道了SELECT语句超简版的语法如下:
SELECT 字段名 FROM 表名
后来,我们又陆续学习了WHERE/GROUP BY/HAVING/ORDER BY等子句……
因此,我们今天就来说下SELECT语句较为完整的语法结构(如下)与它的执行顺序是怎么样的?
SELECT [DISTINCT] [TOP] 字段名
FROM 表名
[WHERE] 行级过滤
[GROUP BY] 分组
[HAVING] 组级过滤
[ORDER BY] 排序
文字版较完整的SELECT语句执行顺序如下:
1)SQL首先执行的是FROM子句,根据FROM子句中指定的一个或多个表创建表。
2)如果存在WHERE子句,则对步骤1获得的表进行条件过滤,删除不符合条件的行记录。
3)如果存在GROUP BY子句,则对步骤2生成的表按指定字段进行分组,生成一份新的数据表。
4)如果存在HAVING子句,则对步骤3的表按指定条件进行过滤,删除不满足过滤条件的记录。
5)执行SELECT子句,删除不包含在SELECT子句所指定的字段。如果SELECT子句中包含关键字DISTINCT,则执行去重运算。
6)如果有ORDER BY子句,则按指定的排序规则对结果表进行排序操作。
7)如果有TOP谓词,则再进行TOP运算。
表格版较完整的SELECT语句执行顺序如下:
顺序 |
子句 |
说明 |
是否必须使用 |
1 |
FROM |
从中检索数据的表 |
仅在从表中选择数据时使用 |
2 |
WHERE |
行级过滤 |
否 |
3 |
GROUP BY |
分组说明 |
仅在按组计算聚集时使用 |
4 |
HAVING |
组级过滤 |
否 |
5 |
SELECT |
要返回的列或表达式 |
是 |
6 |
DISTINCT |
返回唯一不同的值 |
否 |
7 |
ORDER BY |
输出排序顺序 |
否 |
8 |
TOP |
规定要返回的记录的数目 |
否 |
总结:SQL的执行顺序,既不是语句的先后顺序,也不是由内到外的顺序;比如,最先出现的SELECT 子句并非首先执行的,它的执行顺序处在HAVING之后和ORDER BY之前。DISTINCT的位置处在TOP之前,但TOP的运算顺序又在DISTINCT之后。
点击关注“SQL数据库运维”,后台回复关键字:进群,带你进入高手如云的技术交流群。
SQL 查询总是先执行SELECT语句吗?你们都错了!的更多相关文章
- SQL Server 日常维护--查询当前正在执行的语句、死锁、堵塞
查询当前正在执行的语句: SELECT der.[session_id],der.[blocking_session_id], sp.lastwaittype,sp.hostname,sp.progr ...
- sql server中同时执行select和update语句死锁问题
原始出处 http://oecpby.blog.51cto.com/2203338/457054 最近在项目中使用SqlServer的时候发现在高并发情况下,频繁更新和频繁查询引发死锁.通常我们知道如 ...
- SQL基础教程(第2版)第2章 查询基础:2-1 SELECT语句基础
● 通过指定DISTINCT可以删除重复的行.● 为列设定显示用的别名. ■列的查询 通过 SELECT 语句查询并选取出必要数据的过程称为查询(query). 该 SELECT 语句包含了 SELE ...
- Mybatis如何执行Select语句,你真的知道吗?
持续原创输出,点击上方蓝字关注我吧 作者:不才陈某 博客:https://chenjiabing666.github.io 前言 本篇文章是Myabtis源码分析的第三篇,前两篇分别介绍了Mybati ...
- SQL 查询并不是从 SELECT 开始的
原文地址:SQL queries don't start with SELECT 原文作者:Julia Evans(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...
- SQL学习(三)Select语句:返回前多少行数据
在实际工作中,我们可能根据某种排序后,只需要显示前多少条数据,此时就需要根据不同的数据库,使用不同的关键字 一.SQL Server/Access select top 数量/百分比 from tab ...
- 原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!
大家好,我是冰河~~ MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多 ...
- MySQL数据库详解(一)执行SQL查询语句时,其底层到底经历了什么?
一条SQL查询语句是如何执行的? 前言 大家好,我是WZY,今天我们学习下MySQL的基础框架,看一件事千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MyS ...
- mysql实战45讲读书笔记(一) 一条SQL查询语句是如何执行的
我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MySQL的学习也是这样.平时我们使用数据库,看到的通常都是一个整体.比如,你有个最简单的表 ...
随机推荐
- docker2-镜像原理及创建新的镜像
1,镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 在docker中所有应用 ...
- js笔记19 事件对象
1.常用的事件 onmouseover onmouseout onmousedown onmousemove onmouseup onclick onchange onfocus o ...
- hive学习笔记之五:分桶
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 『动善时』JMeter基础 — 52、使用JMeter测试Dubbo接口
目录 1.Dubbo介绍 2.准备测试Dubbo接口的环境 3.Dubbo Sample界面详解 4.Dubbo Sample组件的使用 (1)测试计划内包含的元件 (2)使用zookeeper协议请 ...
- Custom Controller CollectionQT样式自定义 002 :NoteSlider 标签滑动条
先上效果图 这个效果可以根据需求再定制,比如说文本框换成一个点下出现的气泡,跟随游标移动. 思路:继承QSlider,重写鼠标事件,添加label部件,定义其动作事件 源码:https://githu ...
- 4.QT:spinbox(spindoublebox)控件的信号响应
Qt的QSpinBox和QDoubleSpinBox两个控件在默认情况下是valueChanged信号,会响应每次输入栏的改变. 比如想要输入数值"123",我们会依次键入1 - ...
- 22、部署drdb
22.1.heartbeat部署规划: 本文的实验环境是虚拟机设备: 名称 接口 ip 用途 master-db(主) eth0 10.0.0.16/24 用于服务器之间的数据同步(直连) eth1 ...
- ESCMScript(2)Module语法
严格模式 ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";. 严格模式的限制如下 变量必须声明后再使用 函数的参数不能有同名属性,否则报错 不能 ...
- Docker搭建Jenkins+Gogs+Maven/Gradle——代码自动化运维部署平台(三)
一.简介 1.CI/CD CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法.CI/CD 的核心概念是持续集成.持续交付和持续部署.作为一个面向开发和运营团队的解决方案,CI/C ...
- Tomcat 中文乱码,设置UTF-8
1.修改tomcat的conf目录下 server.xml文件加上 URIEncoding="UTF-8" <Connector port="8080" ...