如果有判断条件后再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 )