MySQL学习-排序与分组函数

操作的表
mysql> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 1980-12-17 800.00 NULL 20
7499 ALLEN SALESMAN 7698 1981-02-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-02-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-04-02 2975.00 NULL 20
7654 MARTIN SALESMAN 7698 1981-09-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-05-01 2850.00 NULL 30
7782 CLARK MANAGER 7839 1981-06-09 2450.00 NULL 10
7788 SCOTT ANALYST 7566 1987-04-19 3000.00 NULL 20
7839 KING PRESIDENT NULL 1981-11-17 5000.00 NULL 10
7844 TURNER SALESMAN 7698 1981-09-08 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-05-23 1100.00 NULL 20
7900 JAMES CLERK 7698 1981-12-03 950.00 NULL 30
7902 FORD ANALYST 7566 1981-12-03 3000.00 NULL 20
7934 MILLER CLERK 7782 1982-01-23 1300.00 NULL 10

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

排序(升序、降序)

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

select 
		ename,sal 
from 
		emp 
order by
		sal;
ename
sal
SMITH 800.00
JAMES 950.00
ADAMS 1100.00
WARD 1250.00
MARTIN 1250.00
MILLER 1300.00
TURNER 1500.00
ALLEN 1600.00
CLARK 2450.00
BLAKE 2850.00
JONES 2975.00
SCOTT 3000.00
FORD 3000.00
KING 5000.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;
ename sal
KING 5000.00
SCOTT 3000.00
FORD 3000.00
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
ALLEN 1600.00
TURNER 1500.00
MILLER 1300.00
WARD 1250.00
MARTIN 1250.00
ADAMS 1100.00
JAMES 950.00
SMITH 800.00
select ename,sal from emp ORDER BY sal desc,ename asc;
ename sal
KING 5000.00
FORD 3000.00
SCOTT 3000.00
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
ALLEN 1600.00
TURNER 1500.00
MILLER 1300.00
MARTIN 1250.00
WARD 1250.00
ADAMS 1100.00
JAMES 950.00
SMITH 800.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;
ename yearsal
SMITH NULL
ALLEN 22800.00
WARD 21000.00
JONES NULL
MARTIN 31800.00
BLAKE NULL
CLARK NULL
SCOTT NULL
KING NULL
TURNER 18000.00
ADAMS NULL
JAMES NULL
FORD NULL
MILLER NULL

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

select ename,ifnull(comm,0) as comm from emp;
ename comm
SMITH 0.00
ALLEN 300.00
WARD 500.00
JONES 0.00
MARTIN 1400.00
BLAKE 0.00
CLARK 0.00
SCOTT 0.00
KING 0.00
TURNER 0.00
ADAMS 0.00
JAMES 0.00
FORD 0.00
MILLER 0.00
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
ename yearsal
SMITH 9600.00
ALLEN 22800.00
WARD 21000.00
JONES 35700.00
MARTIN 31800.00
BLAKE 34200.00
CLARK 29400.00
SCOTT 36000.00
KING 60000.00
TURNER 18000.00
ADAMS 13200.00
JAMES 11400.00
FORD 36000.00
MILLER 15600.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;
ename sal
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
SCOTT 3000.00
KING 5000.00
FORD 3000.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)
14 29025.00 2073.214286 5000.00 800.00

你可能感兴趣的:(MySQL,数据库)