mysql-210711-03

mysql-210711-03

  • SQL执行顺序
  • 排序(升序,降序)
  • 分组函数
  • 单行处理函数
  • 单行处理函数
  • 分组查询

SQL执行顺序

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

排序(升序,降序)

默认是升序
asc	   表示升序
desc   表示降序
案例1
// 按照工资升序
// 默认是升序
mysql> select empno,ename,sal from emp order by sal;
mysql> select empno,ename,sal from emp order by sal asc;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7369 | SMITH  |  800.00 |
|  7900 | JAMES  |  950.00 |
|  7788 | SCOTT  | 3000.00 |
|  7902 | FORD   | 3000.00 |
|  7839 | KING   | 5000.00 |
+-------+--------+---------+


// 按照工资降序
mysql> select empno,ename,sal from emp order by sal desc;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7839 | KING   | 5000.00 |
|  7788 | SCOTT  | 3000.00 |
|  7654 | MARTIN | 1250.00 |
|  7876 | ADAMS  | 1100.00 |
|  7900 | JAMES  |  950.00 |
|  7369 | SMITH  |  800.00 |
+-------+--------+---------+
案例2
// 按照 工资的降序 排列,当工资相同的时候再按照 名字的升序 排列
// 越靠前的字段越能起到主导作用,只有前面的字段无法完成排序的时候,才会启用后面的字段
// 后面的字段可能就用不上
mysql> select empno,ename,sal from emp order by sal desc,ename asc;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7839 | KING   | 5000.00 |
|  7902 | FORD   | 3000.00 |
|  7788 | SCOTT  | 3000.00 |
|  7566 | JONES  | 2975.00 |
|  7698 | BLAKE  | 2850.00 |
|  7782 | CLARK  | 2450.00 |
|  7499 | ALLEN  | 1600.00 |
|  7844 | TURNER | 1500.00 |
|  7934 | MILLER | 1300.00 |
|  7654 | MARTIN | 1250.00 |
|  7521 | WARD   | 1250.00 |
|  7876 | ADAMS  | 1100.00 |
|  7900 | JAMES  |  950.00 |
|  7369 | SMITH  |  800.00 |
+-------+--------+---------+
案例3
// 查询工作岗位是salesman的员工,并且要求按照薪资的降序排序
select 
	empno,ename,job,sal 
from 
	emp 
where 
	job='salesman' 
order by 
	sal desc ;
+-------+--------+----------+---------+
| empno | ename  | job      | sal     |
+-------+--------+----------+---------+
|  7499 | ALLEN  | SALESMAN | 1600.00 |
|  7844 | TURNER | SALESMAN | 1500.00 |
|  7521 | WARD   | SALESMAN | 1250.00 |
|  7654 | MARTIN | SALESMAN | 1250.00 |
+-------+--------+----------+---------+
排序理解案例
顺序:↓↓↓↓↓↓↓↓↓↓↓

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




mysql> select ename,sal as '工资' from emp order by "工资";   // 错误,能查出来,但是排不了序,可能出现了中文字段
mysql> select ename,sal as salary from emp order by salary;	 // 正确
+--------+---------+
| ename  | salary  |
+--------+---------+
| SMITH  |  800.00 |
| JAMES  |  950.00 |
| ADAMS  | 1100.00 |
| WARD   | 1250.00 |
| JONES  | 2975.00 |
| FORD   | 3000.00 |
| KING   | 5000.00 |
+--------+---------+
可以使用字段的位置进行排序
// 此时的 3 就代表 sal
mysql> select empno,ename,sal from emp order by 3;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7369 | SMITH  |  800.00 |
|  7900 | JAMES  |  950.00 |
|  7876 | ADAMS  | 1100.00 |
|  7521 | WARD   | 1250.00 |
|  7934 | MILLER | 1300.00 |
|  7902 | FORD   | 3000.00 |
|  7839 | KING   | 5000.00 |
+-------+--------+---------+

分组函数/聚合函数/多行处理函数

count取得记录数
sum求和
avg取平均
max取最大的数
min取最小的数
所有的分组函数都是对  某一组  数据进行操作的
分组函数一共有5个
分组函数另一个名字-----> 多行处理函数

多行处理函数特点:数据多行,最终输入的结果是1行

(请参考案例2)
分组函数自动忽略NULL
所有数据库规定,只要有NULL参与的运算,结果一定为NULL
	可以用ifnull()解决
(参考案例3)
SQL语法规则:
	分组函数不可直接使用在where子句当中
	
