MySQL函数学习

article/2025/10/20 0:53:36

目录

一、日期函数:

二、字符串函数学习

三、窗口函数

1.序号函数

​2.开窗聚合函数

​2.分布函数

3.前后函数

4.头尾函数

5.其他函数


一、日期函数:

1.日期、时间获取:

  • select curdate();#当前日期;

        

  • select current_date(); #当前日期,不常用;

        

  • select curtime();#当前时间;

        

  • select current_time();#当前时间,不常用;

        

  • select now();#当前日期时间

        

  • select current_timestamp();#当前日期时间

        

  • select localtime();#当前日期时间;

        

  • select sysdate();#系统日期时间;

        

  • select unix_timestamp(now()); #获取指定日期的时间戳;

        

  • select from_unixtime()#获取unix时间戳的日期值;

        

2.年、季度、月、周、日、工作日、时、分、秒、获取

  • select year(now());#获取年;

        

  • select quarter(now());#获取季度;

        

  • select month(now()); #获取数值月份;

        

  • select monthname(now());#获取英文月份;

        

  • select day(now());  #获取天;

        

  • select dayofyear(now());#获取当天是当年的第几天;

        

  • select dayofmonth(now());#获取当天是当月的第几天;

        

  • select dayofweek(now());#获取当天是当周的第几天;返回数字1~7之间,返回1代表星期天,返回2代表星期一,以此类推;

        

  • select dayname(now());#获取当天是星期几;

        

  • select week(now());  #返回当天是当年的第几周;

        

  • select weekday(now());#获取当天是当周的第几天,返回数字0~6之间,返回0代表星期一,返回1代表星期二,以此类推;

        

  • select hour(now());#获取当前时间;

        

  • select minute(now());#获取当前时间分钟;

        

  • select second(now());#获取当前时间秒;

        

3.还可以使用下面函数实现年月日时分秒的获取:
 

select extract(year from now()) 年,extract(month from now()) 月,extract(day from now())  日,extract(hour from now()) 时,extract(minute from now())  分,extract(second from now())  秒;


                              
4.计算日期与时间函数:

  • select to_days(now());#从0000年01月01日开始到指定日期相隔天数;

        

  • select from_days(734993);#从0000年01月01日开始多少天后的对应日期;

        

  • select datediff(now(),'2022-01-01')#两日期相隔天数

        

5.指定日期前后时间计算

  • select adddate(now(),5);#获取指定日期n天后的日期;

        

  • select subdate(now(),5);#获取指定日期n天前的日期;

        

  • select addtime(now(),5);#获取指定日期n秒后的日期;

        

  • select subtime(now(),5);#获取指定日期n秒前的日期;

        

  • 扩展:
  • select adddate(curdate(),interval '2,3' year_month);#返回距今2年3个月后的日期;

        

  • select adddate(curdate(),interval '1' month);#返回1个月后的日期;

        

  • select adddate(curtime(),interval '1,10' hour_minute);#返回1小时10分钟后的时间;

        

  • select adddate(curtime(),interval '1' month);#返回1分钟后的时间;

        

6.date_format函数使用:

  • SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')

        

  • SELECT DATE_FORMAT(NOW(),'%Y-%m-%d')

        

  • SELECT DATE_FORMAT(NOW(),'%Y%m%d')

          

二、字符串函数学习


1.合并字符串:concat(),concat_ws();

  • select concat('My','SQL');  #合并字符串

       

  • select concat('My','SQL',null);#参数中如果有null值,则合并后也是null值;

  • select concat(year(curdate()),'-',month(curdate()),'-',day(curdate()));  

  • select concat_ws('-',year(curdate()),month(curdate()),day(curdate())); #带分隔符的合并函数

        

2.比较字符串:strcmp();

  • select strcmp('abc','abd'),strcmp('abc','abc'),strcmp('abd','abc');

        

#由于abc小于abd,返回-1;abc等于abc,返回0;abd大于abc,返回1.

3.获取字符串长度:length(),char_length();

  • select length('zhangxueyou'),length('张学友');#英文字符占一个字节,中文字符占两个字节;length获取的是字符串占用字节的长度;

  • select char_length('zhangxueyou'),char_length('张学友');#char_length获取的是本身字符串个数;

4.字符串大小写转换:所有字母转化成大写:upper()与ucase(),所有字母转化成小写:lower()与lcase();

  • select 'mysql',upper('mysql'),ucase('mysql');

  • select 'MYSQL',lower('MYSQL'),lcase('MYSQL');

5.返回字符串位置函数:find_in_set(str1,str2):返回str1在str2中的位置;

  • select find_in_set('mysql','mysql,sql server,db2');

