SQL的进阶用法

news/2024/11/9 9:42:56/

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

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

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

order by field(col_name,自定义排序结果集) --根据指定的顺序进行排序

2.空值NULL排序(ORDER BY IF(ISNULL))

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

select * from movies ORDER BY actors, price desc;
select * from movies ORDER BY if(ISNULL(actors),0,1),actors, price;

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

在实际开发中我们经常会写很多if  else if  else,这时候我们可以使用CASE WHEN表达式解决这个问题。

以学生成绩举例。比如说:学生90分以上评为优秀,分数80-90评为良好,分数60-80评为一般,分数低于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 m1 as (select * from movies where price > 50),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.优雅处理数据插入、更新时主键、唯一键重复

在MySq中插入,更新数据有时会遇到主键重复的场景,通常的做法就是先进行删除在插入达到可重复执行的效果,但是这种方法有时候会错误删除数据。

①插入数据时我们可以使用IGNORE,它的作用是插入的值遇到主键或者唯一键重复时自动忽路重复的数据,不影响后面数据的插入,即有则忽路,无则插入,示例如下:

select * from movies where id >= 13;INSERT 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
(13,'神话','成龙’,100,'2005-12-22');INSERT IGNORE INTO movies (id, movie_name, actors, price,release_date) VALUES
(14,"'神话2','成龙’,114,'2005-12-22');


②还可以使用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, price, release_date) VALUES
(15,'神话3','成龙’,115,'2005-12-22');

③更新数据时使用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;


http://www.ppmy.cn/news/83180.html

相关文章

【严重】ejs 存在服务端模板注入漏洞(存在POC)

漏洞描述 EJS 是开源的 JavaScript 模板引擎,允许在HTML代码中使用JavaScript代码块,closeDelimiter 参数是 EJS 模板中的结束标记,用于指定结束分隔符。 由于对 CVE-2022-29078 漏洞修复不完全,当应用程序使用 EJS 模板引擎&am…

AI人工智能在Python中构建回归器的原理、优缺点、应用场景和实现方法

回归器(Regressor)是一种常用的机器学习算法,可以用于预测数值型变量的值。在人工智能(Artificial Intelligence,简称AI)领域中,回归器是一种高效的算法,可以用于许多应用领域&#…

赛宁首创革新赛制助力人才培养 | 第十六届全国大学生信息安全竞赛-创新实践能力赛全面启动!

​​为积极响应国家网络空间安全人才战略,加快攻防兼备创新人才培养步伐,实现以赛促学、以赛促教、以赛促用,推动网络空间安全人才培养和产学研用生态发展,由国防科技大学与中国科学技术大学联合承办的第十六届全国大学生信息安全…

携手企企通,农业产业化国家重点龙头企业「罗牛山」加速采购数智化建设

导语 与企企通形成战略合作,双方基于供应商、合同管理、采购协同等多方面的应用场景,打造立足海南辐射全国的行业标准化解决方案。行业案例的示范作用,不仅对牛罗山采购业务数字化有指导意义,对整个畜牧养殖行业加入采购供应链管…

docker版jxTMS使用指南:python服务简介

jxTMS提供了python扩展来提供业务支持的全能力需要。4.0版jxTMS对python服务的基础能力进行了全面的提升。整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容 docker版本的使用,请参考:docker版jxTMS使用指南 4.0版jxT…

Java版工程项目管理系统源码 工程项目源码

数 据 库: MySQL 开发语言: Java 开发工具: MyEclipse 源码类型: WebForm 以甲方项目管理为中心,包括项目启动、计划、执行、控制与收尾阶段的全生命周期管理,并对范围、预…

用Flutter你得了解的七个问题

Flutter是Google推出的一款用于构建高性能、高保真度移动应用程序、Web和桌面应用程序的开源UI工具包。Flutter使用自己的渲染引擎绘制UI,为用户提供更快的性能和更好的体验。 Flutter使用Dart语言,具有强大的类型、效率和易学能力,基本上你…

Python calendar 模块

calendar 是与日历相关的模块,该模块定义了很多类型,主要包括:Calendar、TextCalendar、HTMLCalendar,其中 Calendar 是 TextCalendar 和 HTMLCalendar 的基类,这些类有着十分丰富的日历处理方法。 1 calendar 模块 …