MySQL | 查询数据和插入、更新、删除数据中一些容易遗忘的点

目录

一、GROUP_CONCAT()函数

二、在GROUP BY 子句中使用WITH ROLLUP

三、带ANY、SOME关键字的子查询

四、带ALL关键字的查询

五、带EXISTS关键字的子查询

六、使用正则表达式查询

七、通用表表达式

 八、为表增加计算列


一、GROUP_CONCAT()函数

在MySQL中,可以在GROUP BY子句中使用GROUP_CONCAT()函数,将每个分组中各个字段的值显示出来。

二、在GROUP BY 子句中使用WITH ROLLUP

使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算出巡出的所有记录的综合,即统计记录数量。

当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。

三、带ANY、SOME关键字的子查询

ANY、SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。

SELECT num1 FROM tb11 WHERE num1 > ANY (SELECT num2 FROM tb12);

只要大于num2列的任意一个数即为符合条件的结果。

四、带ALL关键字的查询

ALL关键字与ANY和SOME不同,使用ALL时需要同时满足所有内层查询的条件。

五、带EXISTS关键字的子查询

EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果是true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。

例:查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中的记录,SQL语句如下:

SELECT * FROM fruits WHERE EXISTS (SELECT s_name FROM suppliers WHERE s_id=107);

EXISTS和NOT EXISTS的结果只取决于是否会返回行,而不取决于这些行的内容,所以这个子查询输入列表通常是无关紧要的。

六、使用正则表达式查询

正则表达式常用字符匹配列表
选项说明例子匹配值示例
^匹配文本的开始字符'^b'匹配以字母b开头的字符串book,big,banana,bike
$匹配文本的结束字符'st$'匹配以st结尾的字符串test,resist,persist
.匹配任何单个字符'b.t'匹配任何b和t之间有一个字符的字符串bit,bat,but,bite
*匹配零个或多个在它前面的字符'f*n'匹配字符n前面有任意个字符f的字符串fn,fan,faan,fabcn
+匹配前面的字符1次或多次'ba+'匹配以b开头后面紧跟至少有一个a的字符串ba,bay,bare,battle
<字符串>匹配包含指定的字符串的文本'fa'匹配包含fa的字符串fan,afa,faad
[字符集]匹配字符集合中的任何一个字符'[xz]'匹配包含x或者z的字符串dizzy,zebra,x-ray,extra
[^]匹配不在括号内的任何字符'[^abc]'匹配任何不包含a、b或c的字符串desk,fox,f8ke
字符串{n,}匹配前面的字符串至少出现n次b{2}匹配2个或更多的bbbb,bbbb,bbbbbbb
字符串{n,m}匹配前面的字符串至少n次,至多m次。如果n为0,此参数为可选参数。b{2,4}匹配含最少2个、最多4个b的字符串bb,bbb,bbbb

例:在fruits表中,查询f_name字段以字母'y'结尾的记录,SQL语句如下:

SELECT * FROM fruits WHERE f_name REGEXP 'y$';

记得不要忘了“REGEXP”。

七、通用表表达式

通用表表达式简称CTE。CTE是命名的临时结果集,作用范围是当前语句。CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询。

示例:

WITH cte as (
SELECT * FROM goods)

CTE是一个可以重复使用的结果集。相比于子查询,CTE的效率会更高,因为非递归的CTE只会查询一次并且可以重复使用。

还有一种特殊的CTE,就是递归CTE,其子查询会引用自身。WITH子句必须以WITH RECURSIVE开头。

CTE递归子查询包括两部分:seed查询和recursive查询,中间由union[all]或union distinct分隔。seed查询会被执行一次,以创建初始数据子集。recursive查询会被重新执行以返回数据子集,直到获得完整的结果集。当迭代不会生成任何新行时,递归就会停止。

示例:

WITH RECURSIVE cte(n) AS (
SELECT 1
UNION ALL
SELECT n+1 FROM cte WHERE n<8)
SELECT * FROM cte;

结果如下:

n
1
2
3
4
5
6
7
8

 八、为表增加计算列

计算列就是某一列的值是通过别的列计算得来的。

在MySQL 8.0中,CREAE TABLE和ALTER TABLE中都支持增加计算列。下面以CREAE TABLE为例进行讲解。

CREATE TABEL tb1(
id int(9) NOT NULL AUTO_INCREMENT,
a int(9) DEFAULT NULL,
b int(9) DEFAULT NULL,
c int(9) GENERATED ALWAYS AS ((a+b)) VIRTUAL,
PRIMARY KEY ('id')
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天下弈星~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值