MySQL 高级技巧

一、序言

本文给大家介绍一些 MySQL 的高级技巧,帮助大家提高开发效率。

二、CASE WHEN 表达式

在 MySQL 中,CASE WHEN 表达式是一个灵活的条件判断结构,类似于其他编程语言中的 switch 或 if-else 语句。它允许根据不同的条件执行不同的操作。
假设我们有一个名为 orders 的表,它包含了订单的信息,包括 order_id 和 total_amount 两个字段。

order_id (INT)total_amount (DECIMAL)
125.50
275.00
3110.25
440.75
595.20

需求:根据订单的总金额,为每个订单打上了不同的标签:‘Low’, ‘Medium’, ‘High’,或者 ‘Unknown’

SELECT 
    order_id,
    total_amount,
    CASE
        WHEN total_amount < 50 THEN 'Low'
        WHEN total_amount >= 50 AND total_amount < 100 THEN 'Medium'
        WHEN total_amount >= 100 THEN 'High'
        ELSE 'Unknown'
    END AS label
FROM 
    orders;

三、UNION

在 MySQL 中,UNION 是用于合并两个或多个 SELECT 语句的操作符。它将两个或多个查询结果集中的行合并成一个结果集,并自动去除重复的行。例如:

SELECT id, name FROM employees1
UNION
SELECT id, name FROM employees2;

以上查询会返回合并后的结果集,其中包含了 employees1 和 employees2 表中所有员工的信息。如果某个员工在两张表中都存在,UNION 会去除重复的行。如果想要保留重复的行,可以使用 UNION ALL。

SELECT id, name FROM employees1
UNION ALL
SELECT id, name FROM employees2;

四、行列转换

4.1 行转列

假设有以下 student_scores 表格:

student_idsubjectscore
1Math85
1Science90
2Math75
2Science80

现在我们有一个需求:将每个学生的数学和科学成绩放在同一行

SELECT
    student_id,
    MAX(CASE WHEN subject = 'Math' THEN score END) AS math_score,
    MAX(CASE WHEN subject = 'Science' THEN score END) AS science_score
FROM
    student_scores
GROUP BY
    student_id;

输出结果:

student_idmath_scorescience_score
18590
27580

4.2 列转行

假设有以下 sales 表格:

dateproduct_Aproduct_B
2024-01-01100120
2024-01-02150130

假设一个场景:我们想要将产品销售额合并到一列中,并包含产品名称和销售额的日期。可以使用列转行操作:

SELECT
    date,
    'product_A' AS product,
    product_A AS sales
FROM
    sales
    
UNION ALL

SELECT
    date,
    'product_B' AS product,
    product_B AS sales
FROM
    sales;

输出结果:

dateproductsales
2024-01-01product_A100
2024-01-01product_B120
2024-01-02product_A150
2024-01-02product_B130

五、LIMIT 提升效率

现假设一个场景:我们有一个 students 表格,想要检查是否存在年龄小于 18 岁的学生
通常我们的写法如下:

SELECT COUNT(1)
FROM students
WHERE age < 18;

上面这种写法是比较耗费性能的,我们可以使用 LIMIT 1 来限制结果集返回一行,然后检查是否存在符合条件的行。

SELECT 1
FROM students
WHERE age < 18
LIMIT 1;

如果存在至少一个年龄小于 18 岁的学生,这个查询将返回一行结果,否则不会返回任何结果。因为我们使用了 LIMIT 1,所以当找到第一个符合条件的行后,查询就会停止,并且不会继续搜索更多的匹配行,这样可以提高效率。

六、WITH AS

假设有两个表:students 表和 grades 表。students 表存储学生信息,包括学生ID(student_id)和姓名(student_name)。grades 表存储学生的成绩,包括学生ID(student_id)和成绩(grade)。
students 表

student_idstudent_name
1Alice
2Bob
3Charlie

grades 表

grade_idstudent_idgrade
1185.0
2190.0
3288.0
4292.0
5375.0
6380.0

需求:计算每个学生的平均成绩

WITH student_avg_grades AS (
  SELECT student_id, AVG(grade) AS avg_grade
  FROM grades
  GROUP BY student_id
)
SELECT s.student_id, s.student_name, g.avg_grade
FROM students s
JOIN student_avg_grades g ON s.student_id = g.student_id
ORDER BY g.avg_grade DESC;

输出结果:

student_idstudent_nameavg_grade
2Bob90.0
1Alice87.5
3Charlie77.5

