06 mysql 处理函数 聚合函数 分组函数

上节介绍了排序函数,这节介绍其他常用的函数,其实mysql中内置的函数有好多,有兴趣的或者想要深入掌握mysql可以查看文末的链接

1 处理函数

MySQL提供了一些函数可以对查询出的结果进行处理,处理函数是对每行数据进行处理的,可以放在select之后 where之前,也可以用在where子句中

下面介绍一些常用的数据处理函数

       1  处理字符串的函数:

lower(s)转换为小写

upper(s)转换为大写

substr(s, start, length)截取子串,从字符串 s 的 start 位置截取长度为 length 的子字符串

length(s)获取字段长度

trim(s)  去掉字符串 s 开始和结尾处的空格,注:MySQL存放数据时,默认去除字段后面的空格,原因是MySQL语法松散

ifnull(v1,v2)   如果 v1 的值不为 NULL,则返回 v1,否则返回 v2

示例:

--字符串处理函数部分
-- 查询员工编号,员工姓名的小写样式(起别名ename),工作
SELECT employeenumber,LOWER(employeename) AS ename,job FROM employee;
-- 查询员工编号,员工姓名的大写样式(起别名ename),工作
SELECT employeenumber,UPPER(employeename) AS ename,job FROM employee;

-- 查询员工编号,姓名,姓名中的第二个字符(别名secname) 
SELECT employeenumber,employeename,SUBSTR(employeename,2,1) secname FROM employee;
-- -- 查询员工姓名的第二个字符是'A'的员工的所有信息
SELECT * FROM employee WHERE SUBSTR(employeename,2,1)='A';

-- 查询员工编号,姓名,姓名的长度
SELECT employeenumber,employeename,LENGTH(employeename) FROM employee;

-- 查询员工中姓名等于 ' smith '去除前后空格后的字符串的员工信息
SELECT * FROM employee  WHERE TRIM(' smith ')=employeename;
-- 查询员工中工作是 ' manager '去除前后空格后的字符串的员工信息
SELECT * FROM employee WHERE job=TRIM(' manager ');

-- 查询员工编号,工作,薪水,补贴
SELECT employeenumber,job,salary,comm  FROM employee ;
-- 查询员工编号,工作,薪水,补贴(如果补贴不为null显示补贴,如果为null显示0)
SELECT employeenumber,job,salary,IFNULL(comm,0) FROM employee ;
-- 查询员工编号,工作,薪水+补贴 (起别名totalsalary) 注意:只要和null进行加减运算的结果都是null
SELECT employeenumber,job,salary+comm AS totalsalary  FROM employee ;
-- 查询员工编号,工作,薪水+补贴(补贴为null显示0,不为null显示本来的值)(起别名totalsalary) 
SELECT employeenumber,job,salary+IFNULL(comm,0)  totalsalary FROM employee;

        2  处理数字的函数:

round(数字,保留的小数位数) 四舍五入到要保留的小数点,如果第二个参数不写,默认舍入到整数位

rand()生成随机数,生成0到1之间的随机数,包括0和1两个数

示例:

-- 数值处理函数部分
-- 查询员工编号,员工工资(四舍五入保留1位小数)
SELECT employeenumber,ROUND(salary,1) FROM employee;
-- 生成0-1之间的随机数,包括0和1两个端点
SELECT RAND();
-- 生成0-100之间的随机数,包括0和100两个端点
SELECT ROUND(RAND()*100);
-- 生成0-100之间的整数,个数和employee表中数据条数一样多
SELECT ROUND(RAND()*100) FROM employee;

        3  处理日期类型的函数:

MySQL中日期作为查询条件时,可以使用字符串为其赋值,默认识别的常用格式有三种:

  • 2016-06-15
  • 2016/06/15
  • 20160615

str_to_date(‘日期字符串’,’日期格式’)字符串转日期,

