MySQL的一些指令,函数以及关键字

news2024/11/15 19:54:48

这个里面我准备记录一些比较有意思的MySQL的指令和函数,当然使用函数的时候我们要注意,会不会因为函数导致不走索引,走全表扫描的情况。

因为对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。如果不是索引字段的话其实还好,毕竟MySQL里面会有不少buffer,比如sort buffer这些,实际上是在内存上操作(当然太多了也会走磁盘),其实也挺快的。

一 指令
1 show processlist
有时候会出现长时间查询不返回结果,我们想知道到底是什么情况。可以通过show processlist来查看。

在这里插入图片描述
这里要注意的是id指的是pid,我们发现阻塞的进程直接kill pid就可以。还有就是show processlist 内容会提示我们关于阻塞的信息,比如:Waiting for table metadata lock 就是在等MDL锁。

2 explain
在分析慢SQL的时候,经常会用到ecplain查看执行计划,判断是否走了索引,是否是全表扫描。

在这里插入图片描述

二 函数
1 IFNULL(XXX,xxx)
我们对于一些NULL值其实在SQL里进行处理赋值,可以没必要到代码里面去遍历。

举个例子比如我们希望对某个字段求和,如果是null的话怪怪的,可以将这个null值赋值为0.

     SELECT
            abaod.id,
            abaod.res_id,
            abaod.res_name,
            abaod.res_code,
            abaod.back_apply_order_id,
            abaod.back_apply_order_no,
            abaod.category_id,
            abaod.category_name,
            abaod.brand,
            abaod.model,
            abaod.batch_id,
            ab.batch_no,
            abaod.out_storage_id,
            abaod.out_storage_detail_id,
            abaod.apply_count,
            abaod.out_storage_id,
            abaod.out_storage_detail_id,
            aos.out_storage_code,
            IFNULL(SUM(abod.count),0)	AS back_count,
            (abaod.apply_count - IFNULL(SUM(abod.count),0)) as could_back_count
        FROM
            ams_back_apply_order_detail abaod
                LEFT JOIN ams_back_apply_order abao ON abao.id = abaod.back_apply_order_id AND abao.data_status = 1
                LEFT JOIN ams_back_order_detail abod ON abod.back_apply_order_detail_id = abaod.id
                LEFT JOIN ams_batch ab ON abaod.batch_id = ab.id
                LEFT JOIN ams_back_order abo ON abo.id = abaod.back_apply_order_id AND abo.data_status = 1 AND abo.back_order_status IN (1,2)
                LEFT JOIN ams_out_storage aos ON aos.id = abaod.out_storage_id
GROUP BY abaod.id                

三 关键字

1 GROUP BY 和 ORDER BY顺序
这俩是有顺序的,GROUP BY 在ORDER BY前面。其实很好理解就是先分组组合获得结果集,才能利用sort buffer对现有的的结果集进行排序。

注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group by中最大的或最小的某一字段使用 max或min函数。

2 WHERE 和 HAVING
实际上二者都是直接后面接条件,但使用场景是不同的,甚至可以这么说两者彼此之间的场景是互斥的。

WHERE 可以说最经常用的查询条件,但是有一个问题,WHERE中不能使用聚合函数的。

而针对这个聚合函数的条件过滤,就有了HAVING,可以说有HAVING一定有GROUP聚合函数出现,反之不行,因为有时候使用聚合函数不需要过滤结果集。

Where是一个约束声明,是在查询结果集返回之前约束来自数据库的数据,且Where中不能使用聚合函数。
Having是一个过滤声明,是在查询结果集返回以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。

参照下面的代码:

SELECT out_storage_detail_id , (a.out_count - SUM(back_count)) AS can_back_count,SUM(back_count) back_count FROM 
(
SELECT  b.id AS out_storage_detail_id ,b.count as out_count, (CASE WHEN d.id IS NULL THEN 0 ELSE c.apply_count END) AS back_count FROM ams_out_storage a 
LEFT JOIN ams_out_storage_detail b ON a.id = b.out_storage_id 
LEFT JOIN ams_back_apply_order_detail c ON c.out_storage_detail_id = b.id AND c.data_status = 1 
LEFT JOIN ams_back_apply_order d ON c.back_apply_order_id = d.id AND d.data_status = 1 AND d.back_apply_order_status IN (1,6)
WHERE a.data_status = 1 AND b.data_status = 1    AND  a.merchant_id = 372 AND a.employee_id = 7818
UNION ALL 
SELECT  b.id AS out_storage_detail_id ,b.count as out_count, (CASE WHEN d.id IS NULL THEN 0 ELSE c.count END) AS back_count FROM ams_out_storage a 
LEFT JOIN ams_out_storage_detail b ON a.id = b.out_storage_id 
LEFT JOIN ams_back_order_detail c ON c.out_storage_detail_id = b.id AND c.data_status = 1 
LEFT JOIN ams_back_order d ON c.back_order_id = d.id AND d.data_status = 1 AND d.back_order_status IN (1,2)
WHERE a.data_status = 1 AND b.data_status = 1   AND  a.merchant_id = 372 AND a.employee_id = 7818  
) a