七、窗口函数

6.1 ROW_NUMBER()

假设我们有一个名为 employees 的表,其中包含员工信息,包括员工姓名和工资。

employee_namesalary
Alice5000.00
Bob5500.00
Charlie5500.00
David6500.00
Eva5500.00

需求:查询每个员工及其工资排名

SELECT
    employee_name,
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number
FROM
    employees;

输出结果:

employee_namesalaryrow_number
David6500.001
Bob5500.002
Charlie5500.003
Eva5500.004
Alice5000.005

ROW_NUMBER() 为结果集中的每一行分配一个唯一的整数值,不会考虑并列排名。即使有相同的排序值,每一行的排名也是唯一的。如果有多个行具有相同的排序条件,则 ROW_NUMBER() 会为每个行分配不同的排名值,不会合并排名。

6.2 DENSE_RANK()

假设有一个名为 students 的表,其中包含学生的成绩信息,包括学生姓名和考试成绩。

student_namescore
Alice85.50
Bob78.00
Charlie92.75
David85.50
Eva78.00

需求:查询每个学生的成绩及其排名(分数相同,排名相同)

SELECT
    student_name,
    score,
    DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM
    students;

输出结果:

student_namescoredense_rank
Charlie92.751
Alice85.502
David85.502
Bob78.003
Eva78.003

DENSE_RANK() 排名如果有多个行具有相同的排序值,则它们会被分配相同的排名,并且下一个排名会紧随其后,不会留下空隙。例如,如果有两行并列排名第 2,下一个排名仍然是第 3,不会跳过任何排名。

6.3 RANK()

假设有一个名为 sales 的表,其中包含销售人员的销售额信息。

salespersonsales
Alice15000.00
Bob12000.00
Charlie18000.00
David15000.00
Eva12000.00

需求:每个销售人员的销售额排名

SELECT
    salesperson,
    sales,
    RANK() OVER (ORDER BY sales DESC) AS rank
FROM
    sales;

输出结果:

salespersonsalesrank
Charlie18000.001
Alice15000.002
David15000.002
Bob12000.004
Eva12000.004

RANK() 为结果集中的每一行分配一个排名,如果有相同的排序值,则它们会被分配相同的排名,但下一个排名会留下空隙。也就是说,如果有并列排名,则下一个排名会跳过相应的排名数量。例如,如果有两行并列排名第二,下一个排名会是第 4,而不是第 3。

往期推荐

  1. JDK 动态代理
  2. ThreadLocal
  3. HashMap 源码分析(三)
  4. Spring 三级缓存
  5. RBAC 权限设计(二)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简单步…

ContextMenuStrip内容菜单源对象赋值学习笔记(含源码)

