首页 > 数据库 >7种SQL的进阶用法

7种SQL的进阶用法

时间:2023-05-26 14:38:43浏览次数:32  
标签:进阶 movie price 用法 movies actors SQL id name

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:疯狂机器城');

7种SQL的进阶用法_字段

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;

7种SQL的进阶用法_数据_02


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

  • 在实际开发中我们经常会写很多if ··· else if ··· 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, sname, 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;

7种SQL的进阶用法_主键_03

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;

7种SQL的进阶用法_字段_04

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;

7种SQL的进阶用法_字段_05

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种SQL的进阶用法_字段_06

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

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

  1. 插入数据时我们可以使用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');
  1. 还可以使用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');

7种SQL的进阶用法_数据_07

  1. 更新数据时使用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的进阶用法_数据_08

标签:进阶,movie,price,用法,movies,actors,SQL,id,name
From: https://blog.51cto.com/u_13794879/6355291

相关文章

  • SqlServer数据行转列
    准备表和插入数据CREATETABLE[dbo].[Test]( [Id][int]IDENTITY(1,1)NOTNULL, [Type][nvarchar](30)NOTNULL, [Status][nvarchar](30)NOTNULL, [AppNo][nvarchar](50)NOTNULL,CONSTRAINT[PK_DocumentSet]PRIMARYKEYCLUSTERED( [Id]ASC)WITH(PAD_IN......
  • SparkSQL
    目录SparkSQL数据抽象案例一:加载数据成分布式表案例二:将RDD转为DataFrame使用样例类指定类型+列名自定义Schema案例三:RDD-DF-DS相互转换案例四:SparkSQL花式查询需求一、SQL和DSL两种方式实现各种查询案例五:SparkSQL实现WordCount案例六:多数据源支持案例七:电影数据分析案例八:SparkS......
  • 【MySQL】【锁】MySQL 死锁了,怎么办
    1  前言MySQL会发生死锁么,当然会,有锁的地方,有多个事务的地方,就会出现互相争夺对方资源的情况,就会产生僵持,比如我们的业务场景:主要逻辑就是新增订单、修改订单、查询订单等操作。然后因为订单是不能重复的,所以当时在新增订单的时候做了幂等性校验,做法就是在新增订单记录之前,先......
  • windows环境下 java 使用sqlite-jdbc 加载mod_spatialite用于地理空间处理
    由于项目需要,将sqlite中的数据使用空间函数(st_astext(),st_geomfromtext()等)处理空间坐标数据,这就需要加载mod_spatialite组件,从网上找了很多方法,也问了gpt,也从官网上(http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/java.html)找到了加载mod_spatialite组件的示......
  • 搭建mysql 初始环境
    安装MySQL数据库实验环境:centos操作系统、cmake源码包、mysql源码包实验目的,安装数据库实验步骤: 一、安装前的准备工作:为了避免发生端口冲突,程序冲突等现向,建议先查询mysql软件的安装情况,确认没有使用以RPM方式安装的mysql-server、mysql软件包,否则建议将其卸载。[root@loc......
  • MySQL语句练习操作和维护
    六、使用MySQL数据库:(1)SHOW DATABASES语句:用于查看当前MySQL服务器中包含的库。经初始化后的MySQL服务器,默认建立了四个库:test、MySQL、information_schema和performance_schema,(其中MySQL库中包含了用户认证相关表),执行以下操作可以进行查看。 mysql>SHOWDATABASES;+------......
  • 【C#】- ??、 ?、 ?: 、?.、?[ ] 问号的各种用法
    1.可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:stringstr=null;是正确的,inti=null;编译器就会报错。为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?”例如:int?表示可空的整形,DateTime?表示可......
  • Mysql表外连接和约束和自增
    1. mysql 表外连接  7821.1 提出一个问题1.前面我们学习的查询,是利用where子句对两张表或者多张表,形成的笛卡尔积进行筛根据关联条件,显示所有匹配的记录,匹配不上的,不显示2.比如:列出部门名称和这些部门的员工名称和工作,同时要求显示出那些没有员工的部门。3. 使用我们学习过......
  • Mysql索引
    1. 索引快速入门  791说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调sql,查询速度就可能提高百倍干倍。这里我们举例说明索引的好处[构建海量表8000000] 是不是建立一个索引就能解决所有的问题?ename.上没有建立索引会怎样?select * from emp wh......
  • mysql事务
    1. mysql 事务1.1 什么是事务事务用于保证数据的一致性,它由一组相关的dml语句组成该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。2. 事务和锁  796-797当执行事务操作时(dml语句) ,mysql会在表 上加锁,防止其它用户改表的数据.这对......