MySQL-函数

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL-函数相关的知识,希望对你有一定的参考价值。

一、数据处理函数(单行处理函数)

单行处理函数的特点:一个输入对应一个输出

1、lower() 转换小写;标准SQL中函数 LCASE() 

select lower(ename) as ename from emp;

2、upper() 转换大写;标准SQL中函数 UCASE()

select upper(ename) as empname from emp;

3、substr() 取子串(substr( 被截取的字符串, 起始下标,截取的长度))

MID(字段,1,end) - 从某个文本字段提取字符,mysql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符,Oracle中使用

注:

起始下标从1开始,没有0

如下,查询用户表中第一个字母是'A'的用户

第一种方式:模糊查询

select username from user where username like 'A%';

第二种方式:substr函数 

select username from user where substr(username,1,1) = 'A';

首字母大写

//查询第一个字母大写的用户
select upper(substr(name,1,1)) from user;
//截取第一个字母之后的所有字符用户
select substr(name,2,length(name) - 1) from user;

//最终版:截取首字母转换为大写,拼接其他字符
select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as result from user;

4、concat() 字符串的拼接

select concat(empno,empname) from emp;

5、length() 长度;标准SQL中函数 LEN()

select length(ename) enamelength from emp;

6、trim() 去空格

select * from emp where ename = trim('   KING');

7、case..when..then..when..then..else..end

当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常