为什么分组函数不可直接使用在where子句当中??????
	group by 语句 是在where执行之后才执行的
count(*) 和 count(字段) 的区别:

count(*)
	表示表中总的记录条数,,,,和字段无关系了就

count(comm)
	表示表中这个字段不为空(NULL)的记录数
案例1
// 找出工资总和
mysql> select sum(sal) from emp;
+----------+
| sum(sal) |
+----------+
| 29025.00 |
+----------+


// 找出最高工资
mysql> select max(sal) from emp;
+----------+
| max(sal) |
+----------+
|  5000.00 |
+----------+


// 找出最低工资
mysql> select min(sal) from emp;

// 找出平均工资
mysql> select avg(sal) from emp;

// 找出总人数
mysql> select count(ename) from emp;
mysql> select count(*) from emp;
案例2
// 分组函数自动忽略NULL
// 查询全部emp表信息
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 |
+-------+--------+-----------+------+------------+---------+---------+--------+
// 分组函数自动忽略NULL
// 查询员工表中津贴的记录
mysql> select count(comm) from emp;
+-------------+
| count(comm) |
+-------------+
|           4 |
+-------------+
// 分组函数自动忽略NULL
// 所有数据库规定,只要有NULL参与的运算,结果一定为NULL
// 计算每个员工的年薪
mysql> select empno,ename,(sal+comm)*12 as yearsal from emp;
+-------+--------+----------+
| empno | ename  | yearsal  |
+-------+--------+----------+
|  7369 | SMITH  |     NULL |
|  7499 | ALLEN  | 22800.00 |
|  7521 | WARD   | 21000.00 |
|  7566 | JONES  |     NULL |
|  7654 | MARTIN | 31800.00 |
|  7698 | BLAKE  |     NULL |
|  7782 | CLARK  |     NULL |
|  7788 | SCOTT  |     NULL |
|  7839 | KING   |     NULL |
|  7844 | TURNER | 18000.00 |
|  7876 | ADAMS  |     NULL |
|  7900 | JAMES  |     NULL |
|  7902 | FORD   |     NULL |
|  7934 | MILLER |     NULL |
+-------+--------+----------+


解决如下:
// 查询员工年薪
// 把空的comm当做0来处理
select enpno,ename,(sal+ifnull(comm,0))*12 as from emp;
mysql> select empno,ename,(sal+ifnull(comm,0))*12 as yearssal from emp;
+-------+--------+----------+
| empno | ename  | yearssal |
+-------+--------+----------+
|  7369 | SMITH  |  9600.00 |
|  7499 | ALLEN  | 22800.00 |
|  7521 | WARD   | 21000.00 |
|  7566 | JONES  | 35700.00 |
|  7654 | MARTIN | 31800.00 |
|  7698 | BLAKE  | 34200.00 |
|  7782 | CLARK  | 29400.00 |
|  7788 | SCOTT  | 36000.00 |
|  7839 | KING   | 60000.00 |
|  7844 | TURNER | 18000.00 |
|  7876 | ADAMS  | 13200.00 |
|  7900 | JAMES  | 11400.00 |
|  7902 | FORD   | 36000.00 |
|  7934 | MILLER | 15600.00 |
+-------+--------+----------+

select sum(comm) from emp;

// 不需要加where comm is not null  附加条件
// 因为sum分组函数自动忽略null,
select sum(comm) from emp where comm is not null;
案例3
// 找出工资高于平均工资的员工
mysql> select empno,ename,sal from emp where sal > avg(sal);		// 错误
ERROR 1111 (HY000): Invalid use of group function


// 第一步,找出平均工资
mysql> select avg(sal) from emp;
+-------------+
| avg(sal)    |
+-------------+
| 2073.214286 |
+-------------+
// 第二步,找出高于平均工资的员工
mysql> select empno,ename,sal from emp where sal> 2073.214286;
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7566 | JONES | 2975.00 |
|  7698 | BLAKE | 2850.00 |
|  7782 | CLARK | 2450.00 |
|  7788 | SCOTT | 3000.00 |
|  7839 | KING  | 5000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+


// 拼接:
// 这叫子查询
// 带括号() 的优先级比较高,会优先执行括号()里面的
mysql> select empno,ename,sal from emp where sal>(select avg(sal) from emp);
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7566 | JONES | 2975.00 |
|  7698 | BLAKE | 2850.00 |
|  7782 | CLARK | 2450.00 |
|  7788 | SCOTT | 3000.00 |
|  7839 | KING  | 5000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+


