oracle数据库之子查询

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

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 ;

    


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle数据库中,子查询和多表查询是常用的查询技巧,用于在一个查询语句中检索多个表或进行嵌套查询。 1. 子查询(Subquery): 子查询是指在一个查询语句中嵌套另一个查询语句,子查询的结果作为外部查询的条件或数据源之一。以下是一个简单的示例: ``` SELECT column1 FROM table1 WHERE column2 IN (SELECT column3 FROM table2 WHERE condition); ``` 在上述示例中,子查询 `(SELECT column3 FROM table2 WHERE condition)` 返回一个结果集,然后作为外部查询的条件之一来过滤 `table1` 中的数据。 2. 多表查询(Multiple Table Query): 多表查询用于检索多个表中的数据,并根据条件进行连接和过滤。以下是两种常见的多表查询方法: - 使用JOIN语句进行表连接: ``` SELECT table1.column1, table2.column2 FROM table1 JOIN table2 ON table1.column = table2.column WHERE condition; ``` 在上述示例中,使用JOIN语句将 `table1` 和 `table2` 进行连接,并根据指定的条件进行过滤。 - 使用子查询进行表连接: ``` SELECT column1 FROM table1 WHERE column2 IN (SELECT column3 FROM table2 WHERE condition); ``` 在上述示例中,使用子查询 `(SELECT column3 FROM table2 WHERE condition)` 获取一个结果集,并将其作为外部查询的条件之一来过滤 `table1` 中的数据。 请注意,以上只是简单的示例,实际应用中可能会涉及更复杂的查询需求和语法。建议参考Oracle官方文档或相关教程以获取更详细的信息和示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值