版权说明: 本文由博主keep丶原创,转载请注明出处。
原文地址: https://blog.csdn.net/qq_38688267/article/details/110916171
本文介绍一些MySQL中比较鲜为人知的语法,我们直接步入正题:
<=> 比较符
>、<、<>、<=、>=
都很常见,但你知道<=>
吗?他的语法如下:
column <=> 'VALUE'
,<=>
等价于=
,等价于column = 'VALUE'
。
column <=> NULL
,等价于column IS NULL
。
NULL <=> NULL
,返回值为1
。NULL = NULL
的返回值为NULL
。
简单来说,<=>
就是加强版的=
,区别就是NULL = NULL
的返回值为NULL
;而NULL <=> NULL
的返回值为1
,或者说为TRUE
。
SAVEPOINT 语法
savepoint
保存点,是用于事务中,我们可以在事务执行过程中创建保存点,然后回滚的时候可以回滚到指定保存点。
-- 开启事务
BEGIN;
-- update_by 改成 1
update sys_dict set update_by = 1 where id = 1;
-- 添加保存点
SAVEPOINT p1;
-- update_by 改成 2
update sys_dict set update_by = 2 where id = 1;
-- 回滚到保存到p1的状态
ROLLBACK TO p1;
-- 查询数据,返回值为 1
select update_by from sys_dict where id = 1;
ANY()/SOME()、ALL()
ANY()、SOME()、ALL()
算是比较冷门的语法了,它们只支持在用于包含子查询,其中ANY()
和SOME()
是同义词,所以就不分别介绍ANY()
和SOME()
了,语法如下:
-
column > ANY(1,2,3)
,表示大于其中一个即可,即大于其中最小值即可, 等价于column > 1
。
column > ALL(1,2,3)
,表示要大于其中所有值,即需要大于其中最大值, 等价于column > 3
。 -
column = ANY(1,2,3)
,等价于column IN (1,2,3)
。 -
column <> ALL(1,2,3)
,等价于column NOT IN (1,2,3)
。
更多详情请参见:MySQL官方文档-带有ANY,IN或SOME的子查询
->、->> 表达式
这两个表达式也很少见,因为很少有人用MySQL的JSON
数据类型。其中->
是MySQL5.7中加入的,->>
是MySQL8.0加入的。这个我们直接结合栗子来看:
->
等价于JSON_EXTRACT()
,而->>
等价于JSON_UNQUOTE(JSON_EXTRACT())
,区别就是->
的返回值的字符串还会带""
,而->>
的返回值的字符串没有。
NULLIF()函数
NULLIF(条件不满足时输出的值,条件)
,NULLIF('哈哈', 1 = 1)
等价于IF(1 = 1, '哈哈', NULL)
,即当条件满足时返回第一个参数的值,条件不满足时返回NULL。
TABLE 和 VALUES ROW 语法
MySQL8.0.19引入,TABLE可以在一定程度上替代select * from 语法。
-
TABLE t1 UNION TABLE t2
相当于SELECT * FROM t1 UNION SELECT * FROM t2
-
CREATE TABLE t2 TABLE t1
相当于CREATE TABLE t2 SELECT * FROM t1
-
SELECT a FROM t1 WHERE b > ANY (TABLE t2)
相当于SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2)
VALUES用于创建一行数据:
总结
暂时只想到这些,后续有新的比较好用又鲜为人知的会继续更新。
MySQL8.0新出了很多新东西,知道的人也不多,比如 公共表表达式WITH
、OVER、WINDOW窗口函数
、8.0.19出的TABLE 语法
等,这些在一定场景下都特别好用,我就不一一介绍了,感兴趣的同学可以自行百度。
介绍了这么多,有人可能觉得这些有什么用呢?我只是希望能给大家留下一些映像,当遇到对应需求的时候,能够想到还有这种解决方案。因为只有你知道有这么个东西,你才可能用得上,如果你都不知道有这么个东西,那么你肯定用不上!
希望本博客对大家有所帮助或启发,觉得写得不错的同学可以点赞支持一下哦~