其中日期格式如下:

  •       %Y 代表四位的年份
  •      %y 代表两位的年份
  •      %m 代表月,格式(01 … 12)
  •     %c 代表月,格式(1 … 12)
  •     %d 代表日
  •     %H 代表24小时制
  •     %h 代表12小时制
  •     %i 代表分种,格式(00 … 59)
  •    %S或%s 代表秒 , 格式(00..59)

date_format(d,f)格式化日期,按表达式 f的要求显示日期 d

示例:

-- 日期处理函数部分
-- 查询入职日期为1981-02-20的员工所有信息
SELECT * FROM employee WHERE hiredate='1981-02-20';
-- 查询入职日期字符串为'1981-20-02'的员工所有信息,先讲字符串转成date类型
SELECT * FROM employee WHERE hiredate=STR_TO_DATE('1981-20-02','%Y-%d-%m');
-- 查询员工编号,雇佣日期,将雇佣日期按指定格式显示(如这种格式12-02-1992)
SELECT employeenumber,hiredate,DATE_FORMAT(hiredate,'%d-%m-%Y') FROM employee;

       4   高级函数

CASE expression
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
   ...
    WHEN conditionN THEN resultN
    ELSE result
END

 CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。

示例:


-- 高级函数部分 查询员工姓名,工作,工资,当工作为namager时,工资*1.5倍,
-- 工作为salesman时,工资*0.5倍,其他员工的工资不变,起别名newsalary 
SELECT
  employeename,
  job,
  salary,
  CASE
    job
    WHEN 'manager'
    THEN salary * 1.5
    WHEN 'SALESMAN'
    THEN salary * 0.5
    ELSE salary
  END AS newsalary
FROM
  employee;

说明:这些函数中有些是MySQL特有的,在其他数据库管理系统中可能不起作用。

2 聚合函数

聚合函数主要是用来计算指定字段的值(某列(或者几列) 返回一个值 或者某组 返回多个值,和组数相对应)

聚合函数在计算时会自动忽略空值(null值),不用手动写sql将空值排除。如果使用+-*/等运算符时,遇到null值,运算结果也是null

聚合函数不能直接写在where语句中。

下面介绍常用的聚合函数:

sum(expression)返回指定字段的总和

-- 查询所有员工工资之和
  SELECT SUM(salary) FROM employee;
-- 查询所有员工的补贴之和,会自动忽略null值
  SELECT SUM(comm) FROM employee;
-- 查询所有员工的工资和补贴之和,这种计算方式不对,因为加号遇到null值为null,聚合函数会忽略掉这些null值
  SELECT SUM(salary+comm) FROM employee;
-- 查询所有员工的工资和补贴之和,如果补贴为null,按0计算
  SELECT SUM(salary+IFNULL(comm,0)) FROM employee;

avg(expression)返回一个表达式的平均值,expression 是一个字段

-- 查询所有员工的平均工资
  SELECT AVG(salary)  AS svasalary FROM employee;

max(expression)返回字段 expression 中的最大值

min(expression)返回字段 expression 中的最小值

说明:日期也可以使用max(),min()函数进行比较

 -- 查询所有员工工资中的最大工资
  SELECT MAX(salary) FROM employee;
-- 查询所有员工入职日期中最大的那个,离现在最近的那个
  SELECT MAX(hiredate) FROM employee;
-- 查询所有员工工资中的最大工资
  SELECT MIN(salary) FROM employee;
-- 查询所有员工入职日期中最小的那个,离现在最远的那个
  SELECT MIN(hiredate) FROM employee;

count(expression)返回查询的记录总数,expression 参数是一个字段或者 * 号

-- 统计员工个数
  SELECT COUNT(*) FROM employee;
--统计员工中补贴不为null的个数,因为聚合函数会忽略null值
  SELECT COUNT(comm) FROM employee;
-- 统计员工中补贴为null的个数
  SELECT COUNT(*) FROM employee WHERE comm IS NULL;
  --查询员工个数,最大薪水,最小薪水,平均薪水,和薪水之和
  SELECT COUNT(*) ,MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employee;

distinct去除重复记录

