mysql去重合并字符串_MYSQL常⽤函数常⽤函数
1.字符串函数
select concat('CDA','数据','分析'); -- 结果:CDA数据分析
select instr('CDACDSEA','a'); -- 结果:3(返回第⼀个a出现的位置)
select left('CDA数据分析',3); -- 结果:CDA
select right('CDA数据分析',4); -- 结果:数据分析
select mid('CDA数据分析',4,4); -- 结果:数据分析
select substring('CDA数据分析',4,4); -- 结果:数据分析
select ltrim(' CDA数据分析 '); -- 左边去空格
select rtrim(' CDA数据分析 '); -- ⼜边去空格
select trim(' CDA数据分析 '); -- 两头去空格
select replace('CDA数据分析', 'CDA', 'cda'); -- 将cda替换CDA
-- select repeat('CDA',3); -- 将CDA复制写3遍
-- 查询各部门的员⼯⼈数占⽐:各部门⼈数/总⼈数(以百分⽐显⽰)
select deptno,concat((count(empno)/(select count(empno) from emp))*100,'%') ⼈数占⽐
from emp
group by deptno;
-- 练习:将每位员⼯的姓名⾸字母转换为⼤写
select empno,replace(ename,left(ename,1),upper(left(ename,1))) from emp;
2.数学函数
select abs(-32); -- 绝对值
select floor(1.23);
select floor(-1.23); -- 取下限
select ceiling(1.23);
select ceiling(-1.23); -- 取上限
select round(1.58,1);
select round(1.58); -- 取⼩数,满⾜四舍五⼊
select rand();
select rand(123); -- 随机取数
-- 查询各部门的员⼯⼈数占⽐:各部门⼈数/总⼈数(以百分⽐显⽰)(保留2位⼩数)
select deptno,concat(round(count(empno)/(select count(empno) from emp)*100,2) ,'%') ⼈数占⽐
from emp
group by deptno;
3.⽇期函数
select date('20200101');
select date('2001001');
select date('2020-01-01 12:00:00'); -- 标准⽇期格式
select week('2019-01-01',0); -- 0-53周
select week('2019-01-01',1); -- 1-52周
select month('2020-06-03'); -- ⽉
select quarter('2020-06-03'); -- 季度
select date_add("2020-06-03",interval 4 day); -- 加上对应的时间:day/month/year
select date_sub("2020-01-01", interval 1 month); -- 减去对应的时间:day/month/year
select date_format('20-01-01 12:00:00','%Y-%m-%d');
select date_format('1993-01-01 12:00:00','%y-%m-%d'); -- 按固定格式取⽇期
select curdate(); -- 获取当前电脑⽇期
select curtime(); -- 获取当前电脑时间
select now(); -- 获取当前电脑⽇期和时间
select datediff('2020-6-3','2020-5-1'); -- 两个⽇期之间差的天数
select empno,ename,job,hiredate,datediff(curdate(),hiredate)/365 ⼯龄 from emp;
select unix_timestamp(); -- 时间戳(从'1970-01-01 00:00:00'开始的秒数,date默认值为当前时间) select unix_timestamp('2020-01-01');
select from_unixtime(1577808000); -- 将时间戳转化成⽇期
-- 练习:查询每位员⼯的⼯龄(年):ename,hiredate,⼯龄
select empno,hiredate,floor(datediff(curdate(),hiredate)/365) ⼯龄 from emp;datediff是字符型函数
4.分组合并函数(重要)
-- GROUP_CANCAT([distinct] str [order by str asc/desc] [separator])
-- 将group by产⽣的同⼀个分组中的值连接起来,返回⼀个字符串结果。
-- 练习:查询各部门的员⼯姓名
select deptno,group_concat(distinct ename order by sal separator '/')
from emp
group by deptno; -- -- 可以去重、排序、改分割符合(默认是','分割,可以⽤separator改变分割符合) 5.逻辑函数
select ename,sal,comm,ifnull(comm,0) from emp;
-- if函数:查询每位员⼯的⼯资级别:3000及以上为⾼,1500-3000为中,1500及以下为低select * ,if(sal>=3000,'⾼',if(sal<=1500,'低','中')) ⼯资级别 from emp;
-- 逻辑表达式 case when ... else ... end
select *,case when sal>=3000 then '⾼'
when sal<=1500 then '低'
else '中'
end ⼯资级别
from emp;
6.开窗函数(本质还是聚合函数)
-- 语法:开窗函数名([]) over([partition by ] [order by [desc]] [< 细分窗⼝>])
-- 聚合函数⽤于开窗函数
-- 查询所有员⼯的平均⼯资
select * from emp;
select avg(sal) 平均⼯资 from emp;
select *,avg(sal) over() 平均⼯资 from emp;
-
- 开窗函数,当over中没有指定分区、排序和滑动窗⼝时,默认将整个表作为⼀个区,默认计算的是所有值
-- 查询所有部门员⼯的平均⼯资
select deptno,avg(sal) 平均⼯资 from emp group by deptno; -- 普通做法
select *,avg(sal) over(partition by deptno) 平均⼯资 from emp; -- 开窗函数做法
-- 当over中指定了分区,但是没有指定排序和滑动窗⼝时,默认计算的是当前分区内的所有值
-- 查询各部门的累计⼯资
select *,sum(sal) over(partition by deptno order by hiredate) 累计⼯资 from emp;
-- 当over中指定分区和排序,但是没有指定滑动窗⼝,默认计算的是分区内第⼀⾏到当前⾏的值
select *,sum(sal) over(partition by deptno ) 累计⼯资 from emp;
-- 查询各部门按⼊职⽇期计算移动平均⼯资(当前⾏跟上下⼀⾏的平均值)
select *,avg(sal) over(partition by deptno order by hiredate rows between 1 preceding and 1 following) 移动平均⼯资 from emp;
-- 当over中指定分区、排序和滑动窗⼝,那么计算的就是分区内滑动窗⼝的值
7. 序号函数
-- row_number() 显⽰分区中不重复不间断的序号 (静态窗⼝)
-- dense_rank() 显⽰分区中重复不间断的序号
-- rank() 显⽰分区中重复间断的序号
-- 查询所有员⼯的⼯资排名
select * ,row_number() over(order by sal desc ) 排名 from emp;
-- 查询各部门员⼯的⼯资排名
select * ,row_number() over(partition by deptno order by sal desc ) 排名1,
rank() over(partition by deptno order by sal desc ) 排名2,
dense_rank() over(partition by deptno order by sal desc ) 排名3
from emp;
8.查询数据导出保存的⽅法,保存在安全路径下
-- into outfile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/t1.csv' -- (t1.csv t1是保存的⽂件名称 CSV是保存的类型) -- fields terminated by ',' -- ','⾏内数据⽤逗号隔开
-- lines terminated by '\r\n'; -- '\r\n'回车换⾏ (⾏与⾏保存时的符合定义)
-- 如保存查询各部门员⼯的⼯资排名的结果数据
select * ,row_number() over(partition by deptno order by sal desc ) 排名1,
rank() over(partition by deptno order by sal desc ) 排名2,
dense_rank() over(partition by deptno order by sal desc ) 排名3
from emp
into outfile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/t1.csv'
fields terminated by ','
lines terminated by '\r\n';

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。