SQL案例分析之部分查询和全部查询
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子
今天给大家看一个案例来讨论,一个重要的SQL优化思路,部分查询和全部查询。
下面是要使用的两个表
root@mysql3306.sock>[employees]>select * from departments ;
+---------+--------------------+
| dept_no | dept_name |
+---------+--------------------+
| d009 | Customer Service |
| d005 | Development |
| d002 | Finance |
| d003 | Human Resources |
| d001 | Marketing |
| d004 | Production |
| d006 | Quality Management |
| d008 | Research |
| d007 | Sales |
+---------+--------------------+root@mysql3306.sock>[employees]>desc dept_emp2 ;
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| dept_no | char(4) | NO | PRI | NULL | |
| from_date | date | NO | | NULL | |
| to_date | date | NO | | NULL | |
+-----------+---------+------+-----+---------+-------+
现在需求是求出 每个部门的员工号从小到大的五个员工。
我们按照思路写下如下SQL
desc with w1 as (
select d.*
,row_number() over(PARTITION by d.dept_no order by emp_no asc ) rn
from dept_emp d
)
select dept_no ,group_concat(emp_no order by emp_no asc SEPARATOR '|' ) c from w1 where rn <=5 group by dept_no\G*************************** 1. row ***************************id: 1select_type: PRIMARYtable: <derived2>partitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 331143filtered: 33.33Extra: Using where; Using filesort
*************************** 2. row ***************************id: 2select_type: DERIVEDtable: dpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 331143filtered: 100.00Extra: Using filesort
2 rows in set, 2 warnings (0.00 sec)oot@mysql3306.sock>[employees]>with w1 as (-> select d.*-> ,row_number() over(PARTITION by d.dept_no order by emp_no asc ) rn-> from dept_emp2 d-> )-> select dept_no ,group_concat(emp_no order by emp_no asc SEPARATOR '|' ) c-> from w1-> where rn <=5-> group by dept_no;
+---------+-------------------------------+
| dept_no | c |
+---------+-------------------------------+
| d001 | 10017|10055|10058|10108|10140 |
| d002 | 10042|10050|10059|10080|10132 |
| d003 | 10005|10013|10036|10039|10054 |
| d004 | 10003|10004|10010|10018|10020 |
| d005 | 10001|10006|10008|10012|10014 |
| d006 | 10009|10010|10029|10033|10067 |
| d007 | 10002|10016|10034|10041|10050 |
| d008 | 10007|10015|10019|10040|10046 |
| d009 | 10011|10038|10049|10060|10088 |
+---------+-------------------------------+
9 rows in set (0.60 sec)
从上面的执行计划中,可以看出rows 331143 这就是说,对这个表的这么多
数据进行了排序和操作,这就是全部查询
那看下,下面的SQL
root@mysql3306.sock>[employees]>desc with w1 as (-> select-> d.* from departments d1 join lateral-> (-> select d.*-> from dept_emp2 d-> where d.dept_no = d1.dept_no-> order by d.dept_no ,d.emp_no-> limit 5-> ) d on d.dept_no = d1.dept_no-> )-> select dept_no ,group_concat(emp_no order by emp_no asc SEPARATOR '|' ) c-> from w1-> group by dept_no;*************************** 1. row ***************************id: 1select_type: PRIMARYtable: d1partitions: NULLtype: index
possible_keys: PRIMARYkey: dept_namekey_len: 162ref: NULLrows: 9filtered: 100.00Extra: Using index; Using temporary; Using filesort; Rematerialize (<derived3>)
*************************** 2. row ***************************id: 1select_type: PRIMARYtable: <derived3>partitions: NULLtype: ref
possible_keys: <auto_key0>key: <auto_key0>key_len: 16ref: employees.d1.dept_norows: 2filtered: 100.00Extra: NULL
*************************** 3. row ***************************id: 3select_type: DEPENDENT DERIVEDtable: dpartitions: NULLtype: ref
possible_keys: ix_dept_empkey: ix_dept_empkey_len: 16ref: employees.d1.dept_norows: 41376filtered: 100.00Extra: NULL
3 rows in set, 2 warnings (0.00 sec)root@mysql3306.sock>[employees]>with w1 as (-> select-> d.* from departments d1 join lateral-> (-> select d.*-> from dept_emp2 d-> where d.dept_no = d1.dept_no-> order by d.dept_no ,d.emp_no-> limit 5-> ) d on d.dept_no = d1.dept_no-> )-> select dept_no ,group_concat(emp_no order by emp_no asc SEPARATOR '|' ) c-> from w1-> group by dept_no;
+---------+-------------------------------+
| dept_no | c |
+---------+-------------------------------+
| d001 | 10017|10055|10058|10108|10140 |
| d002 | 10042|10050|10059|10080|10132 |
| d003 | 10005|10013|10036|10039|10054 |
| d004 | 10003|10004|10010|10018|10020 |
| d005 | 10001|10006|10008|10012|10014 |
| d006 | 10009|10010|10029|10033|10067 |
| d007 | 10002|10016|10034|10041|10050 |
| d008 | 10007|10015|10019|10040|10046 |
| d009 | 10011|10038|10049|10060|10088 |
+---------+-------------------------------+
9 rows in set (0.23 sec)
上面的SQL是每个dept_no 只要选出5个之后就不进行查询了,从执行计划中能够可以看出,良好的索引和排序策略,也直接把排序也消除了。这就是部分查询,即只查询满足要求的数量进而达到优化的目的。
从上面同一种需求的,两种不同SQL写法,可以看出不同的思路,就有可能导致不同的效率。
我是知数堂SQL 优化班老师~ ^^
最新一期SQL优化课,在12月份开始。
如有关于SQL优化方面疑问和一起交流的请加 并且 @兔子@知数堂SQL优化
高性能MySQL,SQL优化群 有叶金荣,吴炳锡 两位大神坐镇 :579036588
欢迎加入 知数堂大家庭。
我的微信公众号:SQL开发与优化(sqlturning)
SQL案例分析之部分查询和全部查询相关推荐
- sql案例分析:统计连续登陆、日活、蚂蚁森林、排名等
# 当天新用户hive -e \'select count(1) from hm2.daily_helper \where guid not in (select guid from hm2.hist ...
- SQL案例分析-地铁换乘线路查询.sql
阅读目录 阐述 数据库 查询"王府井"到"积水潭"的换乘路线 [MySQL 8]`WITH RECURSIVE` 递归查询父子集 父求子 子查父 阐述 WITH ...
- SQL语句查询电影评分案例分析
SQL语句查询电影评分案例分析 部分数据:(全数据有100万条) {"movie":"1193","rate":"5", ...
- SQL性能优化案例分析
这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...
- 崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析
2013数据库大会:崔华-基于Oracle的SQL优化案例分析 崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待. 2013年中国数据库技术大会第二天的"Oracle ...
- mysql数据库多表查询(内连接,外连接,自连接,子查询及案例分析)
mysql数据库多表查询 之前接触的项目或者自己涉及的部分对于多表查询的使用都比较的少,常常是自己更具案例进行学习,最近见到的比较的多,所以今天就好好的总结一下,为下一步学习做准备! 1.多表查询关系 ...
- SQL优化实战经典案例分析
前言 大家好,我是黎杜,今天和大家聊聊SQL优化的场景. SQL调优这块呢,大厂面试必问的.最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析. 1.慢SQL优化思路. 慢查询日志记录 ...
- Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略
Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...
- mysql 查询慢 分析_MySQL优化:定位慢查询的两种方法以及使用explain分析SQL
一条SQL查询语句在经过MySQL查询优化器处理后会生成一个所谓的执行计划,这个执行计划展示了具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等. 本章的内容就 ...
- P44 单行子查询案例分析
2.单行子查询案例分析 #4. 单行子查询 #4.1 单行操作符:= != > >= < <= #题目:查询工资大于149号员工工资的员工的信息SELECT employee_ ...
最新文章
- mysql数据库查询全部信息_mysql 查询怎么获取数据库下所有表的信息?
- c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
- PHOTOSHOP 快捷键
- ie6下padding bug
- jquery找祖先包含_Jquery的parent和parents(找到某一特定的祖先元素)
- python练手_Python数据分析练手项目
- vue拦截器实现统一token,并兼容IE9验证
- python中提取pdf文件某些页_付费?是不可能的!处理 PDF 只需几行代码,彻底解放双手!...
- 程序员该面向运维,还是面向开发?
- 系统架构——从Memcache单点说起
- php嗅探链接,教你如何利用php来嗅探劫持服务器数据
- 网站内链外链批量抓取工具
- 川崎机器人f控制柜接线图_Kawasaki川崎机器人控制柜维修
- js系列七:生命周期
- 知识图谱指南:从理论到应用
- 2021最新上海互联网公司排名
- android 手机号码去重,微信电话本和qq通讯录有什么不同?微信电话本常见问题汇总...
- SpringCloud 微服务开放平台接口
- docker重启后启动失败Failed to start Docker Application Container Engine.
- 深度解析AI人脸识别技术发展到什么程度了?它的能力极限是什么样子?你会不会因为天网而感到害怕?