select 
    ename,
    job, 
    sal as oldsal,
    (case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal 
from 
    emp;

8、round() 四舍五入

select后面可以跟某个表的字段名(可以等同看做变量名),也可以跟字面量/字面值(数据)

select 'abc' from emp;
select 100 from emp;

上述SQL语句执行后,所有行全部输出'abc'字符串,100的值

select abc from emp;
ERROR 1054 (42S22): Unknown column 'abc' in 'field list'

注:

输入字符串时要注意带单引号 ' ',不然会报错;不带单引号的 abc 被当做一个字段的名字,去emp表中找abc字段去了

select round(1234.5678, 0) as result from emp; //保留整数位
select round(1234.5678, 1) as result from emp; //保留1个小数
select round(1234.5678, 2) as result from emp; //保留2个小数
select round(1234.5678, -1) as result from emp; //保留到十位

9、rand() 生成随机数

select round(rand()*100,0) from emp; // 100以内的随机数

10、ifnull() 将 null 转换成一个具体值

ifnull是空处理函数;专门处理空的

ifnull函数用法:ifnull(数据, 被当做哪个值)

如果“数据”为NULL的时候,把这个数据结构当做哪个值

如下,我们将工资sal 和奖金bonus相加时,bonus字段奖金为空,则相加结果就是空

经过ifnull()函数处理后,将bonus字段奖金处理为0

 注:

在所有数据库当中,NULL只要参与运算,最终结果一定是NULL

11、format() 数字格式化

格式化数字:

format(数字, '格式')

如下:显示千分符

select empname,format(sal,'¥999,999') as sal from emp;
mysql> select empname,format(sal,'¥999,999') as sal from emp;
+------------+--------+
| empname    | sal    |
+------------+--------+
| SHIWENFEI  | 4,000  |
| AWEN       | 9,000  |
| WANJIANHAO | 5,750  |
......

 12、str_to_date()        将字符串varchar类型转换成date类型

str_to_date('字符串日期', '日期格式')

如数据库中 birth 是 date类型

insert into t_user values(1,'zhangsan',str_to_date('1996-08-16','%Y-%m-%d'));

如果日期字符串是 %Y-%m-%d  这个格式,str_to_date函数可以省略

 insert into t_user values(1,'zhangsan','1992-06-18');

如果是其他格式字符串会报错

mysql> insert into t_user values(2,'lisi','18-02-1992');
ERROR 1292 (22007): Incorrect date value: '18-02-1992' for column 'birth' at row 1

 13、date_format()       将date类型转换成具有一定格式的varchar字符串类型

date_format(日期类型数据, '日期格式')

这个函数通常使用在查询日期方面,设置展示的日期格式

如下,date_format(birth,'%Y/%m/%d')

mysql> select id,name,date_format(birth,'%Y/%m/%d') as birth from t_user;
+------+----------+------------+
| id   | name     | birth      |
+------+----------+------------+
|    1 | zhangsan | 1992/06/18 |
|    2 | lisi     | 1996/08/16 |
+------+----------+------------+

如果直接查询,SQL语句实际上是进行了默认的日期格式化,自动将数据库中的date类型转换成varchar类型。并且采用的格式是mysql默认的日期格式:'%Y-%m-%d'

mysql> select id,name,birth from t_user;
+------+----------+------------+
| id   | name     | birth      |
+------+----------+------------+
|    1 | zhangsan | 1992-06-18 |
|    2 | lisi     | 1996-08-16 |
+------+----------+------------+

 14、TimeStampDiff()       计算两个日期的时间差

TimeStampDiff(间隔类型, 前一个日期, 后一个日期)

间隔类型:
		SECOND   秒,
		MINUTE   分钟,
		HOUR   小时,
		DAY   天,
		WEEK   星期
		MONTH   月,
		QUARTER   季度,
		YEAR   年

15、日期类型

date是短日期:只包括年月日信息。
datetime是长日期:包括年月日时分秒信息

mysql短日期默认格式:%Y-%m-%d
mysql长日期默认格式:%Y-%m-%d %h:%i:%s

insert into t_user values(1,'zhangsan','1992-06-18','2021-12-22 09:12:33');

在mysql当中获取系统当前时间
now() 函数,并且获取的时间带有:时分秒,是datetime类型的

 insert into t_user values(2,'lisi','1991-09-18',now());

二、分组函数(多行处理函数)

多行处理函数的特点:

输入多行,最终输出一行

注:

分组函数在使用的时候必须先进行分组,然后才能用

如果没有对数据进行分组,整张表默认为一组

1、max() 最大值

select max(sal) from emp;

2、min() 最小值

select min(sal) from emp;

3、sum() 求和

 select sum(sal) from emp;

4、avg() 平均值

 select avg(sal) from emp;

5、count()  行数

select count(*) from emp;
select count(empname) from emp;

注:

【1】分组函数自动忽略NULL,不需要对NULL进行处理

【2】 分组函数中count(*)和count(具体字段)区别

count(具体字段):表示统计该字段下所有不为NULL的元素的总数

count(*):统计表当中的总行数(只要有一行数据count则++)

每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的

【3】 分组函数不能够直接使用在where子句中

mysql> select empname,sal from emp where sal > min(sal);
ERROR 1111 (HY000): Invalid use of group function

分组函数在使用的时候必须先分组之后才能使用

where执行的时候,还没有分组;所以where后面不能出现分组函数

 select sum(sal) from emp; 

这个没有分组,sum()函数可以使用,是因为select在group by之后执行

【4】所有的分组函数可以组合在一起用

 select max(sal),min(sal),avg(sal),sum(sal),count(sal) from emp;

三、分组查询

1、分组查询语法(group by

select
    ...
from
    ...
group by
    ...

如果结合where条件语句和排序,如下:

select
    ...
from
    ...
where
    ...
group by
    ...
order by
    ...

以上关键字的执行顺序如下:
(1)from
(2)where
(3)group by
(4)select
(5)order by

2、分组函数不能够直接使用在where子句中

mysql> select empname,sal from emp where sal > min(sal);
ERROR 1111 (HY000): Invalid use of group function

分组函数在使用的时候必须先分组之后才能使用

where执行的时候,还没有分组;所以where后面不能出现分组函数

 select sum(sal) from emp; 

这个没有分组,sum()函数可以使用,是因为select在group by之后执行

3、在select语句中,如果有group by语句的话, select后面只能跟参加分组的字段,以及分组函数

如:按照工作岗位分组,求和

select job,sum(sal) from emp group by job;

以上这个语句先从emp表中查询数据;根据 'job' 字段进行分组;然后对每一组的数据进行求和sum(sal) 

 如果是以下语句,除了工作岗位还查询员工姓名

select empname,job,sum(sal) from emp group by job;

以上语句在mysql中可以执行,但是毫无意义(某个员工工资并不是该部门工资总和);以上语句在oracle中执行报错。oracle的语法比mysql严格

4、两个、多个字段联合分组

如:查询“每个部门,不同工作岗位”的最高薪资

select deptno,job,max(sal) from emp group by deptno,job;

将 ‘deptno’、‘job’ 两个字段联合成1个字段查询

5、having

having可以对分完组之后的数据进一步过滤

having不能单独使用,having不能代替where,having必须和group by联合使用

如:查询每个部门最高薪资,显示最高薪资>=15000

(1)使用having

 select deptno,max(sal) from emp group by deptno having max(sal)>=15000;

以上是先分组,然后查询最高工资>=15000的员工,这样导致效率变低,可以使用where优化

(2)使用where

 select deptno,max(sal) from emp where sal >= 15000 group by deptno;

相对来说,使用where效率更高一下,会优先过滤掉薪资>=15000的员工,然后在进行分组;而直接使用having 不管薪资是否>=15000,都会进行分组,导致效率变低

注:

where和having,优先选择where,where实在完成不了,再选择having

(3)只能使用having

如下:查询每个部门平均薪资,且平均薪资>=12500

select deptno,avg(sal) from emp group by deptno having avg(sal) >= 12500;

此时只能使用having,where后面不能跟分组函数(where执行的时候,还没有分组) avg(sal) >= 12500

四、单表查询执行顺序

单表查询,条件语句,分组,排序关键字顺序如下:

select 
    ...
from
    ...
where
    ...
group by
    ...
having
    ...
order by
    ...

以上关键字执行顺序如下,不能随意变换位置
(1)from
(2)where
(3)group by
(4)having
(5)select
(6)order by

从某张表中查询数据
先经过where条件筛选数据
对筛选后数据进行分组
分组之后可以使用having继续筛选
select查询出来
最后排序输出!

如:查询每个岗位的平均薪资,要求显示平均薪资>=7500,除 'MANAGER' 岗位之外,按照平均薪资降序

select 
    job,avg(sal) 
from 
    emp 
where 
    job <> 'manager' 
group by 
    job 
having 
    avg(sal) >= 7500 
order by 
    avg(sal) 
desc;

以上是关于MySQL-函数的主要内容,如果未能解决你的问题,请参考以下文章

mysql的decode函数

MySQL函数的其他函数

在mysql中自定义的函数怎么调用

关于mysql的PASSWORD函数

MySQL函数MySQL 5.5从零开始学第六章

Mysql单行函数