经验分享——持续更新中


1、FUNCTION df_school.sum does not exist. Check the ‘Function Name Parsing and Resolution’ section in the Reference Manual

解决方案:sum() count() avg()这些函数英文和()要挨着写,不能有空格,否则报错。


2、MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的区别

TIMESTAMPDIFF函数:有参数设置,可以精确到年(YEAR)、天(DAY)、小时(HOUR),分钟(MINUTE)和秒(SECOND),使用起来比datediff函数更加灵活。对于比较的两个时间,时间小的放在前面,时间大的放在后面。

–计算年龄,当前月日 < 出生年月的月日,则年龄减一
TIMESTAMPDIFF(YEAR,s_age,NOW()) AS ‘年龄’;

datediff函数:返回值是相差的天数,不能定位到小时、分钟和秒。

– 相差2天
select datediff(‘2018-03-22 09:00:00’, ‘2018-03-20 07:00:00’);


3、row_number()、rank()、dense_rank()的区别

row number():同薪不同名,相当于行号,例如3000,2000,2000,1000的排名是1,2,3,4

rank():同薪同名,有跳级,例如3000,2000,2000,1000的排名是1,2,2,4

dense_rank():同薪同名,不跳级,例如3000,2000,2000,1000的排名是1,2,2,3

这三个函数必须与其搭档over()搭配使用,over()常见的参数有两个,分别是:

partition by():按某字段切分

order by:与常规order by用法一致


4、MySQL查询的一般思路

  • 能用单表优先用单表,即便是需要用group by、order by、limit等,效率一般也比多表高。

  • 不能用单表时优先用连接,连接是SQL中非常强大的用法,小表驱动大表+建立合适索引+合理运用连接条件,基本上连接可以解决绝大部分问题。但join级数不宜过多,毕竟是一个接近指数级增长的关联效果。

  • 能不用子查询、笛卡尔积尽量不用,虽然很多情况下MySQL优化器会将其优化成连接方式的执行过程,但效率仍然难以保证。

  • 自定义变量在复杂SQL实现中会很有用。

    自定义函数更一般化和常用的写法应该是分三步:

    1、 定义变量接收返回值
    2、 执行查询条件,并赋值给相应变量
    3、 返回结果

  • 如果MySQL版本允许,某些带聚合功能的查询需求应用窗口函数是一个最优选择。


5、SQL 语句的执行顺序与语法顺序

SQL 语句的执行顺序跟其语句(变量传参、循环语句、迭代、调用函数 等,这些编程思维惯式)的语法顺序完全不一样:

SQL 语法顺序
在这里插入图片描述
SQL 执行顺序
在这里插入图片描述
注意点

  1. FROM 是 SQL 语句执行第一步,而不是 SELECT【因为数据库在执行 SQL 语句的第一步是将数据加载到数据缓冲区】
  2. SELECT 在 FROM 和 GROUP BY 之后执行,而在 ORDER BY 之前执行
  3. 如果要对 UNION 的总表排序,ORDER BY 放在 UNION 之后
  4. 聚合函数(count),where字句无法与聚合函数一起使用。因为where子句的运行顺序排在第二,运行到where时,表还没有被分组。

6、SQL中 case when 的用法

在这里插入图片描述


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值