6.返回指定字符串位置函数:field(str,str1,str2):返回除str外第一个与str匹配的字符串的位置;

  • select field('zhang','ming','yan','zhang');

7.返回子字符串想匹配的开始位置:locate(),position(),instr()
(1)locate(str1,str2)
(2)position(str1 in str2)
(3)instr(str,str1)

  • select locate('sql','mysql'),position('sql' in 'mysql'),instr('mysql','sql');

8.返回指定位置的字符串的ELT()函数:ELT(n,str1,str2)

  • select ELT(1,'zhang','xue','yan');

9.从左边或者右边截取字符串left(),right()

  • select left('zhangmingyan',5),right('zhangmingyan',3);

10.截取指定位置和长度的字符串:substring(str,num,len),mid(str,num,len)

  • select substring('zhangmingyan',6,4),mid('zhangmingyan',6,4);

     

11.去除字符串开始处空格:ltrim()

  • select char_length('  zhangmingyan'),char_length(ltrim('  zhangmingyan'));

12.去除字符串结尾出空格:rtrim()

  • select char_length('zhangmingyan  '),char_length(rtrim('zhangmingyan  '));

13.去除字符串首位空格:trim()

  • select char_length('  zhangmingyan  '),char_length(trim('  zhangmingyan  '));

14.替换字符串replace(原字符串,子字符串,新字符串),insert(原字符串,替换位置,替换长度,新字符串)

  • select insert('zhangmingyan1197',13,4,'23');

  • select replace('zhangmingyan1197','1197','23');

    三、窗口函数

    建表语句:

  • create table employee
    (dname    varchar(20) comment '部门名',eid      varchar(20) comment '员工id',ename    varchar(20) comment '员工姓名',hiredate date comment '入职日期',salary   double comment '薪资'
    );insert into employee
    values ('研发部', '1001', '刘备', '2021-11-01', 3000);
    insert into employee
    values ('研发部', '1002', '关羽', '2021-11-02', 5000);
    insert into employee
    values ('研发部', '1003', '张飞', '2021-11-03', 7000);
    insert into employee
    values ('研发部', '1004', '赵云', '2021-11-04', 7000);
    insert into employee
    values ('研发部', '1005', '马超', '2021-11-05', 4000);
    insert into employee
    values ('研发部', '1006', '黄忠', '2021-11-06', 4000);
    insert into employee
    values ('销售部', '1007', '曹操', '2021-11-01', 2000);
    insert into employee
    values ('销售部', '1008', '许褚', '2021-11-02', 3000);
    insert into employee
    values ('销售部', '1009', '典韦', '2021-11-03', 5000);
    insert into employee
    values ('销售部', '1010', '张辽', '2021-11-04', 6000);
    insert into employee
    values ('销售部', '1011', '徐晃', '2021-11-05', 9000);
    insert into employee
    values ('销售部', '1012', '曹洪', '2021-11-06', 6000);

    窗口函数学习:

  • /**语法结构:window_function ( expr ) OVER (PARTITION BY ...ORDER BY ...frame_clause)

    其中,window_function 是窗口函数的名称;expr 是参数,有些函数不需要参数;OVER子句包含三个选项:
    分区(PARTITION BY)
    PARTITION BY选项用于将数据行拆分成多个分区(组),它的作用类似于GROUP BY分组。如果省略了 PARTITION BY,所有的数据作为一个组进行计算
    排序(ORDER BY)
    OVER 子句中的ORDER BY选项用于指定分区内的排序方式,与 ORDER BY 子句的作用类似
    以及窗口大小(frame_clause)。
    frame_clause选项用于在当前分区内指定一个计算窗口,也就是一个与当前行相关的数据子集。

  1.序号函数


    序号函数有三个:ROW_NUMBER()、RANK()、DENSE_RANK(),可以用来实现分组排序,并添加序号。
    打序号方式不一样
  row_number()|rank()|dense_rank() over (
  partition by ...
  order by ...
  )
 */

  • 对每个部门的员工按照薪资降序排序,并给出排名
select dname,ename,salary,# 窗口函数执行完,会多出一列# row_number:同薪资按序号排名,序号连续row_number() over (partition by dname order by salary desc) as rowNumber,# rank:同薪资序号相同,下一薪资序号隔断,序号不连续rank() over (partition by dname order by salary desc)       as ranks,# dense_rank:同薪资序号相同,序号连续dense_rank() over (partition by dname order by salary desc) as denseRank
from employee;

  • 求出每个部门薪资排在前三名的员工(分组求TopN问题)
