MySQL学习-排序与分组函数

操作的表
mysql> select * from emp;

EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7369SMITHCLERK79021980-12-17800.00NULL20
7499ALLENSALESMAN76981981-02-201600.00300.0030
7521WARDSALESMAN76981981-02-221250.00500.0030
7566JONESMANAGER78391981-04-022975.00NULL20
7654MARTINSALESMAN76981981-09-281250.001400.0030
7698BLAKEMANAGER78391981-05-012850.00NULL30
7782CLARKMANAGER78391981-06-092450.00NULL10
7788SCOTTANALYST75661987-04-193000.00NULL20
7839KINGPRESIDENTNULL1981-11-175000.00NULL10
7844TURNERSALESMAN76981981-09-081500.000.0030
7876ADAMSCLERK77881987-05-231100.00NULL20
7900JAMESCLERK76981981-12-03950.00NULL30
7902FORDANALYST75661981-12-033000.00NULL20
7934MILLERCLERK77821982-01-231300.00NULL10

其每个字段的字段名分别为员工编号、员工姓名、员工职位、员工上级领导编号、员工雇佣日期,员工薪水、员工津贴、员工部门编号。

排序(升序、降序)

按照工资升序,找出员工名和薪资?

select 
		ename,sal 
from 
		emp 
order by
		sal;
ename
sal
SMITH800.00
JAMES950.00
ADAMS1100.00
WARD1250.00
MARTIN1250.00
MILLER1300.00
TURNER1500.00
ALLEN1600.00
CLARK2450.00
BLAKE2850.00
JONES2975.00
SCOTT3000.00
FORD3000.00
KING5000.00

注意:默认是升序。怎么指定升序或者降序呢?asc表示升序,desc表示降序。

select ename , sal from emp order by sal; // 升序
select ename , sal from emp order by sal asc; // 升序
select ename , sal from emp order by sal desc; // 降序。

按照工资的降序排列,当工资相同的时候再按照名字的升序排列。

select ename,sal from emp ORDER BY sal desc;
enamesal
KING5000.00
SCOTT3000.00
FORD3000.00
JONES2975.00
BLAKE2850.00
CLARK2450.00
ALLEN1600.00
TURNER1500.00
MILLER1300.00
WARD1250.00
MARTIN1250.00
ADAMS1100.00
JAMES950.00
SMITH800.00
select ename,sal from emp ORDER BY sal desc,ename asc;
enamesal
KING5000.00
FORD3000.00
SCOTT3000.00
JONES2975.00
BLAKE2850.00
CLARK2450.00
ALLEN1600.00
TURNER1500.00
MILLER1300.00
MARTIN1250.00
WARD1250.00
ADAMS1100.00
JAMES950.00
SMITH800.00

注意:多个字段同时排序的原理:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段

select ename,sal from emp order by 2;

2代表第2列。

by后面跟数字时表示第几列。
找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。

select 
		ename,job,sal					3
	from
		emp							1
	where 
		job = 'SALESMAN'				2
	order by
		sal desc;							4

order by是最后执行的

select 
		字段						3
	from
		表名						1
	where
		条件						2
	order by
		....						4
	
	order by是最后执行的。

分组函数

分组函数?
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
记住:所有的分组函数都是对“某一组”数据进行操作的。

找出工资总和?

select sum(sal) from emp;

找出最高工资?

select max(sal) from emp;

找出最低工资?

select min(sal) from emp;
min(sal)
800.00

找出平均工资?

select avg(sal) from emp;

找出总人数?

select count(*) from emp;
select count(ename) from emp;
count(*)
14

分组函数一共5个。
分组函数还有另一个名字:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。

分组函数自动忽略NULL。

select count(comm) from emp;
count(comm)
4
select sum(comm) from emp;
sum(comm)
2200.00

单行处理函数:输入一行,输出一行
计算每个员工的年薪?

select ename,(sal+comm)*12 as yearsal from emp;
enameyearsal
SMITHNULL
ALLEN22800.00
WARD21000.00
JONESNULL
MARTIN31800.00
BLAKENULL
CLARKNULL
SCOTTNULL
KINGNULL
TURNER18000.00
ADAMSNULL
JAMESNULL
FORDNULL
MILLERNULL

Smith的年薪为空,因为smith的comm为空,而数据库中有一个规定,只要数据表达式中有NULL出现,最终结果都是NULL。
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL
ifnull() 空处理函数?
ifnull(可能为NULL的数据,被当做什么来处理):属于单行处理函数

select ename,ifnull(comm,0) as comm from emp;
enamecomm
SMITH0.00
ALLEN300.00
WARD500.00
JONES0.00
MARTIN1400.00
BLAKE0.00
CLARK0.00
SCOTT0.00
KING0.00
TURNER0.00
ADAMS0.00
JAMES0.00
FORD0.00
MILLER0.00
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
enameyearsal
SMITH9600.00
ALLEN22800.00
WARD21000.00
JONES35700.00
MARTIN31800.00
BLAKE34200.00
CLARK29400.00
SCOTT36000.00
KING60000.00
TURNER18000.00
ADAMS13200.00
JAMES11400.00
FORD36000.00
MILLER15600.00

select sum(comm) from emp;

sum(comm)
2200.00
select sum(comm) from emp where comm is not null; 

不需要额外添加这个过滤条件。sum函数自动忽略NULL。
count也忽略了null
分组函数都可以直接忽略null

找出工资高于平均工资的员工?

select ename,sal from emp where sal>avg(sal);

[SQL]select ename,sal from emp where sal>avg(sal);报错[Err] 1111 - Invalid use of group function思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why???
因为group by是在where执行之后才会执行的。(如果没有写group by也会自成一组,相当于有一个缺省的group by语句)

select		5
					..			
				from			1
					..
				where			2
					..
				group by		3
					..
				having		4
					..
				order by		6

找出工资高于平均工资的员工?
第一步:找出平均工资

select avg(sal) from emp;
avg(sal)
2073.214286

第二步:找出高于平均工资的员工

select ename,sal from emp where sal > 2073.214286;
enamesal
JONES2975.00
BLAKE2850.00
CLARK2450.00
SCOTT3000.00
KING5000.00
FORD3000.00

两条语句拼接到一起,select语句中嵌套select语句是子查询
select ename,sal from emp where sal > (select avg(sal) from emp);

count()和count(具体的某个字段),他们有什么区别?
  count(
):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
  count(comm): 表示统计comm字段中不为NULL的数据总数量。

select count(*) from emp;	//输出14
select count(comm) from emp;		//输出4

分组函数也能组合起来用

select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
count(*)sum(sal)avg(sal)max(sal)min(sal)
1429025.002073.2142865000.00800.00
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值