GROUP BY out_storage_detail_id
HAVING can_back_count > 0

Order by back_count desc
LIMIT 10

3 LEFT JOIN的ON条件失效
有时候使用LEFT JOIN总感觉ON后面的条件只有一个起作用,别的条件都没起作用,没有达到设想中的效果。

举个例子

A    LEFT JOIN B ON 条件1 AND 条件2

A在左边A是主表,这个SQL会得到一个什么结果。会得到一个笛卡尔积,根据ON后面的条件的笛卡尔积。A作为主表无论是否在ON后面的条件匹配到,都会完整的展示出来,只不过后面连接的的B表内容,匹配不到都为空。

所以我们要注意以下一些情况。

(1)ON筛选主表条件无效
因为是根据ON条件匹配的一个笛卡尔积,那ON后面的条件只能是筛选空值B表,如果的你的SQL在ON后面去对主表做过滤,实际上这个对A的过滤条件是无效的,是无法筛选过滤A的数据, 如下SQL

A   LEFT JOIN B ON  A.id = B.a_id AND A.name = "ZP"

那我一定要筛选A.name = "ZP"的数据怎么办,你可以用where来约束筛选主表。

(2)ON条件导致结果集数目变大
因为是笛卡尔积的形式,由于关联条件导致变多,举个例子

order  LEFT JOIN order_detail ON  order.id = order.detail_id 

一个order可能对应多个order_detail,笛卡尔积会出现 m*n的情况,m是order条目数,n是order_detail建立连接的数目。

这种情况你可以使用聚合函数或者设置条件来解决,但是你要清楚这个“积”的形式。其实最大的问题是多表关联产生 abc*d这种数目“平白无故”增多的情况,不要出现重复求和(差)的情况。

(3)返回条件为null要考虑
因为主表不管怎样都会全量返回,ON连接没匹配的条件对应后面的主表关联副表的字段为null,我们在做where条件的时候不要把人家给过滤掉。

4 ON和WHERE的区别
ON和WHERE实际上面已经说了一部分,实际上WHERE在INNER JOIN的情况下和ON是等价的,因为INNER是两边匹配的数据展示,可以去搜索LEFT JOIN ,RIGHT JOIN,INNER JOIN很多文章都会贴图表示彼此间的区别。

join默认为inner join,当为内部连接时,on和where的作用你可以看做是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

导读:21 世纪中叶的精准肿瘤学奇点?循环肿瘤细胞和单细胞测序?

Tips: 组学时代的循环肿瘤细胞:我们离实现“奇点”还有多远?(Br J Cancer,IF:9.075),原文链接: https://pubmed.ncbi.nlm.nih.gov/35273384/ 循环肿瘤细胞的生物学、脆弱性和临床应用&#xff0…

用javascript分类刷leetcode22.字典树(图文视频讲解)

目录 Trie树,即字典树,又称前缀树,是一种树形结构,典型应用是用于统计和排序大量的字符串(但不限于字符串),所以经常被搜索引擎用于文本词频统计。它的优先是,最大限度的减少无谓的…

数据挖掘与机器学习作业_06 决策树

决策树 步骤 1.计算不纯度2.选取不纯度最高的特征进行分支3.计算不纯度4.继续划分 from sklearn import tree from sklearn.model_selection import GridSearchCV from sklearn.model_selection import cross_val_score from sklearn.model_selection import train_test_spl…

单点登录 SSO 解决方案选型指南|身份云研究院

单点登录(SSO)是目前企业降本增效以及提升用户体验的主流选择方案。常规的单点登录指“登录一次,即可访问所有互相信任的应用,用户不再需要记住每一个应用的账号密码”,这有效解决了密码疲劳、登录效率等问题&#xff…

(深度学习快速入门)第三章第二节:通过一个二分类任务介绍完整的深度学习项目

文章目录一:数据集介绍二:一个完整的深度学习项目必备文件三:项目代码(1)config.py——超参数文件(2)preprocess——数据预处理文件(3)dataloader——数据集封装&#xf…

后端人眼中的Vue(一)

