• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

SQL编程:有趣的SQL语句–持续更新

MySQL SQL 彭东稳 7年前 (2018-04-03) 21110次浏览 已收录 0个评论

一、统计每个表自增值

根据统计信息用来统计每个表自增字段当前使用量及自增最大值。

效果如下:

二、给查询结果一个序号

首先set一个变量,然后查询时给这个变量赋值并加1就可以了。

注意变量赋值时“=”跟“:=”的区别,其中“=”是用来设置一个变量,而“:=”是用来赋值一个变量,如下:

这里,我们需要先用set设置一个变量。其实也可以把上面这种操作变更为一条语句,使用子查询方式处理。

如果需要把这个序号更新到表的某个字段呢?做法其实也一样,比如根据时间降序将序号更新到 seq 字段。

三、利用CASE语句标识字段属性

使用MySQL CASE语句来标识字段属性,如下:

0标识为女,1标识为男,2标识为保密。

这里需要注意一点,我们这可以拿sex_text字段来进行排序或分组,但是不能拿sex_text字段来做where条件。这是因为SQL执行顺序where在select前面,字段不存在所以无法做条件判断,但是排序或分组在select后面,所以可以使用sex_text字段。

SQL逻辑解析顺序:

四、利用CASE语句更新字段

需求,当条件AGE等于22时,extra赋值为100;当AGE=24时,extra赋值为200。

需要注意一点的是,使用这种方式更新时,虽然会简便SQL编写,但会更新所有记录。会把符合条件的对应值更新,而不符合条件的值更新为NULL,所以谨慎使用。如果想把不符合条件的值更新为指定值,可以加ELSE条件。

五、给查询结果排名

使用子查询方式实现。

结果如下:

六、根据重复行合并多行

测试数据如下:

实现消除重复字段a,且合并字段b的结果集。利用group_concat函数处理,如下SQL:

七、合并结果集

先把测试环境给出来,下面再说需求。

就是把两张表结果集合并到一起, 并且id字段相同的需要合并成一行。如果直接使用union方法处理如下:

显然无法满足我们id字段相同的合并到一起的需求。一个朋友给了下面这种处理方式:

得到的结果集如下:

完美解决了我们的需求。

八、分组统计

在一个MySQL群里看见有网友发出这样的一个查询请求,表结构及数据如下:

要求得到结果如下:

这道题一看就是分组统计类的,但不是简单的sum … group by就行,因为你要判断一下那些记录是“胜”,那些记录是“负”,要分开统计。所以,直接使用case … group by即可。

九、一个有意思的SQL查询

起因这是面试题,感觉挺有意思的,就刷了一下(写完发现涉及的技巧还是挺多的)。表结构(夺冠球队名称及夺冠年份)及表记录如下:

写出一条 SQL 语句,查询出在此期间连续获得冠军的有哪些?其连续的年份的起止时间是多少?结果如下:

咋一看确实挺有难度的,小步慢跑,拆分实现。

1. 首先查询出连续两年获奖的球队

通过inner join得到了连续两年获奖的球队,下面再要解决的一个问题就是把连续获奖的球队进行分组,这里当然不能直接group by name,不然就全部合并了,达不到我们上面的需求。所以只能从year下手来进行分组,可以通过增加两个虚拟列,一个自增行号,一个夺冠伪起始年份(利用夺冠伪起始年份进行分组)。

2. 得到可进行分组的列

得到的结果如下:

在上面的SQL中,我们利用“c.year – @rn”就可以把相同连续年份夺冠的球队分到一组。

3. 通过子查询做分组处理

再把上面这个SQL进行分组处理(根据begin字段),然后使用min(year) – 1和max(year)得到球队夺冠起始时间和结束时间。

得到结果如下:

现在就得到了我们想要的结果,是不是还蛮多技巧的。

10. 行转列

行转列之后

可以看出,这里行转列是将原来的 subject 字段的多行内容选出来,作为结果集中的不同列,并根据 userid 进行分组显示对应的 score。

也可以使用 IF() 进行行转列

 

 

 


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (3)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!