单行处理函数的特点:一个输入对应一个输出
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;