Mysql七种高阶用法,让你少走弯路

首先先让我们创建表,SQL如下


CREATE TABLE `moives` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `movie_name` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL,
  `actor_name` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
  `price` decimal(10,0) DEFAULT NULL,
  `release_date` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `NewTable_id_IDX` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

1、使用自定义字段排序
a、通过FIELD关键字,定义排序顺序

SELECT  * FROM  moives  order by  FIELD(actor_name,"成龙","刘亦菲","范冰冰","靳东") 

b、使用 case when转换为自定义排序

SELECT  * FROM  moives  order by 
CASE actor_name
		WHEN "成龙" THEN 1
		WHEN "刘亦菲" then 2
		when "范冰冰" then 3
		else 4
end  DESC 

c、使用locate instr 两个函数进行排序
mysql的instr函数有着相似的功能,instr(str,sub)返回的是字符串sub在字符串str第一次出现的位置,其中instr(str,sub) = 0 表示字符串str不包含字符串sub。

还能和like一样作为模糊查询


SELECT  * FROM  moives  order by  LOCATE(actor_name,"成龙,刘亦菲,范冰冰,靳东") 
SELECT  * FROM  moives  order by  INSTR("成龙,刘亦菲,范冰冰,靳东",actor_name) 

2、null空值排序

SELECT  * FROM  moives  order by  IF(ISNULL(actor_name),2,1),price  

3、case when表达式语句

SELECT
	*,
	CASE
		WHEN price>90 THEN "昂贵"
		WHEN price>80 then "贵"
		when price >70 then "比较亲民"
		else "不及格"
	end level
FROM
	moives

4、分组连接函数 group_concat

SELECT 
actor_name,GROUP_CONCAT(movie_name),GROUP_CONCAT(price)  
FROM moives m 
group by actor_name
-- 按照字段排序,使用自定义分隔符
SELECT 
actor_name,GROUP_CONCAT(movie_name order by price DESC SEPARATOR "-"),GROUP_CONCAT(price order by price DESC  SEPARATOR "-")  
FROM moives m 
group by actor_name

5、分组后统计汇总 WITH ROLLUP


SELECT 
actor_name,SUM(price)
FROM moives m  
group by actor_name WITH ROLLUP 

6、子查询提取 with as

其实就是把一大堆重复用到的sql语句放在with as里面,取一个别名,后面的查询就可以用它,这样对于大批量的sql语句起到一个优化的作用,而且清楚明

With
m1 AS(SELECT * FROM moives m WHERE price >50),
m2 AS (SELECT * FROM moives WHERE price>80)
SELECT  * FROM  m1 WHERE  m1.id NOT  IN (SELECT m2.id FROM m2) AND m1.actor_name="刘亦菲"

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

SELECT * FROM  moives WHERE  id>10
INSERT INTO moives (id, movie_name, actor_name, price, release_date) VALUES(13,"神话11","成龙",100,"2005-12-22");
-- 使用ignore 有则忽略,无则插入
INSERT IGNORE INTO moives (id, movie_name, actor_name, price, release_date) VALUES(13,"神话11","成龙",100,"2005-12-22");
-- 使用replace 有则删除之后插入,无则直接插入
REPLACE   INTO moives (id, movie_name, actor_name, price, release_date) VALUES(13,"神话11","成龙",1020,"2005-12-22");
-- on duplicate key update 有就更新,没有就插入
INSERT IGNORE INTO moives (id, movie_name, actor_name, price, release_date) VALUES(13,"神话11","成龙",100,"2005-12-22")
on DUPLICATE KEY UPDATE  price=price+100
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 提供了一些高阶的查询语句用法,可以帮助我们更灵活、高效地进行数据查询。以下是一些常用的高阶用法: 1. 子查询: 子查询是将一个查询嵌套在另一个查询中的查询结构。它可以用作 `SELECT` 语句中的列、`FROM` 子句中的表、`WHERE` 子句中的条件等。 示例: ```sql SELECT column_name FROM table_name WHERE column_name IN (SELECT column_name FROM another_table WHERE condition); ``` 2. 联合查询: 联合查询用于将两个或多个查询的结果合并成一个结果集。可以使用 `UNION` 或 `UNION ALL` 运算符来执行联合查询。 示例: ```sql SELECT column_name FROM table1 UNION SELECT column_name FROM table2; ``` 3. 分页查询: 分页查询用于在结果集中进行分页显示数据。可以使用 `LIMIT` 子句指定要返回的记录数量,并使用 `OFFSET` 子句指定要跳过的记录数量。 示例: ```sql SELECT column_name FROM table_name LIMIT number_of_rows OFFSET offset_value; ``` 4. 排序: 可以使用 `ORDER BY` 子句对查询结果进行排序。可以按照一个或多个列进行升序或降序排序。 示例: ```sql SELECT column_name FROM table_name ORDER BY column_name ASC; ``` 5. 聚合函数和分组: 使用聚合函数(如 `SUM`、`AVG`、`COUNT` 等)可以对数据进行聚合计算。可以结合 `GROUP BY` 子句将结果集按照一个或多个列进行分组。 示例: ```sql SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; ``` 这些是一些常用的 MySQL 查询语句高阶用法,可以根据具体需求进行学习和使用。此外,MySQL 还提供了其他高级特性,如窗口函数、子查询优化、索引优化等,可以进一步提升查询性能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值