一、前言 MetroTileItem属于第三方控件,无法定义ContextMenuStrip属性 想实现某子项点击菜单时,与源控件(按钮metroTileItem)的某值对应,用于动态控制按钮的状态或方法 1.1 效果 二、实现方法 2.1 方法1 (代码,说明见注释) private void metroTileItem_MouseDown(o…

基于Springboot的小区物业管理系统

基于SpringbootVue的小区物业管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 用户管理 员工管理 业主信息管理 费用信息管理 楼房信息管理 保修信息…

攻防世界---reverse_re3

1.下载附件&#xff0c;先查壳&#xff1a;无壳 2.在IDA中分析&#xff0c;shiftfnf5&#xff0c;看到一串长得很像flag的flag 3.根据提示我们需要找到输入&#xff0c;再进行md5转换才能得到flag flag{md5(your input)} 4.双击这个句话&#xff0c;点进去想查看信息&#xff0…

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统&#xff0c;由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求&#xff0c;提供高可用性、横向扩展能力和灵活的数据模型。 主要特点&#xff1a; 文档模型&#xff1a; Mon…

西宁市初中生地会考报名照片尺寸要求及手机自拍方法

西宁市初中生地会考即将到来&#xff0c;对于参加考试的同学们来说&#xff0c;准备一张符合规格的报名照片是整个报名流程中不可或缺的一环。一张规范的证件照不仅展示了学生的精神面貌&#xff0c;同时也是顺利报名的重要条件之一。本文将详细介绍西宁市初中生地会考报名所需…

SSDReporter for Mac:全面检测SSD健康,预防数据丢失,让您的Mac运行更稳定

SSDReporter for Mac是一款专为Mac用户设计的固态硬盘&#xff08;SSD&#xff09;健康状况检测工具&#xff0c;旨在帮助用户全面了解并监控其Mac设备中SSD的工作状态&#xff0c;从而确保数据的完整性和设备的稳定性。 这款软件具有多种强大的功能。首先&#xff0c;它能够定…

【分治】Leetcode 库存管理 III

题目讲解 LCR 159. 库存管理 III 本题的含义就是让求出最小的k个数 算法讲解 class Solution { public:void my_qsort(vector<int>& nums, int l, int r){if(l > r) return ;int i l, left l-1, right r1;int key nums[rand() % (r - l 1) l];//完成分三…

深度学习基础之《TensorFlow框架(12)—图片数据》

一、图像基本知识 1、如何转换图片文件 回忆&#xff1a;之前我们在特征抽取中讲过如何将文本处理成数据 思考&#xff1a;如何将图片文件转换成机器学习算法能够处理的数据&#xff1f; 我们经常接触到的图片有两种&#xff0c;一种是黑白图片&#xff08;灰度图&#xff09;…

C++ - STL详解—vector类

一. vector的概念 向量&#xff08;Vector&#xff09;是一个封装了动态大小数组的顺序容器&#xff08;Sequence Container&#xff09;。跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。可以简单的认为&#xff0c;向量是一个能够存放任意类型的动态数组。 …

阿里云ECS服务器安装docker

首先查看阿里云ECS的服务器的版本 cat /etc/redhat-release如果是Alibaba Cloud Linux release 3,请执行以下命令 添加docker-ce的dnf源。 sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud Linux 3专…

深度学习每周学习总结P5(运动鞋识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分2. 加载数据集3.模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参…

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步&#xff0c;越来越多的行业开始融入3D可视化技术&#xff0c;燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点&#xff0c;其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录&#xff0c;这种方式不仅效率低下&…

开源大数据集群部署(二十一)Spark on yarn 部署

作者&#xff1a;櫰木 1 spark on yarn安装&#xff08;每个节点&#xff09; cd /root/bigdata/ tar -xzvf spark-3.3.1-bin-hadoop3.tgz -C /opt/ ln -s /opt/spark-3.3.1-bin-hadoop3 /opt/spark chown -R spark:spark /opt/spark-3.3.1-bin-hadoop32 配置环境变量及修改配…

BFS解决八数码问题-java

本文主要通过BFS广度优先搜索来解决八数码问题。 文章目录 前言 一、八数码 二、算法思路 1.思路模拟 2.实现思路 三、代码 1.代码如下&#xff1a; 2.读入数据 3.代码运行结果 总结 前言 本文主要通过BFS广度优先搜索来解决八数码问题。 提示&#xff1a;以下是本篇文章正文内…

有没有手机上使用的库存软件

库存软件是一种仓库的信息管理系统&#xff0c;它主要针对出库与入库这些数据进行管理&#xff0c;传统的库存管理都是在电脑上安装一个专门的数据库管理系统进行管理&#xff0c;这也是一种比较成熟的管理方式&#xff0c;那么有没有手机上使用的库存软件。 手机上使用的库存软…

开发工具——postman使用教程详解

一、概念 1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已停止维护&#xff0c;官方不推荐使用该版本。 2、官网下载地址&#xff1a;http://www.getpostman.com…

离线数仓数据导出-hive数据同步到mysql

离线数仓数据导出-hive数据同步到mysql MySQL建库建表数据导出 为方便报表应用使用数据&#xff0c;需将ads各指标的统计结果导出到MySQL数据库中。 datax支持hive同步MySQL&#xff1a;仅仅支持hive存储的hdfs文件导出。所以reader选hdfs-reader&#xff0c;writer选mysql-wri…

架构师系列-搜索引擎ElasticSearch(十)- 索引别名及重建

索引别名 别名&#xff0c;有点类似数据库的视图&#xff0c;别名一般都会和一些过滤条件相结合&#xff0c;可以做到即使是同一个索引上&#xff0c;让不同人看到不同的数据。 别名的作用 在开发中&#xff0c;一般随着业务需求的迭代&#xff0c;较老的业务逻辑就要面临更新…

架构设计-权限系统之通用的权限系统设计方案

一个系统&#xff0c;如果没有安全控制&#xff0c;是十分危险的&#xff0c;一般安全控制包括身份认证和权限管理。用户访问时&#xff0c;首先需要查看此用户是否是合法用户&#xff0c;然后检查此用户可以对那些资源进行何种操作&#xff0c;最终做到安全访问。身份认证的方…