--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------

SQL语法规则:
	分组函数不可直接使用在where子句当中

为什么分组函数不可直接使用在where子句当中??????
	group by 语句 是在where执行之后才执行的
案例4
// 分组函数可以组合起来用
mysql> select count(*),max(sal),min(sal),sum(sal),avg(sal) from emp;
+----------+----------+----------+----------+-------------+
| count(*) | max(sal) | min(sal) | sum(sal) | avg(sal)    |
+----------+----------+----------+----------+-------------+
|       14 |  5000.00 |   800.00 | 29025.00 | 2073.214286 |
+----------+----------+----------+----------+-------------+

单行处理函数

单行处理函数
	输入一行,输出一行
ifnull()  
	ifnull(可能为null的数据,别当做什么来处理)

// 查询员工年薪
// 把空的comm当做0来处理
select enpno,ename,(sal+ifnull(comm,0))*12 as from emp;

属于单行处理函数


分组查询

group by  和  having

group by:
	按照某个字段或者某些字段进行分组
	
having:
	是对分组之后的数据进行再次过滤
	

注:
	分组函数一般会和group by 联合使用
	并且任何一个分组函数都是在 group by语句 执行结束之后才会执行
	当sql语句没有 group by语句 的时候,整张表的数据会自成一组
*****重要*****
*****重要*****

当一条语句中有  group by 时
select 后面 只能出现 参加 分组的字段
和分组函数

*****重要*****
*****重要*****
案例1(group by)
// 找出每个工作岗位的最高工资
mysql> select max(sal),job from emp group by job;
+----------+-----------+
| max(sal) | job       |
+----------+-----------+
|  1300.00 | CLERK     |
|  1600.00 | SALESMAN  |
|  2975.00 | MANAGER   |
|  3000.00 | ANALYST   |
|  5000.00 | PRESIDENT |
+----------+-----------+


当一条语句中有  group by 时
select 后面 只能出现 参加 分组的字段
和分组函数
案例2(group by)
// 每个岗位的平均薪资
mysql> select job,avg(sal) from emp group by job;
+-----------+-------------+
| job       | avg(sal)    |
+-----------+-------------+
| CLERK     | 1037.500000 |
| SALESMAN  | 1400.000000 |
| MANAGER   | 2758.333333 |
| ANALYST   | 3000.000000 |
| PRESIDENT | 5000.000000 |
+-----------+-------------+
案例3(group by)
// 找出每个部门不同工作岗位的最高薪资
mysql> select deptno,job,max(sal) from emp group by deptno,job;
+--------+-----------+----------+
| deptno | job       | max(sal) |
+--------+-----------+----------+
|     20 | CLERK     |  1100.00 |
|     30 | SALESMAN  |  1600.00 |
|     20 | MANAGER   |  2975.00 |
|     30 | MANAGER   |  2850.00 |
|     10 | MANAGER   |  2450.00 |
|     20 | ANALYST   |  3000.00 |
|     10 | PRESIDENT |  5000.00 |
|     30 | CLERK     |   950.00 |
|     10 | CLERK     |  1300.00 |
+--------+-----------+----------+
案例4
方法01
// 找出每个部门的最高薪资,要求显示薪资大于2900的数据

// 第一步
// 找出每个部门的最高薪资
mysql> select deptno,max(sal) from emp group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     20 |  3000.00 |
|     30 |  2850.00 |
|     10 |  5000.00 |
+--------+----------+

// 第二步
// 找出薪资大于2900的数据
// 这种方式的效率较低
mysql> select deptno,max(sal) from emp group by deptno having max(sal)>2900;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     20 |  3000.00 |
|     10 |  5000.00 |
+--------+----------+
方法02
// 找出每个部门的最高薪资,要求显示薪资大于2900的数据
// 这种方式快一些
// 分组操作 是在 where 执行之后才执行的
mysql> select deptno,max(sal) from emp where sal>2900 group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     20 |  3000.00 |
|     10 |  5000.00 |
+--------+----------+
案例5
// 找出每个部门的平均薪资,要求显示薪资大于2000的数据

// 第一步,找出每个部门的平均薪资
mysql> select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|     10 | 2916.666667 |
+--------+-------------+

// 第二步,显示薪资大于2000的数据
mysql> select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     20 | 2175.000000 |
|     10 | 2916.666667 |
+--------+-------------+
select deptno,avg(sal) from emp where avg(sal)>2000 group by deptno;	// 错误

	where后面不能使用分组函数,
	这种情况只能使用having过滤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值