Oracle中的子查询中的in,any,all,这三个关键字的作用是什么我不清楚,谁来讲解一下

Oracle中的子查询中的in,any,all,这三个关键字的作用是什么我不清楚,谁来讲解一下,第1张

楼主您好

in查询是包含

any大多数所用和in类似,in(1,2,3)相当于=any(1,2,3),和some这个关键字一样

区别是any可以用大于小于,比如 列1>any(1,2,3)就是查询列1 只要大于1,2,3其中任何一个数字就行,相当于列1>1

all同理 不过any是或查询 all是与查询 列1>all(1,2,3),相当于>3

我来回答一下,这个问题不好说清楚....

学生

-- 查询1、查询出 年龄 = 17 的所有学生

select t.* from 学生表 t where t.年龄 = 17

-- 查询2、查询出 年龄 = 17 或者 = 18 的所有学生

select t.* from 学生表 t where t.年龄 in (17, 18)

-- 查询3、查询出 性别 = 男 的所有学生,这里因为子查询“学生表 t2”只有一条记录满足条件(即单列单行),所以查询不会报错

select t.* from 学生表 t where t.年龄 = (

select t2.年龄

from 学生表 t2 where t2.性别 = '男'

)

-- 查询4、查询出 年龄 = 17 的所有学生,这里因为子查询 “学生表 t2” 有两条数据符合条件(即单列多行),而 “t.性别 =” 只能等于某一个给定的值,参考 “查询1” ,所以执行查询会报错;这里把 = 替换为 =any 或者 in 就可以正常查询,因为 =any 和 in 是告诉 “t.性别” 要找的数据必须在我范围内;而 <>any 和 not in 则表示取反的意思,告诉 “t.性别” 要找的数据必须排除我给你的范围。

select t.* from 学生表 t where t.性别 = (

select t2.性别

from 学生表 t2 where t2.年龄 = 17

)

-- ANY 和 ALL 的具体用法,这里不再赘述。。。。

-- 查询5、多列多值,参考查询4,子查询 “学生表 t2” 满足条件的有两条,如下查询:

select t.* from 学生表 t where t.年龄 || t.性别 =any (

select t2.年龄 || t2.性别

from 学生表 t2 where t2.性别 = '男'

)

注1:其实 ANY 和 ALL 不涉及什么多行多列,查询5只是一种另类的解决方案。

注2:“||” 双数线表示 在 ORACLE 数据库中用来做合并的关键字符。

总结:

首先,请不要在查询1、2、3、4、5上过于纠结,说什么我可以用更简单的SQL实现你的查询1、2、3、4、5,我这里仅仅是为了举例说明。

select t.* from 学生表 t where t.年龄 = 17

= 后面可以是一个 特定的值,可以是一个 子查询等等,但是需要保证 = 后面的任何运算或查询只返回一个值,不然SQL是无法执行的;

而 any 和 all 以及 in,表示的是一个数据范围,即单列多行,而使用 双竖线 是把 多列合并为一列来处理,最终还是模拟的单列多行。

给你些例子:

in 是 确定集合的

SELECT au_lname, state

FROM authors

WHERE state IN ('CA', 'IN', 'MD')

结果:

au_lname state

-------- ----

Yokomoto CA

DeFrance IN

Stringer CA

MacFeatherCA

KarsenCA

Panteley MD

HunterCA

all 是查询还可以是子查询

如:

select name from edit

其中name前省略了all.

name前可以加ALL|DISTINCT

all是所有记录.

distinct是不重复的。

带【any】的嵌套查询和【some】的嵌套查询功能是一样的。早期的SQL仅仅允许使用【any】,后来的版本为了和英语的【any】相区分,引入了【some】,同时还保留了【any】关键词。

any:

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >any(select sal from scott.emp where job='MANAGER')

带any的查询过程等价于两步的执行过程。

(1)执行“select sal from scott.emp where job='MANAGER'”

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 or sal>2850 or sal>2450

some:

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =some(select sal from scott.emp where job='MANAGER')

带some的嵌套查询与any的步骤相同。

(1)子查询,执行“select sal from scott.emp where job='MANAGER'”,其结果如图4.22所示。

(2)父查询执行下列语句。

―――――――――――――――――――――――――――――――――――――

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =2975 or sal=2850 or sal=2450


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9603709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存