一、简介 1.1、Vue简介 ​ Vue是渐进式 JavaScript 框架,啥叫渐进式?渐进式意味着你可以将Vue作为你应用的一部分嵌入其中,或者如果你希望将更多的业务逻辑使用Vue实现,那么Vue的核心库以及其生态系统。比如CoreVue-routerVuexax…

Homekit智能家居DIY之智能灯泡

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时,它们可以通过声控、触控、红外等方式进行控制,或者带有调光开关,让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块,可与手机、家庭智能助手、或其他智能…

RabbitMQ、Kafka、RocketMQ消息中间件对比总结

文章目录前言侧重点架构模型消息通讯其他对比总结参考文档前言 不论Kafka还是RabbitMQ和RocketMQ,作为消息中间件,其作用为应用解耦、异步通讯、流量削峰填谷等。 拿我之前参加的一个电商项目来说,订单消息通过MQ从订单系统到支付系统、库存…

ORB-SLAM2 --- KeyFrame::UpdateConnections 函数

目录 一、函数作用 二、函数流程 三、code 四、函数解析 一、函数作用 更新关键帧之间的连接图。 更新变量 mConnectedKeyFrameWeights:当前关键帧的共视信息,记录当前关键帧共视关键帧的信息(哪一帧和当前关键帧有共视,共视…

用C++实现十大经典排序算法

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 简介 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大…

喜报|知道创宇连续两年获评北京市企业创新信用领跑企业!

近日,2022年度北京市企业创新信用领跑名单正式发布。知道创宇凭借过硬的技术实力、创新能力及良好的企业信用记录成功入选2022年度北京市企业创新信用领跑企业。值得一提的是,这是知道创宇继2021年以来,连续两年获得此项殊荣。连续两年蝉联双…

CPU是如何执行程序的?

CPU是如何执行程序的?1、硬件结构介绍1.1、CPU1.2、内存1.3、总线1.4、输入/输出设备2、程序执行的基本过程3、a11执行的详细过程现代计算机的基本结构为五个部分:CPU、内存、总线、输入/输出设备。或许你了解了这些概念,但是你知道a11在计算…

【Kubernetes | Pod 系列】Pod 的镜像下载策略和 Pod 的生命周期 Ⅰ—— 理论

目录4. 镜像下载策略5. Pod 的生命周期5.1 Pod 生命期与特性说明5.2 Pod Phase 阶段说明备注5.3 容器状态说明(1)Waiting (等待)(2)Running(运行中)(3)Termin…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的nlp预训练模型

目录给我推荐20个比较流行的nlp预训练模型给我推荐20个比较流行的nlp预训练模型源码给我推荐20个比较流行的nlp预训练模型 BERT (谷歌) GPT-2 (OpenAI) RoBERTa (Facebook) ALBERT (谷歌) ELECTRA (谷歌) XLNet (谷歌/纽约大学) T5 (OpenAI) Transformer-XL (谷歌/香港中文大学…

Qt音视频开发09-ffmpeg内核音视频同步

一、前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文件比如收到的数据包…

【EdgeBox_tx1_tx2_E100】 PyTorch v1.8.0 torchvision v0.9.0 环境部署

简介:介绍PyTorch 环境 在 EHub_tx1_tx2_E100载板,TX1核心模块环境(Ubuntu18.04)下如何实现部署和测试,准备安装的环境是(PyTorch v1.8.0 torchvision v0.9.0)。 关于测试硬件EHub_tx1_tx2_E1…

文献学习04_Deep contextualized word representations 深度语境化的单词表示_20230102

论文信息 Subjects: Computation and Language (cs.CL) (1)题目:Deep contextualized word representations (深度语境化的单词表示) (2)文章下载地址: https://doi.org/10.48550/…

Telemetry网络监控技术讲解

目录 Telemetry基本概念 设备监测数据的数据类型 为么要提出Telemetry Telemetry网络模型 广义Telemetry 狭义Telemetry 狭义Telemetry框架 数据源(Yang) 数据生成(GPB) 数据订阅(gRPC、UDP) 数…

跟着开源项目学java7-从操作日志排除敏感字段的提交看基于注解的日志记录实现

这次 commit 主要解决日志信息中可能存在 password 等敏感字段,需要在保存前排除掉 主要涉及两个类的修改,添加实现了一个 PropertyPreExcludeFilter,集成 fastjson2 的 SimplePropertyPreFilter 实现 /*** 排除JSON敏感属性* * author ruo…

两种方法设置Word文档的“只读模式”

防止Word文档被意外更改,我们可以将Word设置成“只读模式”来保护文档。根据需要,还可以将Word可以设置成无密码和有密码的“只读模式”,下面来说说具体方法。 方法一:无密码的“只读模式” 打开Word文档后,点击菜单…