系列文章目录
mysql窗口函数,聚合函数
文章目录
前言
mysql窗口函数,聚合函数
提示:以下是本篇文章正文内容,下面案例可供参考
2,聚合函数
窗口函数分为:
- 聚合函数
- 专用函数
聚合函数
sum,min,max,avg,count,
专用函数
rank,dense_rank,row_number
- rank函数
计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
例如:有3条记录并列第一时:1,1,1,4
- dense_rank函数
不会跳过之后的为此:1,1,1,2
- row_number函数
赋予唯一的连续位次:1,2,3,4
1,min()
拿到字段的最小值
语法:
select min(字段)
示例:
1,去除重复记录,只保留最小的记录
delete from titles_test
where id not in(
select * from (
select min(id)
from titles_test
group by emp_no
)as a
)
注意点:mysql中不允许在子查询的同时删除表数据(不能一边查,一边把表给删了)
2,replace()
replace函数中包含三个参数,第一个参数是某字段的名称,第二个参数是该字段的需要被修改的值,第三个参数为该字段修改后的值
示例:
update titles_test set
emp_no = replace(emp_no,10001,10005)
where id = 5
2,concat
字段连接
基本语法:
concat(column1,"连接字符",column2)
实例:
last_name和first_name,中间用'
update salaries as s join emp_bonus as e on s.emp_no = e.emp_no
set salary = salary*1.1
where to_date = '9999-01-01'
3,Trim
去空格
基本语法:
RTrim():去除字符串右端空格
LTrim():去除字符串左端空格
Trim():去除字符串两端的空格
Trim(column)
3,length,char_length
统计字符串或者字段长度
基本语法:
length("字符串")
length(columb_name)
- utf-8编码下,一个汉字算三个字符,数字和字母算一个字符
- 其他编码下,一个汉字算一个字符,数字和字母算一个字符
char_length("字符串")
char_length(column_name)
- 一个多字节符(例如,汉字)算作一个单字符
- 汉字,字母,数字都算是一个字符
- 任何编码下,多字节字符都算是一个字符
实例:
统计字符串:10,A,B中,
出现的次数
select (length("10,A,B")-length(replace("10,A,B",",","")))
as cnt
4,right,left,substr,substring
- right(str,n),从右开始分割,截取n位
- left(str,n),从左开始分割,截取n位
- substr(str,pos),从哪一位(pos)开始
- substr(str,pos,n),从哪一位(pos)开始,截取n位
实例:
取后几位排序
select first_name
from employees
order by substr(first_name,-2,2)
select first_name
from employees
order by right(first_name,2)
5,group_concat
group_concat() 函数将group by 产生的分组中的值连接起来,返回一个字符串结果。
group_concat([distinct]要连接的字段,[order by 排序字段 asc/desc][separator '分隔符'])
distinct去重
order by 排序
separator 默认逗号
实例:
select dept_no,group_concat(emp_no) as employees
from dept_emp group by dept_no
6,sum
sum求和
实例:
select (sum(salary)-max(salary)-min(salary))/(count(salary)-2) as avg_salary
from salaries
where to_date = '9999-01-01'
sum()over():
sum()over(order by column_name):求累计和/汇总 语句结构
实例:
求截止到指定日期前的员工工资总和
select s.emp_no,s.salary,(sum(s.salary) over (order by s.emp_no))as running_total
from salaries as s
where s.to_date = '9999-01-01'