第三章 SQL高级查询
1.嵌套子查询
子查询使用灵活,可以作为查询条件使用,作为临时表使用,作为列使用。
优点是降低了SQL语句的复杂度,提高了SQL语句的可读性。
2.IN和NOT IN
IN和NOT IN通常在WHERE子句中使用,在IN和NOT IN后接的子句查询中,可以有多个值出现,但必须只能有一列。
3.EXISTS和NOT EXISTS
EXISTS和NOT EXISTS表示存在和不存在的意思。
在语句中会判断EXISTS和NOT EXISTS后接的子句是否存在和是否不存在。
EXISTS和NOT EXISTS的用法一样,唯一区别是意思相反。
4.SOME、ANY、ALL
在SQL查询中SOME、ANY、ALL后必须跟子查询。
在SQL查询中SOME和ANY的作用一样,表示其中任何一项,ALL表示其中所有的项。
5.COMPUTE和COMPUTE BY
使用了COMPUTE进行汇总计算后的查询得到了两个结果集,第一个结果及返回查询语句前面的查询明细,后一个结果集返回汇总的结果,我们也可以在COMPUTE子句中添加多个汇总计算表达式。
COMPUTE子句需要下列信息:
可选BY关键字,它基于每一列计算指定的行聚合。
行聚合函数名称,它包括SUM、AVG、MIN、MAX或COUNT。
要对其执行行聚合函数的列。
在有些场景中我们需要对结果先进行分组,然后进行汇总计算。这种情况下我们可以使用COMPUTE BY进行分组汇总查询。
6.排序函数
语法:排序函数OVER([分组子句]排序子句[DESC/ASC])
①ROW_NUMBER函数不并列不跳空。
②RANK函数存在并列且跳空。
③DENSE_RANK函数存在并列但不跳空。
分组子句:PARTITION BY
排序子句:ORDER BY
二:
排序
exists -----------数据库高级查询 分组查询
去重复数据
排序:asc:升序(默认)desc:降序
1、年龄升序排列
select name,age from student order by age;
select name,age from student order by age asc;
2、年龄降序排列
select name,age from student order by age desc;
3、先年龄升序,相同的按姓氏首字母升序排列
select name,age from student order by age,name;
分组查询
1、group by
分组查询最高分(按照的分组前面必须要查询)
select MAX(grade),sid from score group by sid;
2、group by 排序名 having 条件
查询补考学生
select grade,sid from score group by sid having COUNT(sid)>1;
3、对比
(1)WHERE子句从数据源中去掉不符合其搜索条件的数据
(2)GROUP BY子句搜集数据行到各个组中,统计函数为各个组计算统计值
(3)HAVING子句去掉不符合其组搜索条件的各组数据行
WHERE—>GROUP BY—>HAVING
去重复数据:distinct
去掉重复数据
select distinct sid from score;
exists检测
1、求最大年龄
(1)select MAX(age) from info;
(2)select distinct age from info where age not in(select a.age from info a,info b where a.age<b.age);
(3)select distinct age from info a where not exists (select 1 from info b where a.age<b.age);
2、采用EXISTS检测是否有人考试成绩达到60分以上,如果有,使用SELECT语句按成绩从高到低排序,显示前3名学员学号和成绩
select sid,grade from score where exists (select sid,grade from score where grade>=60) order by score desc limit 3;
三:总结: