oracle any 函数用法什么条件下用in,all,any

oracle中&all&any&in的用法
Oracle的嵌套子查询可以使用Some,Any和All对子查询中返回的多行结果进行处理。
Some表示满足其中一个的含义,是用or串起来的比较从句。
例如:SELECT * FROM emp WHERE empno = 'hmz' OR dept = '10'
Any也表示满足其中一个的含义,也是用or串起来的比较从句。
Some和Any的区别就是:Some用在“=”的比较关系中。
英文中的否定句中使用any肯定句中使用some,这一点是一样的。
some和any都有“一些”的意思
some用在肯定句中,any用在否定句或疑问句中。
【注1】但表示期望得到肯定回答的疑问句中用some。
【注2】any还有“任何”的意思,some没有
比较:She's too old to do any work.她年事已高,干不了什么活了。
& & & She's
old enough to do some work.她已长大了,可以干些活了。
All则表示满足其中所有查询结果的含义,使用and串起来的比较从句。
查询比部门号为10的员工中的任何一个员工工资都要高的员工的姓名和个人工资。
也就是说只要比部门号为10中工资最少的员工高就满足条件。
SELECT ename,sal
WHERE sal & ANY(SELECT sal FROM emp WHERE
deptno = 10);
这里推荐用any,如果你非要用some也是没有任何问题的,结果是一样的,只是一般来讲some用在“=”的比较从句中。
SELECT ename,sal
WHERE sal = SOME(SELECT sal FROM emp WHERE deptno = 30) AND
deptno NOT IN (SELECT deptno FROM emp WHERE deptno = 30);
含义是找到和30号部门员工的任何一个人工资相同的那些员工。
最后一个关键字all的用法就是要与子查询的每一结果都要匹配。
SELECT ename,sal
WHERE sal & ALL(select sal from emp where
deptno = 20);
上面的SQL语句的意义与前面的就完全不一样了,其意义是找到比部门号为20的员
工的所有员工的工资都要高的员工,也就是比那个工资最高的员工的还要高的员工。
总的来说some和any用法意义是一样的,仅在词法上有不同,都表示对子查询结果
集“或”的比较关系,而all则是对子查询结果集总每一个结果“与”的关系。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。多行子查询_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
多行子查询
||暂无简介
总评分4.2|
浏览量875452
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢&& &文章主题:
交流经验:3830
总积分:261644
级别:VIP5
文章: 1162
使用子查询(嵌套查询)
1、查询有一门及格的学生
select * from tbl_student s
&&&& where 60 & any(select score from tbl_grade
g where s.snum =g.snum);
select * from tbl_student s
&&&& where 60 & some(select score from tbl_grade
g where s.snum = g.snum);
any表示子查询返回值中的任意一个值(any是等于N个or语句)
&&& expr&any(单列多行子查询),expr大于子查询中任一返回值,&& 也就是只要大于子查询最小返回值就可以了
some在此表示满足其中一个的意义,是用or串起来的比较从句。 some和any用法意义是一样的。
all表示子查询返回值中的所有值 (all是等于N个And语句)
&&& expr&all(单列多行子查询),expr大于子查询中所有返回值,也就是必须要大于子查询中最大返回值才行
按子查询返回值分为:单行单列、多行单列、单行多列、多行多列
按是否与主表连接分为:相关子查询、无关子查询
、单行单列子查询
& 查询学生的成绩,要求显示学生的姓名
&&&&&& select& (select sname from tbl_student s where s.snum=g.snum) as sname,
&&&&&&&&&&&&&&&&&& (select cname from tbl_course c um) as cname,
&&&&&&&&&&&&&&&&&& score
&&&&& from tbl_grade g
、多行单列子查询
&&&&&& 查询男同学的成绩
&&&&&& select * from tbl_grade g
&&&&&&& where snum in (select snum from tbl_student where sex=‘0’)
、单行多列或多行多列子查询
&&&&& 查询男同学的成绩
&&&&&& select * from tbl_grade g&& where (snum,’0’) in (select snum,sex from tbl_student)
、检索学全了课程的学生
&&&&&& select * from student s where snum in(
&&&&&&&&&&&&& select g.snum from tbl_grade g group by g.snum
&&&&&&&&&&&&& having count(*) = (select count(*) from tbl_course)
、检索没学全课程的学生
&&&& select * from student s where snum in(
&&&&&&&&&&&&& select g.snum from tbl_grade g group by g.snum
&&&&&&&&&&&&& having count(*) & (select count(*) from tbl_course)
2、exists子查询
只要子查询找到一条记录,结果就是true
、查询选修过课程的学生
&& select * from tbl_student s
&&&&&&& where exists (select * from tbl_grade where s.snum=g.snum)
、查询没有选修过
号课程的学生的信息
&& select *& from tbl_student s
&&&&& where not exists
(select * from tbl_grade g um=1 and s.snum=g.snum)
、查询男同学的成绩
&& select * from tbl_grade g
&&&&& where exists (select * from tbl_student s where s.snum=g.snum and sex=‘0’)
、检索学全了课程的学生
分析:不可能【找不到一门课,这么课找不到成绩】
select s.* from tbl_student s where not exists(
&&& select * from tbl_course c where not exists(
&&&&&&& select * from tbl_grade g where g.snum=s.snum um
、检索没学全课程的学生
分析:可能【找到& 一门课 找不到 成绩】
select s.* from tbl_student s where exists(
&&& select * from tbl_course c where not exists(
&&&&&&& select * from tbl_grade g where g.snum=s.snum um
in和exists区别
是把外表和内表作
&&&&&&& select * from tbl_grade g
&&&& where snum in (select snum from tbl_student where sex=‘0’)
是对外表作
循环,每次
循环再对内表进行查询。
& 如select * from tbl_grade g
&&&&&&&&&& where exists (select * from tbl_student s where s.snum=g.snum and sex=‘0’)
&&&&&& 可理解为:
&&& for(g : select * from tbl_grade) {
&&&&&&&&&&&& if(exists(select * from tbl_student s where s.snum=g.snum and sex=‘0’)) {
&&&&&&&&&&&& }
&&&&&&&&& }
&& in:如果内表返回数据量太大,肯定生成临时表,而且会进行排序,效率非常低。
&&&&&&&& 因此,适合内表返回数据量较小的情况。
&& exists:外表肯定是循环,如果外表数据量太大,也同样效率低。
&& 因此,适合内表返回数据量多的情况。
使用exists可以按如下思路,否则不好理解:
1、exists子查询是找到即停止并返回true(找到),找不到返回false(找不到)
&&&&&&&&&& 说明:不要去翻译为存在和不存在,把脑袋搞晕。
2、头脑中建立for循环
3、exists首先执行外层查询,再执行内层查询,与IN相反。
& & & 如果not in返回至少一个null,那么not in就返回flase,第一个表的数据行就不会显示。&&&
&&&&& 对于not exists,只是关心是否返回行,因此返回的无论是null还是非null,都是true,只要有数据返回。
& & & 使用not in还是not exists,不仅仅是功能上不同,而且在性能上也有很大的不同。NOT IN会骗过子查询中所涉及表的索引。
选择一个版面
软件设计专版
Web前端技术
学习问题讨论
面试、就业
版权所有 Copyright(C) 私塾在线学习网oracle什么条件下用in,all,any_百度知道
oracle什么条件下用in,all,any
提问者采纳
ANY(SELECT COL FROM TABLEA)这相当于SELECT * FROM TABLE WHERE COL &gt,&#39:SELECT * FROM TABLE WHERE COL &gt,只要满足一个就可以了;这个和col = any(' (SELECT MIN(COL) FROM TABLEA)一般来说我们更习惯于下面的写法; ALL(SELECT COL FROM TABLEA)这相当于SELECT * FROM TABLE WHERE COL &;)表示col字段。all就是满足所有的; (SELECT MAX(COL) FROM TABLEA),&#39,要么是5除了in连接字以外;)是相同的,要么是3。 比如,大于all,另外两个函数我们现在很少用到,类似。至于in表示的是包含,类似and,也就是说any表示其中之一;3'3'SELECT * FROM TABLE WHERE COL &gt,一般都是应用函数组合来代替,也就是大于最大值。因为all跟any还需要进行二次计算,比如col in (&#39,那么就是大于所有的查询出来的数;5&#39,也可以解释为任意一个;5&#39,比如上面的例子,所以现在用的比较少,因为可以用其他方式代替了
其他类似问题
为您推荐:
oracle的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 oracle in any 的文章

 

随机推荐