-
SQL 查询语句先执行 SELECT?兄弟你认真的么?
2020-05-02 19:57:21SQL 查询的执行顺序是怎样的? 好像这个问题应该很好回答,毕竟自己已经写了无数个 SQL 查询了,有一些还很复杂的。还装不了这个逼了?! 但事实是,我仍然很难确切地说出它的顺序是怎样的。 言归正传,...小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里
SQL 查询的执行顺序是怎样的?
好像这个问题应该很好回答,毕竟自己已经写了无数个 SQL 查询了,有一些还很复杂的。还装不了这个逼了?!
但事实是,我仍然很难确切地说出它的顺序是怎样的。
言归正传,SELECT语句的完整语法如下:
1. SELECT 2. DISTINCT <select_list> 3. FROM <left_table> 4. <join_type> JOIN <right_table> 5. ON <join_condition> 6. WHERE <where_condition> 7. GROUP BY <group_by_list> 8. HAVING <having_condition> 9. ORDER BY <order_by_condition> 10.LIMIT <limit_number>
然而其执行顺序却是:
FROM
<表名> # 笛卡尔积
ON
<筛选条件> # 对笛卡尔积的虚表进行筛选
JOIN <join, left join, right join...>
<join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
WHERE
<where条件> # 对上述虚表进行筛选
GROUP BY
<分组条件> # 分组
<SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
HAVING
<分组筛选> # 对分组后的结果进行聚合筛选
SELECT
<返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
DISTINCT
# 数据除重
ORDER BY
<排序条件> # 排序
LIMIT
<行数限制>- 其实,引擎在执行上述每一步时,都会在内存中形成一张虚拟表,然后对虚拟表进行后续操作,并释放没用的虚拟表的内存,以此类推。
具体解释:(注:下面“VT”表示 → 虚拟表 virtual )
- from:select * from table_1, table_2; 与 select * from table_1 join table_2; 的结果一致,都是表示求笛卡尔积;用于直接计算两个表笛卡尔积,得到虚拟表VT1,这是所有select语句最先执行的操作,其他操作时在这个表上进行的,也就是from操作所完成的内容
- on: 从VT1表中筛选符合条件的数据,形成VT2表;
- join: 将该 join 类型的数据补充到VT2表中,例如 left join 会将左表的剩余数据添加到虚表VT2中,形成VT3表;若表的数量大于2,则会重复1-3步;
- where: 执行筛选,(不能使用聚合函数)得到VT4表;
- group by: 对VT4表进行分组,得到VT5表;其后处理的语句,如select,having,所用到的列必须包含在group by条件中,没有出现的需要用聚合函数;
- having: 筛选分组后的数据,得到VT6表;
- select: 返回列得到VT7表;
- distinct: 用于去重得到VT8表;
- order by: 用于排序得到VT9表;
- limit: 返回需要的行数,得到VT10;
需要注意的是:
- group by条件中,每个列必须是有效列,不能是聚合函数;
- null值也会作为一个分组返回;
- 除了聚合函数,select子句中的列必须在group by条件中;
上述内容让我们知道一个查询会返回什么,同时,也回答了以下这些问题:- 可以在 GRROUP BY 之后使用 WHERE 吗?(不行,GROUP BY 是在 WHERE 之后!)
- 可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是 SELECT 语句里,而 SELECT 是在 WHERE 和 GROUP BY 之后)
- 可以基于 GROUP BY 里的东西进行 ORDER BY 吗?(可以,ORDER BY 基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY)
- LIMIT 是在什么时候执行?(在最后!)
但是,数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在下方进行解释↓↓↓。
SQL中的别名会影响SQL执行顺序么?如下方SQL所示:
SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) FROM table GROUP BY full_name
从这个语句来看,好像 GROUP BY 是在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎会把查询重写成这样↓↓↓:
SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) FROM table GROUP BY CONCAT(first_name, ' ', last_name)
所以,这样 GROUP BY 仍然先执行。
另外,数据库引擎还会做一系列检查,确保 SELECT 和 GROUP BY 中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。
数据库很可能不按正常顺序执行查询(优化)
在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。这个查询说明了为什么需要以不同的顺序执行查询:
SELECT * FROM dept d LEFT JOIN student s ON d.student_id = s.id WHERE s.name = '陈哈哈'
如果只需要找出名字叫“陈哈哈”的学生信息,那就没必要对两张表的所有数据执行左连接,在连接之前先进行过滤,这样查询会快得多,而且对于这个查询来说,先执行过滤并不会改变查询结果。
能看到这里的朋友都是有缘人了,为你的学习力点赞!希望大佬也能为小弟点赞支持一下哦!
-
SQL知识点001-SQL查询语句基本结构
2021-01-19 14:14:17主要梳理SQL查询语句的基本结构SQL学习在路上,每天一点点,SQL不会难
教程内容
一般每一条SQL均由一个谓语(Verb)开始,主要描述本条语句所要产生的动作,例如SELECT或UPDATE关键字;谓语后面紧接着一条或多条子句(Clause),子句主要给出了谓语或动作所要执行的内容信息。
SQL基本查询语句结构,通常要有SELECT和FROM关键字,具体结构和关键字如下:
SELECT 子句 [INTO 子句] FROM 子句 [WHERE 子句] [GROUP BY 子句] [HAVING 子句] [ORDER BY 子句]
上面结构为SQL基本的查询结构,[ ] 内为需要时可增加的条件,SELECT 和 FROM 必须要有
练习题
leetcode练习题
CODE:select name, population, area from World where area > 3000000 or population >25000000
结果:
-
java SQL查询语句
2019-03-14 15:39:18SQL查询语句 查询指定字段信息 select 字段1,字段2,…from 表名; 例如: select id,name from zhangwu; 查询表中所有字段 select * from 表名; 例如: select * from zhangwu; 注意:使用&...-
查询指定字段信息
select 字段1,字段2,…from 表名;
例如:
select id,name from zhangwu; -
查询表中所有字段
select * from 表名;
例如:
select * from zhangwu;
注意:使用"*"在练习、学习过程中可以使用,在实际开发中,不推荐使用。原因,要查询的字段信息不明确,若字段数量很多,会导致查询速度很慢。 -
distinct用于去除重复记录
select distinct 字段 from 表名;
例如:
select distinct money from zhangwu; -
别名查询,使用的as关键字,as可以省略的.
别名可以给表中的字段,表设置别名。 当查询语句复杂时,使用别名可以极大的简便操作。
– 表别名格式:
select * from 表名 as 别名;
或
select * from 表名 别名;
– 列别名格式:
select 字段名 as 别名 from 表名;
或
select 字段名 别名 from 表名;
例如
表别名:
select * from zhangwu as zw;
列别名:
select money as m from zhangwu;
或
select money m from zhangwu; -
我们在sql语句的操作中,可以直接对列进行运算。
例如:将所有账务的金额+10000元进行显示.
select pname,price+10000 from product; -
查询排序
– select * from zhangwu order by money[desc][asc默认升序]
– SELECT * FROM zhangwu WHERE NAME LIKE ‘%支出%’ ORDER BY money;
聚合函数
- count----select count(*) from zhangwu;
- sum—select sum(money) from zhangwu;
- max — select max(money) from zhangwu;
- avg — select avg(money) from zhangwu;
分组查询
- SELECT SUM(money),NAME FROM zhangwu GROUP BY NAME;
- select 查询的时候,被分组的列,要出现在select 选择列的后面
- SELECT SUM(money),NAME FROM zhangwu WHERE NAME LIKE ‘%支出%’ GROUP BY NAME DESC;
-
-
sql查询语句去除重复列(行)
2018-04-14 13:26:07有重复数据主要有一下几种情况:1.存在两条完全相同的纪录这是最简单的一种情况,用关键字distinct就可以去掉example: select distinct * from table(表名) where (条件)2.存在部分字段相同的纪录(有主键id即唯一...有重复数据主要有一下几种情况:1.存在两条完全相同的纪录这是最简单的一种情况,用关键字distinct就可以去掉example: select distinct * from table(表名) where (条件)2.存在部分字段相同的纪录(有主键id即唯一键)如果是这种情况的话用distinct是过滤不了的,这就要用到主键id的唯一性特点及group by分组example:select * from table where id in (select max(id) from table group by [去除重复的字段名列表,....])3.没有唯一键ID这种情况我觉得最复杂,目前我只会一种方法,有那位知道其他方法的可以留言,交流一下:example:select identity(int1,1) as id,* into newtable(临时表) from tableselect * from newtable where id in (select max(id) from newtable group by [去除重复的字段名列表,....])drop table newtable如果有帮助到你,帮我点个灯!
点击链接:点点
-
SQL查询语句中的 limit 与 offset 的区别
2018-08-22 15:56:25SQL查询语句中的 limit 与 offset 的区别: limit y 分句表示: 读取 y 条数据 limit x, y 分句表示: 跳过 x 条数据,读取 y 条数据 limit y offset x 分句表示: 跳过 x 条数据,读取 y 条数据 比如分页获取... -
sql查询两张表不同的数据及sql查询语句优化总结
2019-01-17 15:47:58sql查询两张表不同的数据及sql查询语句优化, 方法一(推荐) WITH C AS ( SELECT Name FROM ConsumerCouponApply A WHERE NOT EXISTS ( SELECT 1 FROM ... -
SQL优化之SQL查询语句的执行顺序解析
2019-09-09 14:44:41结合上图,整理出如下伪SQL查询语句。 SQL语句执行顺序 从这个顺序中我们可以发现,所有的查询语句都是从FROM开始执行的。在实际执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个... -
SQL查询语句的执行顺序
2018-11-05 12:24:22SQL查询语句的执行顺序 昨天写了份去年数据库的期中考试卷,其中有一题选择题要求选出查询语句select–from–where–group by–having–order by的执行顺序,这里做一下总结 执行顺序 查询语句中用到的关键词... -
sql查询语句sql联合查询
2018-07-11 06:58:15用户表A: 用户编号 姓名 地址 1 王五 北京 2 张三 上海 用户图片表B: 用户编号 图片名 ...能不能用一条查询语句获取出两个表的数据如: 1 王五 北京 a.jp,b.jpg 2 张三 上海 22.jpg,23.jpg,24.png 谢谢 -
spring data jpa 查询方法和sql查询语句对应关系
2018-10-09 15:24:15spring data jpa 查询方法和sql查询语句对应关系 -
SQL查询语句的基本使用方法
2018-10-30 17:13:23实验四 数据库的组合查询和统计查询 以下通过几个实例来演示sql语句的基本查询和多表联查,以及统计查询 假设目前已经创建好名成为’JXGL’的数据库,并且... SELECT查询语句 --查询所有的学生的学号和姓名 U... -
golang sql 查询语句注意事项
2018-04-25 10:59:571. golang中 sql查询语句,正确代码如下:var ( id int name string ) rows, err := db.Query("select id, name from users where id = ?", 1) if err != nil { log.Fatal(err) } defer rows.Close() ... -
sql查询语句执行顺序详解
2017-12-14 14:09:05sql查询语句的处理步骤如下: --查询组合字段 (5)select (5-2) distinct(5-3) top(top_specification>)(5-1)select_list> --连表 (1)from (1-J)left_table>join_type> join right_table> on on_predicate> (1-A)... -
图解一条sql查询语句执行过程
2020-06-11 10:51:13图解一条sql查询语句如何执行假设执行1.连接数据库服务器2.查询缓存(判断是否开启缓存)3.生成一个执行计划4.调用存储引擎执行计划 假设执行 select * from test 分四个大步骤执行 1.连接数据库服务器 2.查询缓存... -
使用VBA动态创建SQL查询语句
2018-02-28 07:19:00在VBA使用ADO可以高效的查询数据,但是写SQL查询语句是个有些令人头痛的事情,其实在ADO中用到的SQL语句的语法并不是很复杂,很多时候是由于即要思考SQL的语法,又要用VBA的字符串连接命令,最终搞得一团糟。... -
在Delphi中动态地使用SQL查询语句
2017-05-26 15:47:23在一般的数据库管理系统中,通常都需要应用SQL查询语句来提高程序的动态 特性。下面介绍如何在Delphi中实现这种功能。 在Delphi中,使用SQL查询语句的途径是:在窗体中置入TQuery构件,设置其 SQL属性的内容值,此... -
Mysql----SQL查询语句执行顺序
2016-08-22 16:17:17SQL查询语句执行顺序 -
SQL查询语句的书写顺序、执行顺序和注意事项
2019-10-24 15:41:31SQL查询语句的书写顺序、执行顺序和注意事项 1,SQL查询语句常用关键字 select 、from、where、group by、having、order by select :指定查看结果集中的那个列或列的计算结果 from :从哪张表查询数据 where :... -
Spring Boot Jpa之构建动态SQL查询语句
2017-05-22 16:44:19Spring Boot Jpa构建动态SQL查询语句引入依赖包: <groupId>org.springframework.boot <artifactId>spring-boot-starter-data-jpa </dependency>DAO接口继承JpaSpecificationExecutor。该接 -
Sql查询语句将数据转换数据格式
2017-10-26 14:46:27小编今天要分享的是,通过Sql查询语句将数据转换成想要的数据格式banji表结构为: name scores subject 张三 60 英语 张三 82 数学 张三 73 语文 李四 74 数学 李四 89 英语 李四 90 语文 tiyu表结构为: name scor -
SQL查询语句总结
2016-04-11 21:34:48SQL基本查询 ...一、SQL简单的查询语句 1.查看表结构 SQL>desc stu; 2.查询所有列 SQL>select * from stu; 3.查询指定列: SQL>select stuno,stuname,job from stu; SQL>select distinc stuname f -
SQL查询语句大全(个人总结)
2020-01-14 17:14:37全面的sql查询总结 -
Laravel获取最近的SQL查询语句Queries
2017-01-06 14:53:10可以通过下面代码获取最近执行的SQL查询语句: //Laravel 5 中需要开启QueryLogDB::connection()->enableQueryLog();//这里为查询操作print_r(DB::getQueryLog()) 也可以通过事件监听的方法来获取: ... -
30种SQL查询语句优化方法
2019-10-23 14:49:09关于mysql处理百万级以上的数据时如何提高其查询速度的方法最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法。 由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通... -
关于SQL查询语句的模糊查询,排序用法,limit用法的介绍
2017-06-13 15:16:29本文主要解决关于一些SQL查询语句的用法问题。比如,高级搜索,模糊搜索,排序,以及分页中需要用到的limit用法。相信能给一些sql语句基础不是特别牢固以及sql初学者解决一些问题。 -
mysql 在sql查询语句结果中,数字加千分逗号
2017-12-19 16:26:54mysql 在sql查询语句结果中,数字加千分逗号 -
.NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
2017-09-04 08:48:20Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生。本文主要罗列在.NET(ASP.NET/WINFORM)应用程序...1.使用SqlQuery在已知的实体上执行SQL查询语句 using (var context = new M -
sql查询语句中如何拼入一个字符串变量
2019-05-30 15:31:01简单的sql查询语句 select * from table where 条件; String name1 = "李明”;/String name1 = request.getparam().name; name是前端的name属性 String sql = " select * from user where name =' " +name1 + " '...