Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >盘点 Sql 中几个比较实用的小 Tips!

盘点 Sql 中几个比较实用的小 Tips!

作者头像
AirPython
发布于 2021-11-23 07:47:57
发布于 2021-11-23 07:47:57
76100
代码可运行
举报
文章被收录于专栏:Python 自动化Python 自动化
运行总次数:0
代码可运行

1. 前言

大家好,我是安果!

工作中,我们经常需要编写 SQL 脚本,对数据库进行增、删、改、查,很少会考虑到 Sql 性能优化

实际上,从性能角度考虑,有很多 Sql 关键字都有它们各自的使用场景;如果使用恰当,能大大地提升后端服务的响应效率

下面以 Mysql 为例,罗列出几个比较实用的小 Tips

2. union、union all、or

union [all] 代表联合查询,即:将多个查询结果合并起来成一个结果并返回

PS:union 联合查询针对每一个查询结果,必须保证列数量、列数据类型及查询顺序一致

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 以两张表的联合查询为例
# table_one:表一
# table_two:表二
# 表一中的查询字段:table_one_field1,table_one_fileld2...
# 表二种的查询字段:table_two_field1,table_two_field2...
# 注意:表一、表二查询字段数目、字段类型、字段顺序应该保持一致
select table_one_field1,table_one_fileld2...
from table_one
union [all]
select table_two_field1,table_two_field2...
from table_two;

其中,union、union all、or 三者的区别如下:

  • union 表链接后会利用字段的顺序进行排序,以此筛选掉重复的数据行,最后再返回结果 因此,当数据量很大时效率很低
  • union all 相比 union,union all 在表链接时不会删除重复的数据行,直接返回表联合后的结果 因此,union all 执行效率要高很多,在不需要去重和排序时,更推荐使用 union all
  • or or 用于 SQL where 子句中,SQL 脚本可读性更高,但是它会引起全表扫描,根本不走索引查询 所以通常情况下,union [all] 查询会利用索引进行查询,执行效率要高于 or;但是当 or 条件中查询列相同,or 的执行效率要高于 union

3. group by + having、where

group by 分组查询,根据一个或多个列对结果集进行分组,一般配合聚合函数使用

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查询字段:多个查询字段
select 查询字段...,聚合函数...
from table_one where 条件语句 group by 分组字段...having 分组条件;

# 比如
select red_num1,count(red_num1)
from dlt where create_at>='2021-11-01' group by red_num1;

其中,having 和 where 使用上有下面区别:

  • where 在 group by 分组前执行,将查询结果按照条件过滤数据 需要注意的是,where 无法与聚合函数一起使用
  • having 只能配合 group by 使用,在分组之后执行,用于过滤满足条件的组 需要注意的是,分组是一个耗时的操作,建议在分组前使用 where 对数据进行一次过滤,然后再进行分组

比如,where 搭配 having 一起使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查询表dlt
# 首先,使用where通过时间过滤数据
# 然后,使用字段red_num1+group by对数据进行分组
# 最后,使用having对分组后的数据再进行一次过滤
select red_num1,count(red_num1)
from dlt where create_at>='2021-10-01' group by red_num1 having count(red_num1)>=2;

4. exists、in

exists 用于 where 子句中,一般用于判断子查询中是否会返回数据,如果返回的数据不为空,则为 True,否则为 False

PS:exists 也可以搭配 not 使用,查询出不满足子查询语句的数据

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- exists使用
select *
from 表一 where exists(select * from 表二 where 条件判断语句);

-- not exists使用
select *
from 表一 where not exists(select * from 表二 where 条件判断语句);

in 同样用于 where 子句中,筛选出某个表字段存在于多个值中的所有数据

关键字 in 常见的 2 种使用方式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- in 使用
-- 方式一
select *
from 表名 where 字段 in(过滤字段1,过滤字段2,过滤字段3...);

-- 方式二
select *
from  表名1
where  字段1 in (select 字段2 from 表名2 where condition)

由于 SQL 做子查询最优方案是小表驱动大表,对于 in 来说是子查询表驱动外表,当子查询表数据少于主表数据时推荐使用

