mysql刷题总结

1、mysql 不支持一边删除记录一边查询记录,所以要删除的时候,要把查询的子结果重新命名成一张新表

2、concat 函数可以拼接多个元素(不限于两个),用英文逗号分隔即可;

3、datetime类型的字段可以直接插入符合要求的时间字符串

4、group by 配合having 进行条件筛查,配合max()、min()等聚合函数取特定值

5、group by 和 distinct都可以去重,group by效率高,推荐优先使用

6、union 会去重,查询结果没有重复记录,union alll查出的结果有重复记录

7、  left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
  right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
  inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。

8、delete语句
     DELETE FROM table_name [WHERE Clause]

9、insert 语句
     INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN ),
                       ( value1, value2,...valueN );

10、update语句
       UPDATE table_name 
       SET field1=new-value1, field2=new-value2
       [WHERE Clause]

11、判断一个数是否为奇数
       方法一:取模——   val % 2 !=0
       方法二(推荐):按位与——   val & 1

12、更改表名
        ALTER TABLE 表名 RENAME TO/AS 新表名 

13、replace 函数
       replace( 字段名, 原值,新值 )

14、先order by 对表排序,再group by 分组,group by会忽略前面的排序,导致查询结果错误.
       例如:SELECT  user_id, d FROM (select * FROM login ORDER BY d DESC  ) AS a  GROUP BY a.user_id ;
       并不会按照子查询中的排序进行分组,还是会按照原始排序分组。

       解决方法一(不推荐):加limit
                SELECT  user_id, d FROM (select * FROM login ORDER BY d DESC  limit  1000  ) AS a  GROUP BY a.user_id ;
        解决方法二(推荐):使用max()函数
       SELECT user_id, MAX(d) FROM  login group by user_id ;

15、ROUND()函数
       round(需要取小数位数的数,小数位数);
       注: 小数位数可以为负数。
       例:   round(1123.26723,1)——1123.3
                round(1123.26723,-1)——1120

16、where条件中同时存在and  和 or 记得加括号。

17、统计字符串长度:
       char_length('string')/char_length(column_name)
       1、返回值为字符串string或者对应字段长度,长度的单位为字符,一个多字节字符(例如,汉字)算作一个单字符;
       2、不管汉字还是数字或者是字母都算是一个字符;
       3、任何编码下,多字节字符都算是一个字符;
       参考资料来源:https://blog.csdn.net/iris_xuting/article/details/53763894

       length('string')/length(column_name)
       1、utf8字符集编码下,一个汉字是算三个字符,一个数字或字母算一个字符。
       2、其他编码下,一个汉字算两个字符, 一个数字或字母算一个字符。

18、排序函数
       排序函数row_number、rank、dense_rank的区别:
       口诀的意思是:
       row_number:不考虑并列的情况,哪怕分数相同,排名都是一溜下来的自然数。
       dense_rank和rank 考虑并列的情况,
       区别在于rank很跳,并列排名的个数会影响接下来的排名,表现为数字的中断。而dense_rank 不管有几个并列的第5名,接下来都是从6开始排。

19、在内连接、外连接中,要先join后where,否则会报错

20、case when then else end
       case 字段名
               when  情形1  then
                         输出值1
               when  情形2  then
                         输出值2
               else
                         输出值3
        end  重新命名字段

if(e.type = 'no_completed', true , null)


21、

SELECT SUM(if(category=1,size,0)) ,COUNT(if(category=1,true,null)) FORM t_file;
https://blog.csdn.net/q812002440/article/details/76898619

解析:
1. sum(if(category=1,size,0))中 sum函数返回一个值类型的数值,如果category=1,则返回size,如果category不等于1就返回0。
2. count(if(category=1,true,null))中count函数返回一个布尔值类型的数值,如果category=1,返回true,如果category不等于1返回null,如果写成count(If(category=1,1,0) 则返回的全是true,也就是说全都会计数,而count()间断内容是true还是null,如果不是null就计数,如果是null就不计数。

所以count(if())的写法应该是count(if(表达式表达式,true,null));
————————————————
版权声明:本文为CSDN博主「cindyCode」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q812002440/article/details/76898619


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值