oracle数据库之子查询

来源:互联网 发布:好莱坞一线男星 知乎 编辑:程序博客网 时间:2024/06/09 18:31

/*   本部分内容练习使用到的表格可以参看前面

oracle数据库之常用的函数练习

里面的bbc表     */

/*  子查询     通俗的说法:一个查询中包含其他的查询  */

----查出印度和法国所在洲的所有国家信息
------分析:先查出印度和法国所在的洲  select region from bbc where name = '印度' or name = '法国'
------再运用子查询
select * from bbc
where region in (select region from bbc where name = '印度' or name = '法国');

--给出人均GDP超过(英国)的欧洲国家.
select name from bbc
where gdp/population > (select gdp/population from bbc where name = '英国') and region = '欧洲';

--哪些国家的GDP比(法国)多但少于 (日本)?   between a and b   查询出的结果包含a,b    相当于范围是 [a,b]
select * from bbc where gdp > (select gdp from bbc where name = '法国')
and gdp < (select gdp from bbc where name = '日本') ;

--查出比欧洲任意国家的gdp都要高的国家
select name from bbc
where gdp > (select max (gdp) from bbc where region = '欧洲') ;
--利用 all 关键字    顾名思义   所有     > all   --->  大于所有
select name from bbc
where gdp > all (select gdp from bbc where region = '欧洲') ;

-- 给出每个地区人口最大的国家。
select name from bbc
where population in (select max(population) from bbc  group by region) ;
--上面这种解法是错误解法,如果当所有数据值无重复,即同一个数值不出现多次的情况不会出错,否则有可能查询结果有误
--因为  select max(population) from bbc  group by region  查询出的确实是每个洲的最大人口数
--但是前面的 in 的效果是在里面的都查询出来,所以,当某些国家的人口不是该洲的最大,却和其他洲的最大人口数相等的话也会被包含在结果集中
--正确解法:
----对同一个表做两次查询,子查询查出当前记录的国家所在洲的最大人口数,然后外部查询查出人口数等于这个值的国家
----这种解法与上面方法的区别在于:子查询中已经确定洲的范围就是当前记录的洲,所以不会出现查询出因为数值相等,而洲不同的国家
select name from bbc a
where population = (select max(population) from bbc b where a.region = b.region) ;
--这种方法同样可以用all关键字解决
select name from bbc a
where population >= all (select population from bbc b where a.region = b.region) ;

/*    ①关于查询的数据涉及多个表时,表连接都可以用子查询替换,但有的子查询却不能用表连接替换;  

      自己可以试试将前面多表联接的例子全部都用子查询实现一遍

    ②子查询比较灵活、方便,常作为增删改查的筛选条件,适合于操纵一个表的数据;    

    ③表连接更适合于查看多个表的数据;                                */


/*   分页查询   在查询记录有多行的情况下将查询出的记录进行分页显示   */

----思路:给在子查询中查询出前 n 行的记录,然后给这个结果集加一个行数(rownum)的常量列
----然后在外部查询中常量列中数值大于 m 的记录,那么查询的结果集就是总体结果集的 (m,n] 行的记录
select * from (select caipiao.*,rownum as rn from caipiao where rownum <=20)
where rn >10 ;
--设每页有 n 行记录   如果要查询 第 p 页的信息
--那么查询公式为
--select 字段名 from (select 表名.*,rownum as rn from 表名 where rownum <= p*n) where rn >(p-1)*n
select a,b,c from (select caipiao.*,rownum as rn from caipiao where rownum <=20)
where rn >10 ;

    


原创粉丝点击