作用:将查询结果中某一字段的重复记录去除掉
用法:distinct 字段名或 distinct字段名1, 字段名2…
注意:distinct只能出现在所有字段最前面,后面如果有多个字段先按第一个字段去重,如果第一个字段中后面有不同的分类,再将他们依次列出来,多字段相当于多级分类,或者说将多个字段相同的记录去重,只保留一个

示例:

 -- 查询有哪些工作种类
 SELECT DISTINCT job FROM employee;
-- 查询工作岗位的个数
  SELECT COUNT(DISTINCT job) FROM employee;
-- 查询工作岗位的个数,和部门编号的个数
   SELECT COUNT(DISTINCT job) ,COUNT(DISTINCT departmentnumber) FROM employee;
-- 查询有哪些工作和这些工作岗位中员工姓名的第二个字符
  SELECT DISTINCT job ,SUBSTR(employeename,2,1) FROM employee;
-- 查询有哪些部门,哪些工作 去除掉部门和工作岗位都重复的记录
  SELECT DISTINCT departmentnumber,job FROM employee;
  

3 分组函数 group by

group by 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 count(),sum(),avg()等函数。

注:在有group by的DQL询句中,select语句后面只能跟 聚合函数 + 参与分组的字段

-- 根据工作分组,查询工作和该工作的最大工资
SELECT job,MAX(salary) FROM employee GROUP BY job;

-- 根据工作分组,查询工作和该工作的最大工资,按最大工资的升序排序
SELECT job,MAX(salary) maxsalary FROM employee GROUP BY job ORDER BY maxsalary;

--根据部门编号分组,查询部门编号,部门的平均工资
SELECT  departmentnumber,AVG(salary) FROM employee GROUP BY departmentnumber;

--根据部门编号和工作分组,查询部门编号,工作,和该部门该工作的平均工资
SELECT departmentnumber,job,AVG(salary) FROM employee GROUP BY departmentnumber,job;
-- 根据工作分组,查询工作和该工作的最大工资,过滤掉工作为'manager'的记录
SELECT job,MAX(salary) FROM employee WHERE job!='manager' GROUP BY job;

 having 过滤

如果想对分组的数据进行过滤,需要使用having子句

注:

1聚合函数不能放在where子句中

2能够在where后过滤的数据不要放到having中进行过滤,否则影响SQL询句的执行效率。

示例:

-- 按工作分组,查询工作和该工作的平均工资,并过滤掉平均工资小于等于2000的记录
SELECT job,AVG(salary)  AS avgsalary FROM employee GROUP BY job HAVING avgsalary>2000;
-- 过滤掉部门编号为10的记录,再按工作分组,查询工作和该工作的平均工资,过滤掉平均工资小于2000的记录,再根据平均工资按降序排列
SELECT job,AVG(salary) AS avgsalary FROM employee WHERE departmentnumber <> 10 GROUP BY job
HAVING avgsalary > 2000 ORDER BY avgsalary DESC;

where和having的区别:

  • where和having都是为了完成数据的过滤,它们后面都是添加条件;
  • where是在 group by之前完成过滤;
  • having是在group by之后完成过滤;

sql语句的顺序:

几个关键字的使用顺序依次为 where 、group by 、having、order by.

一个查询语句的格式为

select expression1,expression2,..  from 表名 where 过滤条件 group by expression having 过滤条件 order by expression;

1、 from 将硬盘上的表文件加载到内存

2、 where 将符合条件的数据行摘取出来,生成一张临时表

3、 group by 根据列中的数据种类,将当前临时表划分成若干个新的临时表

4、 having 可以过滤掉group by生成的不符合条件的临时表

5、 select 对当前表进行整列读取

6、 order by 对select生成的临时表,进行重新排序,生成新的临时表

7、 limit 对最终生成的临时表的数据行进行截取
 

参考:小猴子视频

       http://www.monkey1024.com/database/816

处理函数参考链接:http://www.runoob.com/mysql/mysql-functions.html

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84893413