文章目录
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 执行顺序:
• 注意点:
- FROM 是 SQL 语句执行第一步,而不是 SELECT【因为数据库在执行 SQL 语句的第一步是将数据加载到数据缓冲区】
- SELECT 在 FROM 和 GROUP BY 之后执行,而在 ORDER BY 之前执行
- 如果要对 UNION 的总表排序,ORDER BY 放在 UNION 之后
- 聚合函数(count),where字句无法与聚合函数一起使用。因为where子句的运行顺序排在第二,运行到where时,表还没有被分组。