7种SQL进阶用法【转】

news2024/12/26 9:25:12

1.自定义排序(ORDER BY FIELD)

在MySQL中ORDER BY排序除了可以用ASC和DESC之外,还可以使使用自定义排序方式来实现

CREATE TABLE movies (
id INT PRIMARY KEY AUTO_INCREMENT,
movie_name VARCHAR(255),
actors VARCHAR(255),
price DECIMAL(10,2) DEFAULT 50,
release date DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO movies(movie_name,actors,price,release_date) VALUES 
('咱们结婚吧','新东',43.2,'2013-04-12'),
('四大名捕','刘亦菲',62.5,'2013-12-21'),
('猎场','新东',68.5,'2017-11-03'),
('芳华','范冰冰',55.0,'2017-09-15'),
('功夫瑜伽','成龙',91.8,'2017-01-28'),
('惊天解密','新东',96.9,'2019-08-13'),
('铜雀台',null,65,'2025-12-16'),
('天下无贼','刘亦菲',44.9,'2004-12-16'),
('建国大业','范冰冰',70.5,'2009-09-21'),
('赛尔号4:疯狂机器城','范冰冰',58.9,'2021-07-30'),
('花木兰','刘亦菲',89.0,'2020-09-11'),
('警察故事','成龙',68.0,'1985-12-14'),
('神话','成龙'.86.5.'2005-12-22');
select * from movies order by movie_name asc;

select * from movies order by FIELD(movie_name,'神话','猎场','芳华','花木兰','铜雀台','警察故事','天下无贼','四大名捕','惊天解密','建国大业','功夫瑜伽','咱们结婚吧','赛尔号4','疯狂机器城');

 

2.空值NULL排序(ORDERBY IF(ISNULL))

在MySQL中使用ORDERBY关键字加上我们需要排序的字段名称就可以完成该字段的排序。如果字段中存在NULL值就会对我们的排序结果造成影响,
这时候我们可以使用ORDERBYIF(ISNULL(字段),0,1)语法将NULL值转换成0或1,实现NUL值数据排序到数据集前面还是后面。

select * from movies order by actors,price asc;

select * from movies order by if(ISNULL(actors,0,1)),actors,price asc;

select * from movies order by if(ISNULL(actors,2,1)),actors,price asc;

3.CASE表达式(CASE...WHEN)

在实际开发中我们经常会写很多if...elseif...else,这时候我们可可以使用CASE...WHEN表达式解决这个问题。
以学生成绩举例。比如说:学生90分以上评为优秀,分数80-90平为良好,分数60-80评为一般,分数低于60评为"较差"。那么我们可以使用下面这种查询方式:

CREATE TABLE student (
student_id varchar(10) NOT NULL COMMENT'学号",
sname varchar(20) DEFAULT NULL COMMENT"姓名",
sex char(2) DEFAULT NULL COMMENT '性别',
age int(11) DEFAULT NULL COMMENT '年龄",
score float DEFAULT NULL COMMENT '成绩',
PRIMARY KEY (student_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

INSERT INTO student(student_id,snane,sex,age,score)
VALUES  ('001','张三','男',20,95),
        ('002','李四','女',22,88),
        ('003','王五','男',21,90),
        ('004','赵六','女',20,74),
        ('005','陈七','女',19,92),
        ('006','杨八','男',23,78),
        ('007','周九','女',20,55),
        ('008','吴十','男',22,91),
        ('009','刘一','女',21,87),
        ('010','孙二','男',19,60);
select *,case when score > 90 then '优秀' 
        when score > 80 then '良好'  
        when score > 60 then '一般' 
        else'较差' end level 
from student;

4.分组连接函数(GROUP CONCAT)

分组连接函数可以在分组后指定字段的字符串连接方式,并且还可以指定排序逻辑;连接字符串默认为英文逗号。
比如说根据演员进行分组,并将相应的电影名称按照票价进行降序排列,而且电影名称之间通过""拼接。用法如下:

select actors,
GROUP_CONCAT(movie_name),
GROUP_CONCAT(price) from movies GROUP BY actors;

select actors,
GROUP_CONCAT(movie_name order by price desc SEPARATOR '_'),
GROUP_CONCAT(price      order by price desc SEPARATOR '_'),
from movies GROUP BY actors;

5.分组统计数据后再进行统计汇总(with rollup)

在MySql中可以使用with rollup在分组统计数据的基础上再进行数据统汁汇总,即将分组后的数据进行汇总。

SELECT actors,SUM(price) FROM movies GROUP BY actors;

SELECT actors,SUM(price) FROM movies GROUP BY actors WITH ROLLUP;

6.子查询提取(with as)

如果一整句查询中多个子查询都需要使用同一个子查询的结果,那么就可以用with as将共用的子查询提取出来并取一个别名。后面查询语句可以直接用,对于大量复杂的
SQL语句起到了很好的优化作用。
需求:获取演员刘亦菲票价大于50且小于65的数据。

with ml as (select * from movies where price > 509),
     m2 as (select * from movies where price >= 65) 
select * from m1 where m1.id not in (select m2.id from m2) and m1.actors='刘亦菲';

7.优雅处理数据插入、更新时主键、唯一键重复

在MySql中插入、更新数据有时会遇到主键重复的场景,通常的做法就是先进行删除在插入达到可重复执行的效果,但是这种方法有时候会错误删除数据
1.插入数据时我们可以使用IGNORE,它的作用是插入的值遇到主键或者唯一键重复时自动忽略重复的数据,不影响后面数据的插入,即有则忽略,无则插入。示例如下:

select * from movies where id >= 13;

INSERT INTO movies (id, movie_name, actors, pricce, release_date) VALUES
(13,"神话","成龙",100,"2005-12-22");

INSERT IGNORE INTO movies (id, movie_name, actors, price, release_date) VALUES
(13,"神话","成龙",100,'2005-12-22');

INSERT IGNORE INTO movies (id, movie_name, actors, price, release_date) VALUES
(14,"神话2',"成龙',114,'2005-12-22');

2.还可以使用REPLACE关键字,当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入,即有则删除+插入,无无则插入,示例如下:

REPLACE INTO movies (id, movie_name, actors, price, release_date) VALUES
(14,'神话2','成龙',100,'2005-12-22');

REPLACE INTO movies (id, movie_name, actors, pricce, release_date) VALUES
(15,'神话3','成龙',115,'2005-12-22');

3.更新数据时使用on duplicate key update,它的作用就是当插入的记录遇到主键或者唯一键重复时,会执行后面定义的UPDATE操作。相当于先执行Insert操作,再根
据主键或者唯一键执行update操作,即有就更新,没有就插入。示例如下:

INSERT INTO movies (id,movie_name,actors,price,release_date) VALUES 
(15,'神话3','成龙',115,'2005-12-22') on duplicate key update price = price + 10;

INSERT INTO movies (id,movie_name,actors,price,release_date) VALUES 
(16,'神话4','成龙',75,'2005-12-22') on duplicate key update price = price + 10;

详见:学会这7种SQL进阶用法,让你少走99%的弯路!_哔哩哔哩_bilibili

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

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

相关文章

L4级智能驾驶公交量产方案

1、自动驾驶分级 2、L4级自动驾驶技术方案 3、线控底盘 4、整车传感器方案 5、自动驾驶能力 6、运控平台

在Linux中对Docker中的服务设置自启动

先在Linux中安装docker,然后对docker中的服务设置自启动。 安装docker 第一步,卸载旧版本docker。 若系统中已安装旧版本docker,则需要卸载旧版本docker以及与旧版本docker相关的依赖项。 命令:yum -y remove docker docker-c…

【Docker】python flask 项目如何打包成 Docker images镜像 上传至阿里云ACR私有(共有)镜像仓库 集成Drone CI

一、Python环境编译 1、处理好venv环境 要生成正常的 requirements.txt 文件,我们就需要先将虚拟环境处理好 创建虚拟环境(可选): 在项目目录中,你可以选择使用虚拟环境,这样你的项目依赖将被隔离在一个…

Java 基础学习(二)运算符与分支流程控制

1 运算符 1.1 运算符概述 1.1.1 运算符概述 运算符是一种告诉计算机执行特定的数学或逻辑等操作的符号。Java运算符号包括:数学运算符、关系运算符、逻辑运算符、赋值运算符号、字符串连接运算符。计算机本质上只能处理数字,处理数字的最常见的方式就…

java学习part15单例模式

107-面向对象(高级)-单例设计模式与main()的理解_哔哩哔哩_bilibili 1.单例 就是说在某些开发场景中,某个类只要有一个对象就足够使用了,不需要重复创建。 (理解:比如说是数据库对象,使用时创建一个可以处理所有的数…

虹科干货 | 适用于基于FPGA的网络设备的IEEE 1588透明时钟架构

导读:在基于FPGA的网络设备中,精确的时间同步至关重要。IEEE 1588标准定义的精确时间协议(PTP)为网络中的设备提供了纳秒级的时间同步。本文将介绍虹科提供的适用于基于FPGA的网络设备的IEEE 1588透明时钟(TC&#xff…

电机伺服驱动学习笔记(6)PID算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、连续PID二、参数整定1.一般调节法 工具提示参考文献 前言 提示:本文是根据野火科技电机系列教学视频PID算法的通俗解说和参数整定视频课章节整…

C#文件夹基本操作(判断文件夹是否存在、创建文件夹、移动文件夹、删除文件夹以及遍历文件夹中的文件)

目录 一、判断文件夹是否存在 1.Directory类的Exists()方法 2. DirectoryInfo类的Exists属性 二、创建文件夹 1. Directory类的CreateDirectory()方法 2.DirectoryInfo类的Create()方法 三、移动文件夹 1. Directory类的Move()方法 2.DirectoryInfo类的MoveT…

Unity Meta Quest 一体机开发(八):实现 Hand Grab 扔物体功能

文章目录 📕教程说明📕设置刚体和碰撞体📕给物体添加 Physics Grabbable 脚本📕给手部添加 Hand Velocity Calculator 物体 此教程相关的详细教案,文档,思维导图和工程文件会放入 Seed XR 社区。这是一个高…

预览功能实现

<!-- 预览 --><el-dialog title"预览" :visible.sync"dialogPreviewVisible" width"50%" append-to-body :close-on-click-modal"false" close"PreviewClose"><div style"margin-bottom:5%">&l…

红黑树(万字图文详解)

红黑树 1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树结构5. 红黑树的插入操作5.1 按照二叉搜索的树规则插入新节点5.2 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏5.2.1 情况一: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红…

【日常总结】Swagger 3.0 + 集成 knife4j ,并设置header入参

一、场景 环境&#xff1a; 二、问题 思路 &#xff1a; 三、解决方案 &#xff08;推荐&#xff09; Stage 1&#xff1a;接入knife4j 依赖 Stage 2&#xff1a;修改 yaml 配置 Stage 3&#xff1a;修改 swagger 3 配置文件 Stage 4&#xff1a;查看效果 Swagger UI …

Junos webauth_operation.php 文件上传漏洞复现(CVE-2023-36844)

0x01 产品简介 Junos 是 Juniper Networks 生产的一款可靠的高性能网络操作系统。 0x02 漏洞概述 Junos webauth_operation.php接口处存在文件上传漏洞&#xff0c;未经身份认证的攻击者可利用 Junos 操作系统的 J-Web 服务 /webauth_operation.php 路由上传 php webshell&…

LVS-DR实验

实验前准备 DR服务器&#xff1a;192.168.188.11 192.168.188.15 NFS服务器&#xff1a;192.168.188.14 Web服务器1&#xff1a;192.168.188.12 Web服务器2&#xff1a;192.168.188.13 Vip&#xff1a;192.168.188.188 客户端&#xff1a;192.168.188.200 配置负载均衡调度…

05-学成在线课程分类查询

课程分类查询 界面原型 在新增课程基本信息界面中课程等级、课程类型、课程分类三处信息需要用户选择 当我们点击新增课程时,前端会请求内容管理服务中的content/course-category/tree-nodes接口获取课程分类表中的课程分类信息 响应数据模型 课程分类表course_category是一…

文件权限中 chmod、u+x、u、r、w、x分别代表什么

Linux系统中的每个文件和目录都有访问许可权限&#xff0c;如下面所示&#xff1a; 要说清楚问题&#xff0c;我们截取一些内容&#xff1a; ypyubuntu:~$ ls -l drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Desktop/ drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Documen…

Unity之NetCode多人网络游戏联机对战教程(10)--玩家动画同步

文章目录 前言NetworkAnimation服务端权威客户端权威 前言 这次的动画同步与位置同步&#xff0c;可以说实现思路是一样的&#xff0c;代码相似度也非常高 NetworkAnimation 如果直接挂载这个脚本只有Host&#xff08;服务端&#xff09;才可以同步&#xff0c;Client是没有…

迁移redis数据库中的数据到另一台服务器

方案一 下面我使用的redis是用docker安装的&#xff0c;不是通过下载安装包安装的&#xff0c;所以和我安装方式不一样的小伙伴可以不看&#xff0c;因为很多操作是基于docker的 话不多说&#xff0c;直接开搞&#xff01; 1.首先一定要确保两台服务器上面的redis版本要一致…

图解Redis适用场景

Redis以其速度而闻名。 1 业务数据缓存 1.1 通用数据缓存 string&#xff0c;int&#xff0c;list&#xff0c;map。Redis 最常见的用例是缓存对象以加速 Web 应用程序。 此用例中&#xff0c;Redis 将频繁请求的数据存储在内存。允许 Web 服务器快速返回频繁访问的数据。这…

vue day2

1、指令修饰符&#xff1a;.指明一些指令后缀&#xff0c;不同后缀封装不同处理操作 按键修饰符&#xff1a;keyup.enter v-model修饰符&#xff1a; v-model.trim&#xff1a;去首位空格 v-model.number&#xff1a;转数字 事件修饰符&#xff1a; 阻止事件冒泡&#xff1…