前面关于操作数据库的博文提到过,Oracle与MySQL都是使用SQL语言的,所以两者在应用上其实是大差不差的。
本篇博文就主要讨论关于查询方面的一些应用。
内外勾连
这是一种极其高效且方便的查询语句。当我们对一张表进行查询但是且过滤条件不涉及他表,完全可以使用内外勾连来实现查询。(当然也可以使用外连接查询)
select xx from table t1 where (select xx from table t2 where ...);
举个例子:一张各科学生成绩表stu_score(course,sname,score),查询各科成绩前几名?查询与学生小明成绩一致的学生?
//查找各科前三名
select * from stu_score ss1 where (select count(*) from stu_score ss2 where ss1.course = ‘xx‘ and ss1.score < ss2.score) < 3;
//查询和小明成绩相同的学生信息
select * from stu_score ss1 where sname != ‘小明‘ and exists(select * from stu_score ss2 where ss1.score = ss2.score and ss2.sname != ‘小明‘);
内外勾连的查询方式是及其高效的,因为exists在每轮筛选后会过滤掉一些待匹配的数据,这表示每次筛选需要的匹配的数据是不断减少的。速度当然也是越来越快。
行转列
这真是一个经典的议题。我们来看一张表
学科 | 姓名 | 成绩 |
---|---|---|
语文 | 张三 | 67 |
语文 | 李四 | 65 |
数学 | 张三 | 98 |
数学 | 李四 | 87 |
英语 | 张三 | 85 |
英语 | 李四 | 78 |
姓名 | 语文 | 数学 | 英语 |
---|---|---|---|
张三 | 67 | 98 | 85 |
李四 | 65 | 87 | 78 |
要求上面一张表转换为下面一张表,事实上就是要实现行转列。
//原表
select course,sname,score from stu_score;
//转换后表
select sname,
case course when ‘语文‘ then score else 0 end as "语文",
case course when ‘数学‘ then score else 0 end as "数学",
case course when ‘英语‘ then score else 0 end as "英语"
from stu_score group by sname,course;
Oracle中分组比较严格,查询只能查询分组字段+分组函数(count,avg,sum,max,min),要差别的字段,要么加入分组,要么自己与自己连接查询。
去重
Oracle中提供四种去重方式
1.distinct
select distinct xxx from table;
distinct是数据库推出的专门用于去重的关键字。
它会对查询结果进行记录(row)级的去重。范围比较广,但是效率也低。
2.group by分组
这其实是利用分组结果只显示分组字段来实现去重的,这是由分组的意义决定的。同时这也表示了这种去重方式极为低效,也是最适用于各大数据库的。
3.rowid
rowid是Oracle自带的一种伪列。它表示查询结果各记录数据所在物理地址。Oracle为节省资源会将相同数据放到同一块内存。
这就为去重提供了条件
select * from table t1 where rowid = (select max(rowid) from table t2 where t1.xx = t2.xx);
这种方法是最为高效的,因为这是直接通过查找内存地址来去重的。
4.窗口函数去重
这种方式其实类似于分组,只不过将分组的工作分发给窗口,再通过row_number函数编号,对于重复数据取首个编号即可。
select * from
(select xx,row_number() over(partition by xx) rm)
where rm = 1;
这种方法其实也是比较鸡肋的。
最后再来提一下连接查询,这种查询是基于多表查询的,各大数据库也都支持。其实也没什么。
内连接查询 inner join on 保证连接双方都要匹配上才能确定。
左右外连接 left/right join on 是以左表/右表为基准进行匹配,左表/右表都要确定,右表/左表与之匹配,即使匹配不上也要以null值为准。
最重要一点,我们都会先入为主认为 on 后面的匹配条件只是双方的某个字段相等。
NO,No,NO,其实 on 后面也能跟不等式条件或其他条件。只是性能如何不谈。。。
接下来会有更多好东西可以康哦