赞
踩
一、什么是分组查询?
对表中的数据使用特定的列进行分组,对分组后的各组数据分别使用组函数处理。
分组后,select后不能直接跟非分组依据列还有单行函数。
还用昨天的两个表,employee员工表和department部门表来做测试:
先来看一个需求: 【查询各个部门的最高薪资 】
显然这是要进行分组来统计计算的,要根据department_id分组,然后再使用max函数统计每个分组中的薪资最大值。查询代码如下:
select department_id,max(salary)
from employees
group by department_id;
分组需要注意的地方是:
1,分组后的数据,以组为单位进行操作,所以后select可以跟组函数
2,分组后,每一组数据得出一个结果
3,select后跟分组依据,每一组的分组依据值一定相同,返回一个既可以,所以可以跟分组依据。
4,select后不能跟非分组依据列,每一组的非分组依据列的值未必相同,返回哪一行都不合适,所以不能跟在select后面
5,select后不能直接跟单行函数,单行函数对每一组的数据进行处理,该组内有几行,就返回几条数据,对一组处理后返回哪一条数据都不合适,所以select后不能直接跟单行函数。
对了,再补充一下什么是组函数:
数据被分到几个组里面,查询结果就会有几行数据。
一般情况下组函数是跟分组查询结合在一块使用的。
二、Having子句
关于何时用where何时用having
三、Oracle独有的伪列:
伪列:不需要程序员手动创建,由Oracle为每一张表自动分配。
伪列的值如果不手动查询,默认隐藏。
Rownum:表示行号,行号的值做比较时不能大于一个值,只能小于一个值。
select * from departments where rownum<=10----正常运行
select * from departments where rownum<=10 and rownum>=6—查询不出来数据。
总结:
定义顺序 执行顺序
Select 5
From 1
Where 2
group by 3
Having 4
order by 6
四.子查询
一个查询SQL的条件依赖另外一个查询SQL的结果,可以在一个SQL中嵌套另外一个SQL。
where单值子查询
被嵌套的SQL返回一行一列的结果。
where多值子查询:被嵌套的SQL返回结果是多行一列的数据。
from子查询:被嵌套的sql返回多行多列的数据
如果一个sql返回的结果是多行多列的,可以把返回结果当做一张新表看待。
分页查询:
五.表连接
当需要的信息来源于多张表时,可以将多张表连接起来,当做一张表看待。
3. 右外连接
语法: select 列
from 左表 right outer join 右表
on 连接条件;
4. 全外连接
语法: select 列
from 左表 full outer join 右表
on 连接条件;
5. 多表连接
6,自连接
不是技术上的分类,而是业务上的分类。自己连接自己。左表和右表都是一张表。
Sql:
Select s1.name,s2.name
From student s1 left join student s2
On s1.boss_id = s2.id
统计每个员工的姓名和领导的姓名。
Sql:
Select e1.first_name,e1.last_name,e2.first_name,e2.last_name
From employees e1 left join employees e2
On e1.manager_id=e2.employee_id
连接查询的关注点:
1.from后面跟哪些表
2.连接条件
3.我们使用哪种连接
四种连接的区别。左外链接把左表当成主表,右外连接把右表当成主表,完整外链接两张表都是主表,内连接两张表都是从表。
注意:inner 和 outer 可以省略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。