select *
from (select dname,ename,salary,dense_rank() over (partition by dname order by salary desc ) as denseRankfrom employee) as dr
where dr.denseRank <= 3;

 

  • 对所有员工进行全局排序(不分组),不加partition by表示全局排序
select dname,ename,salary,rank() over (order by salary desc ) as dr
from employee;


2.开窗聚合函数

 
/**
  开窗聚合函数-sum,avg,min,max,count
  在窗口中每条记录动态地应用聚合函数(sum()、avg()、max()、min()、count()),
  可以动态计算在指定的窗口内的各种聚合函数值。
 */

  • select dname,ename,hiredate,salary,# 从第一个值开始累加到当前行(包含当前行)sum(salary) over (partition by dname order by hiredate) as sum
    from employee;

 

  • select dname,ename,hiredate,salary,# 没有order by,默认把分组内所有的数据进行sum操作sum(salary) over (partition by dname) as sum
    from employee;

# 指定范围

  • select dname,ename,hiredate,salary,sum(salary) over (partition by dname order by hiredate# 从第一行到当前行# unbounded preceding:第一行# current row:当前行# 不写默认此操作rows between unbounded preceding and current row) as sum
    from employee;

 

  • select dname,ename,hiredate,salary,sum(salary) over (partition by dname order by hiredate# 从当前行开始,累加向上3行(不包含当前行)到当前行rows between 3 preceding and current row) as sum
    from employee;

  • select dname,ename,hiredate,salary,sum(salary) over (partition by dname order by hiredate# 从当前行开始,累加向上3行到向下1行rows between 3 preceding and 1 following) as sum
    from employee;

 

  • select dname,ename,hiredate,salary,sum(salary) over (partition by dname order by hiredate# 从当前行开始,累加到最后1行rows between current row and unbounded following) as sum
    from employee;


2.分布函数


# 分布函数-cume_dist和percent_rank
# cume_dist用途:分组内小于、等于当前rank值的行数 / 分组内总行数

  • 查询小于等于当前薪资(salary)的比例
select dname,ename,hiredate,salary,cume_dist() over (order by salary)                    rn1,cume_dist() over (partition by dname order by salary) rn2
from employee;

/*
rn1: 没有partition,所有数据均为1组,总行数为12,
     第一行:小于等于3000的行数为3,因此,3/12=0.25
     第二行:小于等于4000的行数为5,因此,5/12=0.4166666666666667
rn2: 按照部门分组,dname='研发部'的行数为6,
     第一行:研发部小于等于3000的行数为1,因此,1/6=0.16666666666666666
*/

-- percent_rank
/*
  用途:每行按照公式(rank - 1) / (rows - 1)进行计算。
  其中,rank为rank()函数产生的序号,rows为当前窗口的记录总行数
  应用场景:不常用
*/

select dname,ename,hiredate,salary,rank() over (partition by dname order by salary desc)         rn,percent_rank() over (partition by dname order by salary desc) pr
from employee;

/*
 rn2:
  第一行: (1 - 1) / (6 - 1) = 0
  第二行: (1 - 1) / (6 - 1) = 0
  第三行: (3 - 1) / (6 - 1) = 0.4
*/

3.前后函数


# 前后函数-lag和lead
# 返回位于当前行的前n行(lag(expr, n))或后n行(lead(expr, n))的expr的值
# 应用场景:查询前1名同学的成绩和当前同学成绩的差值

  • lag
select dname,ename,hiredate,salary,lag(hiredate, 1, '2000-01-01') over (partition by dname order by hiredate) as last_1_time,lag(hiredate, 2) over (partition by dname order by hiredate)               as last_2_time
from employee;

 

/*
last_1_time: 指定了往上第1行的值,default为'2000-01-01'
                         第一行,往上1行为null,因此取默认值 '2000-01-01'
                         第二行,往上1行值为第一行值,2021-11-01
                         第三行,往上1行值为第二行值,2021-11-02
last_2_time: 指定了往上第2行的值,为指定默认值
                         第一行,往上2行为null
                         第二行,往上2行为null
                         第四行,往上2行为第二行值,2021-11-01
                         第七行,往上2行为第五行值,2021-11-02
*/

  • lead
select dname,ename,hiredate,salary,lead(hiredate, 1, '2000-01-01') over (partition by dname order by hiredate) as last_1_time,lead(hiredate, 2) over (partition by dname order by hiredate)               as last_2_time
from employee;

4.头尾函数

 
# 头尾函数-first_value和last_value
# 用途:截止到当前,返回第一个(first_value(expr))或最后一个(last_value(expr))expr的值
# 应用场景:截止到当前,按照日期排序查询第1个入职和最后1个入职员工的薪资

  • 注意,如果不指定order by,则进行排序混乱,会出现错误的结果
select dname,ename,hiredate,salary,first_value(salary) over (partition by dname order by hiredate) as first,last_value(salary) over (partition by dname order by hiredate)  as last
from employee;

5.其他函数


# nth_value(expr, n)
# 用途:返回窗口中第n个expr的值。expr可以是表达式,也可以是列名
# 应用场景:截止到当前薪资,显示每个员工的薪资中排名第2或者第3的薪资

  • 查询每个部门截止目前薪资排在第二和第三的员工信息
select dname,ename,hiredate,salary,nth_value(salary, 2) over (partition by dname order by hiredate) as second,nth_value(salary, 3) over (partition by dname order by hiredate) as third
from employee;

 

 # ntile(n)
# 用途:将分区中的有序数据分为n个等级,记录等级数
# 应用场景:将每个部门员工按照入职日期分成3组

  • 根据入职日期将每个部门的员工分成3组
select dname,ename,hiredate,salary,ntile(3) over (partition by dname order by hiredate ) as nt
from employee;

  • -取出每个部门的第一组员工
select *
from (select dname,ename,hiredate,salary,ntile(3) over (partition by dname order by hiredate ) as rnfrom employee) t
where t.rn = 1;

with t as(select dname,ename,hiredate,salary,ntile(3) over (partition by dname order by hiredate ) as rnfrom employee)
select *
from t
where t.rn = 1;


http://chatgpt.dhexx.cn/article/olXu24mg.shtml

相关文章

MySQL函数运用

目录 一&#xff0c;函数的定义 二&#xff0c;常用函数 三&#xff0c;字符串函数 四&#xff0c; 数学函数 五&#xff0c;判断函数 六、合并(union) 一&#xff0c;函数的定义 1.类似Java定义方法 2.可以带参数 3.必须有返回值(一行一列) &#xff0c;重点&#xff1a;ja…

MYSQL 函数

1.IF(Condition,A,B)Condition 为true 返回A 否则返回B 2.IFNULL(fieldA,fieldB)当字段fieldA是NULL时取fieldB&#xff0c;不是NULL时取fieldA的值nullif(exp1,exp2)如果exp1与exp2相等&#xff0c;则返回null&#xff0c;否则返回exp1 3.GROUP_CONCAT()该函数是将多条结果集变…

MySQL函数的使用

ABS(X) :返回x的绝对值 MOD(N,M):表示%,返回N被M除的余数 floor(X) :返回不大于X的最大整数值&#xff0c;向下取整 round(X) :四舍五入取整 distinct:distinct用于返回唯一不同的值。目的是去重 ifNull(X,Y)&#xff1a;查询时判断X是否为空,为空则使用默认值Y group_concat(X…

MySQL常用函数

MySQL常用函数 一、数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制&#xff08;OCT返回八进制&#xff0c;HEX返回十六进制&#xff09;CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e&#xff08;自然对数的底&#xff09;的x次方FLOOR(x) 返回小于x的最大整数…

JKD动态代理

一、说明 在Java的动态代理机制中&#xff0c;有两个重要的类和接口&#xff0c;一个是InvoInvocationHandler&#xff08;接口&#xff09;、Proxy&#xff08;类&#xff09;&#xff0c;这一个类和接口是我们动态代理所必须用到的。 优点&#xff1a; 对于实现了接口的类&…

JDO

如何用JDO开发数据库应用 &#xff08;本文的版权属作者本人&#xff0c;欢迎转载&#xff0c;但必须注明出处和原作者&#xff09; 本文将介绍如何使用Sun公司的最新《Java Data Objects 》规范来进行基于数据库的简单应用程序的开发&#xff0c;从而使读者对JDO有一个直接的感…

亲测Linux服务器安装JKD操作流程

下载地址&#xff1a; 链接: https://pan.baidu.com/s/14aOlotFFQy6KQ05T1t2iyw 提取码: 67t4 青华大学&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/ 1.添加Linux命令&#xff08;默认没有上传命令&#xff09; yum install lrzsz 2.查看JKD是…

J D B C

文章目录 前言一、jdbc是什么&#xff1f;二、使用步骤三、sql注入三、封装四、ORM(object rational mapping)五、日期类六&#xff0c;事务七&#xff0c;三层架构八&#xff0c;连接池 前言 一、jdbc是什么&#xff1f; JDBC&#xff08;Java DataBase Connectivity,java数…

jkd环境配置

这里写目录标题 1.下载jdk2. 安装jdk3.配置环境4.验证 1.下载jdk https://www.oracle.com/java/technologies/javase-jdk16-downloads.html&#xff08;下载链接&#xff09; 2. 安装jdk 只需要自定义安装路径&#xff0c;其余不动 3.配置环境 我的电脑&#xff08;右键&a…

JKD+Tomcat+Eclipse基础配置

目录 一、JDK环境变量配置&#xff1a;java&#xff08;jdk需安装&#xff0c;根据向导安装&#xff0c;无需修改&#xff09; 二、检查是否配置成功: 三、Tomcat环境变量配置&#xff1a;java&#xff08;jdk需安装&#xff09;和Tomcat&#xff08;需解压&#xff09; 四、…

Linux之jkd、tomcat、mysql安装

目录 一、安装JDK1、将jdk解压到/opt下2、配置环境变量1&#xff09;vi /etc/profile2&#xff09;在最后面配置JDK环境变量3&#xff09;设置环境变量生效4&#xff09;检查JDK环境变量 二、安装Tomcat1.解压Tomcat2.配置环境变量1&#xff09;vi /etc/profile2&#xff09;在…

在java中jkd中文意思_Java JDK是什么意思?有什么作用?

下面我们介绍&#xff0c;Windows7 和 Windows10下载安装JDK与JDK环境配置的方法。 (1)下载JDK(获取【JDK8、11、15全系列版本】【Java高级程序员学习路线图】【0基础Java视频资料】加播妞 &#xff1a;2217622915) https://www.oracle.com/technetwork/java/javase/overview/i…

在Linux中安装JKD(详细教学)

一&#xff0c;首先在官网下载Linux版JKD 官网&#xff1a;Oracle | Cloud Applications and Cloud Platform 二&#xff0c;通过xftp上传工具将jdk上传到linux中 三&#xff0c;将JKD解压到指定文件夹 linux命令&#xff1a; tar -xvf 压缩包名称.tar.gz -C /usr/lib/jvm …

jkd的安装与配置

jkd的安装与配置 下载JDK 下载地址,点击进入: www.oracle.com/technetwork/java/javase/downloads/index.html下载JDK——进入下载主页 点击下载JDK,会出现图1-9所示的下载列表界面。首先,点击”Accept License Agreement”,然后选择对应的版本,下载即可。 下载JDK——…

Java学习第一天:jkd安装、环境变量配置和第一个程序

第一天笔记 jdk的安装 下载jdk jdk是Java开发环境。其中包括了Java编译器、Java运行工具、Java生成文档工具、Java打包工具等。Java开发环境中自带了一个Java运行环境运行工具JRE。因此&#xff0c;安装过程中不需要安装JRE了。 到Oracle官网中下载&#xff0c;甲骨文官网地址…

java getopt_sys.argv和getopt.getopt()的用法

Python中sys.argv是命令行参数从程序外部传值的的一种途径&#xff0c;它是一个列表&#xff0c;列表元素是我们想传进去的的新参数&#xff0c;所以可以用索引sys.argv[]来获得想要的值。因为一个写好的程序一般封装好了&#xff0c;直接在编辑软件里运行就行了&#xff0c;但…

命令行参数解析函数 getopt、getopt_long

getopt 函数在头文件 <unistd.h> 中&#xff0c;它可以解析我们传入的命令行参数。 可以实现类似 gcc -o 、rm -rf 等命令。 man 3 getopt 。在线版&#xff1a;http://man.he.net/?topicgetopt&section3 #include <unistd.h>int getopt(int argc, char * co…

C/C++ 命令解析:getopt 方法详解和使用示例

一、简介 getopt() 方法是用来分析命令行参数的&#xff0c;该方法由 Unix 标准库提供&#xff0c;包含在 <unistd.h> 头文件中。 二、定义 int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg; extern int optind, opterr, optop…

*args和**kwargs

*args和**kwargs的区别 首先*args和**kwargs的区别主要是*和**的区别&#xff0c;与变量名args和kwargs无关&#xff0c;也可以命名成*cat和**dog&#xff1b;*args接收不带变量名的变量&#xff0c;**kwargs接收带变量名的变量。*args和**kwargs可以共同使用&#xff0c;但是顺…

python中argparse模块关于 parse_args() 函数详解(全)

目录 前言1. 函数讲解2. 基本用法3. 实战讲解 前言 原理&#xff1a;命令行解析使用argparse包作用&#xff1a;命令行传参赋值 可用在机器学习深度学习 或者 脚本运行等 了解这个函数需要了解其背后的原理以及具体参数 1. 函数讲解 在深度学习模型框架中几乎都有的模块 浓…