oracle关联视图查询满_视图,子查询,标量子查询,关联子查询

  1. 视图
  2. 子查询
  3. 标量子查询
  4. 关联子查询
  5. 如何用SQL解决业务问题
  6. 各种函数

7d3250afe946edeba974146f12c47e2f.png

1. 视图

  1. 视图内存放SQL查询语句,运行时运行该语句。查出的数据为临时数据
  • 创建视图
create view as 视图名称 (<视图别名1>, <视图别名2>,。。。
as   
<select 查询语句>

注意: <视图别名1>, <视图别名2>。。。。select语句查询结果的第1,2.。。。列

EG. create view as

2. 如何使用视图(什么时候使用视图,为什么使用视图)

  • 当某些sql查询语句需要频繁使用时,可保存成视图。不需每次都再写一遍。尤其在汇总和有复杂查询条件时,view可有效提高效率
  • 视图中的数据随原表的更新而更新,保证数据的最新状态。(因为视图中保存的是sql查询语句,每次运行都从原表中提取数据,保证了数据的最新)
  • 视图不用存储数据,节省空间。

3.注意事项

  • 避免在视图上再创建视图,多重视图降低效率
  • 在视图中插入数据会导致错误

2.子查询

1.什么是子查询

  • 一次性视图,在sql查询语句中直接定义视图查询语句。
  • 运行整条SQL查询语句, 子查询部分生成一个临时表,语句结束后子查询部分消失。
  • 运行顺序:子查询等于f原rom部分,最先运行。顺序:子查询-----外部select语句(where----group-----having----order---limit)-----select。

3da1fd03b3be6ecdc3ce16de3aa0f468.png
as 后是子查询名称。 如上,按性别汇总是子查询名称

2.如何使用子查询

  • where 列 in (子查询)
  • where 列+比较运算符+ any(子查询)------任意一个满足条件。 如: 哪些学生的成绩比0002课程的任意一成绩高呢?
  • where 列 + 比较运算符 + all(子查询)------所有满足条件。 如: 哪些学生的成绩比0002课程的所有成绩高呢?

c3937cc80f561c36219f31347c49d04c.png

3.子查询的功能,什么时候使用子查询

  • 功能与视图一样,但不需频繁使用,无需创建视图时可使用子查询。

4.注意事项

  1. 避免子查询层层嵌套,效率低。
  2. 创建子查询时加as。。。,增加可读性。 select。。。from
  3. SQL运算顺序:

b7152596f53047d7df8c34ed0d40ba73.png

标量子查询

  1. 标量子查询:查询语句返回单一值, 特定列+特定行。

由于标量子查询返回单一值,所以可以和比较运算符结合用

dbb778709c111efba18c86e736658fb5.png

2. 标量子查询如何使用: 任何需返回单一值得地方都可使用标量子查询。 可结合多种运算符进行复杂查询。需注意使用标量子查询不能有一对多的情况。

f5f092daceb21e6955ded51dc5104a61.png

关联子查询

  1. 同一张表里的两组数据进行比较。同一张表中的多对多。

如下: 在score表中,一个学生报了多节课, 多门课的平均成绩是一个组。-----多对多。 这种情况中,关联子查询的where连接语句将子查询的查询结果定位到特定课程的。使的查询结果为单一值。

  • 注意 使用关联子查询时外查询和子查询均需加as 别名, 以便where连接语句定位。 在where关联语句中, s2 可以看到s1, s1看不到s2. s2运行完子查询后消失。

b9f07e21dd6df651b49d8d50167fd836.png

b5fb1e06321f38ecdbdc2f41d6efdcd6.png
1. select name from world where population > (select population from world where name = 'Russia');

2.select name from world 
where continent = 'Europe' and gdp/population > 
(select gdp/population from world where name = 'United Kingdom')

3.select name,continent from world where continent in 
(select continent from world 
where name in ('Argentina','Australia') )
order by name;

4.select name, population from world where population > (select population from world where name = 'Canada') and population < (select population from world where name = 'Poland');

5.select name, concat(round(population/(select population from world where name = 'Germany')*100), '%')
 from world where continent = 'Europe';

6.select name from world 
where gdp > all
(select gdp from world 
where continent = 'Europe' and gdp>0);

7.select continent, name, area from world 
 as s1 where area >=all
(select max(area) from world as s2 
where s1.continent = s2.continent 
group by continent );


8. List each continent and the name of the country that comes first alphabetically.
select continent, name from world as s1 
where name <= all (select min(name) from world  as s2
where s1.continent = s2.continent 
group by continent);
// 通过比较找最值-----比所有都大/小--->最大最小。 
第一步: 找出所有集合B
第二步: where条件---A>= all(B)  A是最大;   A<=B A是最小
// 按什么划分,where后面就用什么关联
//where同样有按continent划分的功能, 这里的group by continent可略
// 用>all <all 表示最大,最小

9.select name, continent,population from world as s1 
where 25000000 >=  all
(select population from world as s2 where s1.continent = s2.continent)

10. Some countries have populations more than three times that of any of their neighbours (in the same continent). Give the countries and continents.
select name, continent from world as s1 where population > all 
(select population*3 from world as s2
where  s1.continent = s2.continent and s1.name != s2.name  )
用 A != B 表示AB可互相邻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值