而 exists 是外表驱动子查询表,因此当外表数据少于子查询表时更推荐使用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AirPython 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MYSQL基本操作-select 查询语句【续】
筛选分组结果 having关键字对group by分组后的数据进行过滤 having支持where的所有操作符和语法
MIKE笔记
2023/03/23
1.8K0
MYSQL基本操作-select 查询语句【续】
mysql学习总结04 — SQL数据操作
mysql 中 SELECT 命令类似于其他编程语言的 print 或 write,可用来显示字符串、数字、数学表达式的结果等
CS逍遥剑仙
2018/06/24
5.2K0
mysql学习总结04 — SQL数据操作
探讨MySQL中 “约束“ 下的查询
这里还使用了auto_increment,在插入时不指定,可以让id字段自增。   
用户11305962
2024/10/09
1710
探讨MySQL中 “约束“ 下的查询
数据仓库开发 SQL 使用技巧总结
作者:dcguo 使用 sql 做数仓开发有一段时间了,现做一下梳理复盘,主要内容包括 sql 语法、特性、函数、优化、特殊业务表实现等。 mysql 数据结构 常用 innodb 存储为 B+ 树 特点 多路平衡树,m 个子树中间节点就包含 m 个元素,一个中间节点是一个 page(磁盘页) 默认 16 kb; 子节点保存了全部得元素,父节点得元素是子节点的最大或者最小元素,而且依然是有序得; 节点元素有序,叶子节点双向有序,便于排序和范围查询。 优势 平衡查找树,logn 级别 crud; 单一节点比二
腾讯技术工程官方号
2022/07/19
3.3K0
数据仓库开发 SQL 使用技巧总结
SQL学习笔记之项目中常用的19条MySQL优化
MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用连接来替换。
Jetpropelledsnake21
2018/08/10
5010
SQL学习笔记之项目中常用的19条MySQL优化
Python 高级笔记第二部分:数据库的概述和MySQL数据表操作
SQL结构化查询语言(Structured Query Language),一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
杨丝儿
2022/02/24
1.8K0
Python 高级笔记第二部分:数据库的概述和MySQL数据表操作
MySQL表的增删查改(二)
创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键,classes_id为外键,关联班级表id:
海盗船长
2020/08/27
2.5K0
高级SQL查询-(聚合查询,分组查询,联合查询)[通俗易懂]
当遇到常见的统计总数、计算平局值等操作,可以使⽤聚合函数来实现,常见的聚合函数有:
全栈程序员站长
2022/09/05
4.5K0
MySQL - SQL优化干货总结(吐血版)
BATJTMD等大厂的面试难度越来越高,但无论从大厂还是到小公司,一直未变的一个重点就是对SQL优化经验的考察。一提到数据库,先“说一说你对SQL优化的见解吧?”。SQL优化已经成为衡量程序猿优秀与否的硬性指标,甚至在各大厂招聘岗位职能上都有明码标注,如果是你,在这个问题上能吊打面试官还是会被吊打呢?
陈哈哈
2020/07/03
1.3K0
学会Mysql第三天
1、having 是在 group by 子句之后:可以针对分组数据进行统计筛选。
白胡杨同学
2020/04/16
7380
MySQL:DQL 数据查询语句盘点
常用的语句关键字有:SELECT、FROM、WHERE、ORDER BY、HAVING、ASC|DESC
栗筝i
2022/12/01
1.6K0
让MySQL速度提升3倍的19种优化方式
MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用连接来替换。
数据和云
2019/05/20
2.5K0
让MySQL速度提升3倍的19种优化方式
mysql架构sql基础2
select 配合 from使用 相当于linux的cat查询一个表的数据不加别的条件
萧晚歌
2021/12/19
4070
【数据库】MySQL进阶八、多表查询
【数据库】MySQL进阶八、多表查询 MySQL多表查询 一 使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 … WHERE 表1.字段 = 表2.字段 AND 其它查询条件 SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id 注:在上面的的代码中,以两张表的id字段信息相同作为条件建立两
Java帮帮
2018/03/15
2.4K0
SQL 优化极简法则,你掌握几个?
SQL作为关系型数据库的标准语言,是 IT 从业人员必不可少的技能之一。SQL 本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。
可可的测试小栈
2021/02/07
1.2K0
SQL 优化极简法则,你掌握几个?
老司机总结的12条 SQL 优化方案(非常实用)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/20
9170
老司机总结的12条 SQL 优化方案(非常实用)
【MySQL 系列】MySQL 语句篇_DQL 语句
DQL(Data Query Language),即数据查询语言,用来查询数据记录。DQL 基本结构由 SELECT FROM、WHERE、JOIN 等子句构成。
栗筝i
2024/03/19
3760
【MySQL 系列】MySQL 语句篇_DQL 语句
MySQL从删库到跑路(五)——SQL查询
在SELECT语句中使用星号“”通配符查询所有字段 在SELECT语句中指定所有字段 select from TStudent;
良月柒
2019/03/20
2.6K0
MySQL从删库到跑路(五)——SQL查询
工作中数据库优化技巧
内容整理于网络 一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 EXPLAIN 输出格式 EXPLAIN 命令的输出内容大致如下: mysql root@localhost:youdi_auth> explain select * from auth_user\G; ***************************[ 1. row ]*************************** id | 1 select_type |
若与
2018/04/25
7850
工作中数据库优化技巧
19条MySQL优化,效率至少提高3倍
MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了;再或者使用连接来替换。
Rookie
2019/03/04
5540
19条MySQL优化,效率至少提高3倍
相关推荐
MYSQL基本操作-select 查询语句【续】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验