Oracle之查询(1)

前面关于操作数据库的博文提到过,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 后面也能跟不等式条件或其他条件。只是性能如何不谈。。。

接下来会有更多好东西可以康哦

Oracle之查询(1)

上一篇:C++:函数与递归 Function and Recursion


下一篇:C++中内存区域的划分