--批量查询
这样查询,效率比较低下;
in 关键字,批量查询;
select * from emp where empno in (123, 345, 800)
is null
--使用逻辑操作符
--order by 排序
asc 升序;默认是升序;
desc 降序;
order by 可以根据不同的字段排序;
order by deptno , sal desc
使用别名进行排序;
实际上是种浪费,对字段取个别名,对别名进行排序;
--分页查询
结果太多,不分页显示不方便;
分页查询需要用到子查询;
表的复杂查询:
select语句;
报错:min是聚合函数;
首先执行( )里面的;得到一个结果来使用:
把800作为一个结果来使用:
select语句优化的原则,
把减少结果集的条件写在右边;
--avg
--count(*)
--group by
10号 20号 30号 部门的平均工资的查询;
--多表查询
--显示每个部门每种岗位的平均薪水和最低工资
group by deptno, job
--having 对分组过后的结果进行筛选
往往和group by 结合使用;
having avg(sal) < 2000
vv报错:语法是从右开始执行的,不知道vv是啥;
作业:
建库,建表
练习1、练习2
-----------------------------------------
表的复杂查询
说明:
在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给
大家介绍较为复杂的select语句
数据分组 -max(最大),min(最小),avg(平均),sum(和),count(统计)
见下例:
--如何显示所有员工中最高工资和最低工资
select min(sal)"最低工资",max(sal)"最高工资" from emp
--显示最低工资并显示出雇员名字
select ename"姓名",sal"工资" from emp where
sal=(select min(sal) from emp)
--显示所有员工的平均工资和工资总和
select avg(sal)"平均工资",sum(sal)"工资总和" from emp
--把高于平均工资的雇员的名字和他的工资显示出来
select ename,sal from emp where
sal>(select avg(sal) from emp) order by sal
--计算共有多少员工
select count(*)"雇员数" from emp
--扩展要求
--请显示工资最高的员工的名字、工作岗位
select ename,job from emp where sal=(select
max(sal) from emp)
--请显示工资高于平均工资的员工信息,并显示平均工资(效率不高)
select ename"姓名",job"岗位",sal"工资",(select avg(sal) from emp)"平均工资"
from emp where sal>(select avg(sal) from emp) order by sal
表的复杂查询
group by和having子句
group by用于对查询的结果分组统计
having子句用于限制分组显示结果
例:
--group by和having子句使用(having与group by结合使用,可以对分组后的查询结果进行筛选)
--如何显示每个部门的平均工资和最高工资
select deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资" from emp group by deptno
--如何显示每个部门的平均工资和最高工资并显示部门名称(多表查询)
select emp.deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资",dept.dname"部门名称" from emp,dept where emp.deptno=dept.deptno group by emp.deptno,dept.dname
--显示每个部门的每种岗位的平均工资和最低工资
select deptno"部门号",job"岗位",avg(sal)"平均工资",min(sal)"最低工资" from emp group by deptno,job order by deptno
--显示平均工资低于2000的部门号和它的平均工资
select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)<2000
--显示平均工资大于2000的部门号和它的平均工资并按升序排列
select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)>2000 order by "平均工资"
17
1
--group by和having子句使用(having与group by结合使用,可以对分组后的查询结果进行筛选)
2
3
--如何显示每个部门的平均工资和最高工资
4
select deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资" from emp group by deptno
5
6
--如何显示每个部门的平均工资和最高工资并显示部门名称(多表查询)
7
select emp.deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资",dept.dname"部门名称" from emp,dept where emp.deptno=dept.deptno group by emp.deptno,dept.dname
8
9
--显示每个部门的每种岗位的平均工资和最低工资
10
select deptno"部门号",job"岗位",avg(sal)"平均工资",min(sal)"最低工资" from emp group by deptno,job order by deptno
11
12
--显示平均工资低于2000的部门号和它的平均工资
13
select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)<2000
14
15
--显示平均工资大于2000的部门号和它的平均工资并按升序排列
16
select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)>2000 order by "平均工资"
17
表的复杂查询
对数据分组的总结
1、分组函数只能出现在选择列表,having、order by子句中
2、如果在select语句中同时包含有group by,having,ovrder by那么他们的顺序是group by,having,order
by
3、在选择列中如果有列、表达式、和分组函数,那么这些列和表达式必需有一个出现在group by子句中,否则就会出错
如:
select deptno,avg(sal),max(sal)
from emp group by deptno
having avg(sal)<2000
1
select deptno,avg(sal),max(sal)
2
from emp group by deptno
3
having avg(sal)<2000
这里deptno就一定要出现在group by中
原文地址:https://www.cnblogs.com/xuxaut-558/p/10035721.html