7种SQL进阶用法【转】

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.mzph.cn/news/175134.shtml

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

相关文章

P8安全基本理论A001-CIA安全模型-使用PGP描述网络安全CIA模型之私密性、完整性案例

【教学资源名称】 CIA安全模型-使用PGP描述网络安全CIA模型之私密性、完整性案例 【预备知识】 在信息安全等级保护工作中,根据信息系统的机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)来划分信息系统的安全等级,三个性质简称CIA。 私密性(Confi…

ES 8.x开始(docker-compose安装、kibana使用、java操作)

学习文档地址 一、Docker安装 这里使用docker-compose来安装,方便后续迁移,Elasticserach和kibina一起安装。 1、创建安装目录 configdataplugins 2、配置文件 配置文件有两个,一个是ES的配置文件,一个docker-compose的配置文件 …

大厂做项目的过程,你真的知道吗?

文章目录 明确需求排期代码设计技术选型写代码迭代更新 一线大厂的项目是如何从0-1被做出来的,了解大厂项目开发的详细流程;自己开发项目那是单打独斗,没人管你;但进入企业中开发项目那是开团打本,大家都在一股绳上&am…

龙芯loongarch64服务器编译安装pyarrow

1、简介 pyarrow是一个高效的Python库,用于在Python应用程序和Apache Arrow之间进行交互。Arrow是一种跨语言的内存格式,可以快速高效地转移大型数据集合。它提供了一种通用的数据格式,将数据在内存中表示为表格,并支持诸如序列化和分布式读取等功能。 龙芯的Python仓库安…

Ubuntu 22.03 LTS 安装deepin-terminal 分屏

安装 源里面自带了这个软件,可以直接装 sudo apt install deepin-terminal 启动 按下Win键,输入deep即可快速检索出图标,点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口,鼠标点击可以切换…

[ BUG ] 踩坑 Axios Delete 请求传参

踩坑 Axios Delete 请求传参 问题描述 今天在写前后端交互时,我想将 data 数据通过 delete 进行传参 axios.delete("/info", data),但是发现后端一直提示参数错误,我看了看代码也没错啊。跟 post、patch 一样的写法为什么会出现参…

三方支付接口成为了电商竞争力的新动力

在当前快速发展的互联网时代,随着电子商务行业的兴起,支付体验已经成为企业获取竞争优势的重要因素。一个快速、安全、便捷的支付环节不仅可以提升用户的体验,还能有效促进交易的完成。在众多支付解决方案中,三方支付接口因其独特…

18.Spring框架中的单例bean是线程安全的吗?(阿里一面)

Spring框架中的单例bean是线程安全的吗?(阿里一面) 不是,Spring框架中的单例bean不是线程安全的。spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。 实际上大部分时候 spring bean 无状态的(比如 dao 类),所以某种程度上来说 bea…

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…

linux 内核线程

内核线程类似于用户进程,通常用于并发处理些工作,它是一种在内核空间实现后台任务的方式,并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理,也可以睡眠等待某事件的发生,内核线程可以访问内核函数和…

Linux操作系统使用及C高级编程-D17D18编译与调试

编译 当有线程创建时编译:gcc test.c -o test -lpthread 分文件编写时主要是分为:.c(函数声明的具体实现)、.h(说明性文件:#define 结构体共用体 声明)、.c(main) 条件编译 一般情况下&#x…

激光线提取

在做单线激光三维重建,和多线激光三维重建的时候都会设计到激光线提取算法的实现,如何保持高速和高精度是关键 ,最近优化了steger中心线提取算法,通过并行化实现在cpu版本可以做到2m,GPU版本可以做到0.6ms左右,完全可…

Flask 运用Xterm实现交互终端

Xterm是一个基于X Window System的终端仿真器(Terminal Emulator)。Xterm最初由MIT开发,它允许用户在X Window环境下运行文本终端程序。Xterm提供了一个图形界面终端,使用户能够在图形桌面环境中运行命令行程序。而xterm.js是一个…

Kotlin学习——kt入门合集博客 kt里的委派模式Delegation kt里的特性

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

23. Spring源码篇之环境变量Environment

简介 在开发过程中,我们通常会把一些变化的数据,或者说不同环境值不一样的数据抽离出来,代码可以根据需要通过配置动态的方式获取不同的值,这个值可以是在配置文件中,数据库中等 在spring中定义了一个统一的环境变量…

android 9 adb安装过程学习(三)

PackageManagerService 一、PackageManagerService.installStage 接下来,进入 PackageManagerService 阶段。从PackageInstallerSession.java的commitLocked调用 这里的 IPackageInstallObserver2 observer 是前面创建的本次 localObserver: 位置&…

详解FreeRTOS:互斥信号量和递归互斥信号量(高级篇—3)

目录 1、互斥信号量 1.1、互斥信号量运作机制 1.2、创建互斥信号量

[SpringCloud] SpringCloud配置中心的核心原理

SpringCloud是什么时候去拉取配置中心的配置中心客户端的配置信息为什么要写在bootstrap文件中对象中注入的属性是如何动态刷新的一些开源的配置中心是如何整合SpringCloud的 文章目录 1.从SpringBoot的启动过程说起1.1 大致过程 2.准备Environment的核心操作2.1 前置操作 3.pr…

NOI / 1.10编程基础之简单排序 提问05:分数线划定 c语言 结构体

描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试…

SEOAI每周资讯和Linus思考 231127

欢迎查看 Linus筋斗云SEO 的每周资讯整理,本周的一些要点: Google11月核心更新和评论更新仍然没有结束9个搜索结果页的主要变化:图标、品牌、粉丝数、新模块GSC已索引页面狂掉?Google的问题,已修复黑五网一期间的搜索…