操作的表
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