Mysql刷题练习要点记录

本文深入探讨了SQL语言的高级应用技巧,包括复杂查询构造、窗口函数的高效利用、递归查询实现以及各种聚合函数的巧妙运用。通过实例解析,帮助读者掌握如何优化SQL查询效率,提升数据处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果有判断条件后再group,where写在group by前面

groub by 的判断条件用having

判断最大 xxx>=all(条件值)

left join ,join ,right join 有什么区别?单纯的join的话,只有相互匹配上的才会成行,其他的会以左表或者右表为基础,没匹配上的填null值

join 后面也可以不用跟on,用using()也挺好使的

date(内部时间可加减乘除) 计算天数

min()取group by的最小值

max() 取group by的最大值

round(xxxx,小数点个数)

ifnull(如果不为null则返回第一个参数,如果null则返回第二个参数)

count()根据列的不同,是会有不同的结果,如果值为null,则不会加进去,如果是count(*),那么都会加进去

rank是关键词,别用了——部门工资前三高的所有员工

sum(if()),sum里面套if,计数的时候很好用——每月交易2

like %%随意匹配的位置——患某种疾病的患者

获取某个行值最大的那一行,先把行值最大的那一行都查出来,然后用in进行全表查询——指定日期的产品价格

窗口函数,不改变原来行的情况下,给原来的行加个辅助列,一般使用 rank() ,dense_rank() ,row_number()等等over(里面分区进行)——每位学生的最高成绩

data_format(时间,‘%Y-%m’格式)——平均工资:部门与公司比较

(select count(*) as counts from table) 里面的counts可以用做判断的参数——换座位

修改表的id可以有新的思路,比如查询整张表的过程中,对id做处理,得到一张新的表——换座位

union可以将查出的列数据合并起来——Rearrange Products Table

妙啊,等差数列减去等差数列,值才会相同,才会是一组,等差数列用row_number over(),窗口函数来进行生成

SELECT
    MIN(log_id) START_ID,
    MAX(log_id) END_ID
FROM
    (
    SELECT DISTINCT 
        log_id, 
        log_id - ROW_NUMBER() OVER ( ORDER BY log_id ASC ) reference
    FROM 
        Logs
    ) T
GROUP BY
    reference
ORDER BY
    START_ID

找到连续区间的开始和结束数字题解

mysql8新增了递归函数,好用,查父子集非常方便——查找所有向CEO直接、间接汇报的员工

WITH RECURSIVE cte(这里可以填列名)  AS
(
# 这里是初始值
 SELECT employee_id  FROM Employees where employee_id !=1 and manager_id =1
  UNION ALL
  # 这里就是递归语句了
  SELECT a.employee_id  FROM Employees as a join cte as b  on a.manager_id=b.employee_id  
)
SELECT * FROM cte;

参考,窗口函数
窗口函数,yyds
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )

造临时表

with recursive ct as(
    select 1 as n
    union all
    # 最大的customer_id
    select n+1 from ct where n<100
)

select n as ids
from ct
# 现存的用户Id
where n not in (select distinct customer_id from Customers)
and n<(select max(customer_id) from Customers)

lower() 将字符串转小写

首字母大写,取第一个字母大写,拼接后面的字符
concat(upper(left(xx,1)),lower(substr(xxx,2)))

前缀名是包含字母(大写或小写)、数字、下划线 ‘_’、句点 ‘.’ 和/或横杠 ‘-’ 的字符串。前缀名必须以字母开头。

where mail regexp '^[a-zA-Z]+[a-zA-Z0-9_\\./\\-]*@leetcode\\.com$'

group by 也是可以写条件的

count() over() 好用的,查的是partition的总数

dayofweek()查找日期的星期数,1是星期天,2是星期一,3是星期二,依次往下。

sum(if(DAYOFWEEK(order_date)=2,quantity,0)) as Monday,
sum(if(DAYOFWEEK(order_date)=3,quantity,0)) as Tuesday,
sum(if(DAYOFWEEK(order_date)=4,quantity,0)) as Wednesday,
sum(if(DAYOFWEEK(order_date)=5,quantity,0)) as Thursday,
sum(if(DAYOFWEEK(order_date)=6,quantity,0)) as Friday,
sum(if(DAYOFWEEK(order_date)=7,quantity,0)) as Saturday,
sum(if(DAYOFWEEK(order_date)=1,quantity,0)) as Sunday

求前几行,后几行的平均值,用窗口函数编写

avg(ride_distance) over(order by month rows between current row and 2 following )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

rgbhi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值