MySQL 查询常用操作(0) —— 查询语句的执行顺序
MySQL中明确查询语句的执行顺序极其重要,了解执行顺序才不至于犯一些简单错误,例如having 后面是否可以使用 select 中重命名的列名等问题。另外SQL中实际使用最频繁的就是查询(Queing),要想写出高质量、高性能的查询语句,必须深入地了解SQL的逻辑查询处理顺序和机制。
一、查询语句的执行顺序
基础查询语句
(5) select distinct top(<取数说明>) <选择 列表>
(1) from <表1> <连接类型> join <表2> ON <连接条件>
(2) where <筛选条件>
(3) group by <分组条件>
(4) having <条件>
(6) order by <排序的列、排序规则>
(7) limit <选择行>
注意
1、select:避免使用 select * 。按照需要进行数据查询,否则会导致查询速度变慢。避免查询多余数据。
2、where:因为还没有对数据进行分组,所以where 不能和聚合函数(count、sum、max等函数)一起使用,也不能引用 select 列表中创建的别名,因为 select 还没有执行。
3、group by 和 having:在 group by 和 having 中不可以直接使用select中重命名的列。
4、order by:但是在 order by 中可以直接使用select中重命名的列。
5、limit:如果只需要查询出一条数据,使用 limit 1。例如,想要知道是否有男生,只要能查询到一条含有男生的记录就可以。使用Limit 1 可以在找到一条数据后停止搜索,避免多余查询。
SQL并没有按照编写语句的顺序曲执行语句。上边的序号,就是查询语句在执行过程中处理逻辑的顺序。
二、查询处理机制
每个执行过程主要做那些事呢,下面具体介绍:
(1)FROM
该过程从数据库中选取需要查询的表或视图。并处理表运算符。
在涉及到联接运算的查询中(各种join),主要有以下几个步骤:
- 求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(cross join),求笛卡儿积,生成虚拟表VT1-J1。
- ON 筛选器。这个阶段对上个步骤生成的 VT1-J1 进行筛选,根据ON中出现的谓词进行筛选,让谓词取值为 true的行插入到VT1-J2。
- 添加外部行。如果指定了 outer join,还需要将VT1-J2 中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。
经过以上步骤,FROM 执行过程就完成了。
概括地讲,FROM 执行过程就是找到表并进行数据的预处理,根据条件对表进行处理。
(2)WHERE
从表或视图中筛选出满足条件的行。根据<筛选条件>中条件对 VT1中的行进行筛选,让满足条件的行插入到 VT2中。
(3)GROUP BY
根据指定的列对筛选出的行进行分组。按照指定的列名,将 VT2中的进行分组,生成VT3。最后每个分组只有一行。
(4)HAVING
从分组后的数据中筛选出满足条件的行。根据 having子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到 VT4中。
(5)SELECT
从表或视图中选取需要的列。这个阶段是投影的过程,处理select子句中提到的列,产生VT5。
一般按下列顺序进行:
- 计算 select 列表中的表达式,生成VT5-1。
- 若有 distinct,则删除VT5-1中的重复行,生成VT5-2。
- 若有 top,则根据 order by 子句定义的逻辑顺序,从VT5-2 中选择签名指定数量或者百分比的行,生成VT5-3。
(6)ORDER BY
根据指定的列对筛选出的行进行排序。按照 order by 子句中指定的列名,对VT5中的行,进行排序,生成游标VC6。
(7)LIMIT
根据指定的条件对筛选出的行再次进行筛选。按照 limit 子句中指定的行的位置,对Vc6中的行进行选择,生成VT7。
参考
MySQL 查询常用操作(0) —— 查询语句的执行顺序的更多相关文章
- MySQL 字段常用操作 添加,修改,删除,调整字段顺序
整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型 默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_sou ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- MySQL 查询in操作,查询结果按in集合顺序显示
MySQL 查询in操作,查询结果按in集合顺序显示 select * from test where id in(3,1,5) order by find_in_set(id,'3,1,5'); ...
- mysql的常用操作的封装
1.概述: 为了把繁琐的操作简化成简单的类,设计了2个类用来封装了mysql的常用操作,以便使用者可以方便地使用. 2.组成 1)数据库操作类CDatabaseConnect 2)SQL对象类CSql ...
- DBA必备:MySQL数据库常用操作和技巧
DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...
- 浅谈SQL优化入门:1、SQL查询语句的执行顺序
1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...
- Oracle中的一些查询语句及其执行顺序
查询条件: 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符:_:标识单个字符. 2)IN(list):用来取出符合列表范围中的数据. 3)NOT IN(list): 取出不符合此列表 ...
- Linux下mysql的常用操作
Linux下mysql的常用操作: 显示数据库 show databases; 选择数据库 use 数据库名; 显示数据库中的表 show tables; 显示数据表的结构 describe 表名; ...
- SQLServer2005中查询语句的执行顺序
SQLServer2005中查询语句的执行顺序 --1.from--2.on--3.outer(join)--4.where--5.group by--6.cube|rollup--7.havin ...
- MySQL笔记-语句的执行顺序
在一次查询线上问题时发现有以下两条同样的SQL,执行后数据的顺序不一样: SELECT * FROM nns_assists_item AS asset WHERE asset.nns_assist_ ...
随机推荐
- 现代 CSS 之高阶图片渐隐消失术
在过往,我们想要实现一个图片的渐隐消失.最常见的莫过于整体透明度的变化,像是这样: <div class="img"></div> div { width: ...
- 持续发烧,聊聊Dart语言的静态编译,能挑战Go不?
前言 前两天写了几篇文章,谈了谈Dart做后端开发的优势,比如: <Dart开发服务端,我是不是发烧(骚)了?> <持续发烧,试试Dart语言的异步操作,效率提升500%> & ...
- docker-compose + mysql8.x 主从数据库配置
0.准备 (略过docker的安装与镜像拉取) docker / docker-compose 安装 拉取 mysql 8.x 1. master和slave的mysql配置 master: [mys ...
- 新项目决定用 JDK 17了
大家好,我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 最近在调研 JDK 1 ...
- python 错误之TypeError: XXXXX() takes no keyword arguments
举个例子: str1 = 'sunlightn' f = str1.rfind("n", __start=1, __end=2) print(f) 以上代码运行后出现: " ...
- 2022NewStarCTF新生赛一些比较有意思的题目wp
Misc_蚁剑流量分析 Pcap的文件可以直接使用工具 编辑器打开目录,一个一个看,可以找到eval危险函数 看到n3wst4r,直接使用linux正则匹配,找出相关内容 Url解码,了解一下蚁剑流量 ...
- [图像处理] YUV图像处理入门3
5 yuv420格式的灰阶测试图 本程序中的函数主要是为YUV420P视频数据流的第一帧图像添加边框.函数的代码如下所示: /** * @file 5 yuv_graybar.cpp * @autho ...
- [python] 基于matplotlib实现圆环图的绘制
圆环图本质上是一个中间切出一块区域的饼状图.可以使用python和matplotlib库来实现.本文主要介绍基于matplotlib实现圆环图.本文所有代码见:Python-Study-Notes # ...
- 基于ERNIELayout&pdfplumber-UIE的多方案学术论文信息抽取
本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5196032?contributionType=1 基于ERNIELayout& ...
- LeetCode HOT 100:验证二叉搜索树(从左右子树获取信息进行推导)
题目:98. 验证二叉搜索树 题目描述: 给你一个二叉树,让你判断该二叉树是否是二叉搜索树.什么是二叉搜索树呢?就是某一个节点的左子树上的所有节点的值都小于当前节点,右子树上的所有节点值都大于当前节点 ...