group_concat( [distinct] 字段名 [order by 排序字段 asc/desc] [separator ‘分隔符’] )
select group_concat(name) from laoban;
select group_concat(name separator ';') from laoban;
select dept_id,group_concat(ename separator ';') from emp3 group by dept_id;
select dept_id,group_concat(ename order by age separator ';') from emp3 group by dept_id;
select *,if(age>38,'yes','no') flag from emp3;
select ename,ifnull(age,0) age_flag from emp3;
select isnull(7);--0
select isnull(null);--1
select isnull(null);--1
select nullif(12,12);--null表示相等
select nullif(12,13);--12不等,返回第一个值
6——case when 函数
select --[简单使用1]
case 5
when 1 then 'hello'
when 2 then 'hai'else'no'
end as info;
select --[简单使用2]
case
when 1>2 then 'hello'
when 2>1 then 'hai'else'no'
end as info;
select name,--[案例使用3]
case manager_id
when 1 then 'good'
when 2 then 'ok'
when 3 then 'wa'else'nonono'
end as 'label'
from laoban;
7——窗口函数
窗口函数名 (参数)over(
partition by ...
order by ...)
select ename,--[按照部门分组,年龄排序]row_number()over(partition by dept_id order by age) as cn1,rank()over(partition by dept_id order by age) as cn2,dense_rank()over(partition by dept_id order by age rows between current and unbounded following ) as cn3 -- 当前行——最后
from emp3;
cume_dist() 查询小于等于当前薪资的比例
percent_rank()rank()-1/ rows-1 rows表示总行数
select ename,cume_dist()over(order by salary) as cn1,cume_dist()over(partiton by dept order by salary) as cn2
from employee;
selece ename, hiredate, salary
lag(hiredate,1,'2022-01-01')over(partition by dname order by hiredate) as time1, 前1行的数据
lag(hiredate,2)over(partition by dname order by hiredate) as time2 前2行的数据
lead(hiredate,2)over(partition by dname order by hiredate) as time2 后2行的数据
from employee;
select enmae, hiredate,salary,first_value(salary)over(partition by hiredate dname order by hiredate ) as first, 最早入职
last_value(salary)over(partition by hiredate dname order by hiredate ) as last 最晚入职
from employee;
select ename,hiredate,salary,nth_value(salary,2)over(partition by dname order by hiredate) as second,-- 目前薪资排名第2的那个员工的信息
nth_value(salary,3)over(partition by dname order by hiredate) as third -- 目前薪资排名第3的那个员工的信息
from employee;
select * from -- 取出每个部门的第一组员工
(
select ename, hiredate,salary,ntile(3)over(partition by dname order by hiredate) as rn from elmployee) t
where t.rn =1;