Oracle SQL NOT EXISTS用法
- 格式:docx
- 大小:33.67 KB
- 文档页数:1
exists用法oracle摘要:1.Oracle 数据库简介2.Oracle 中EXISTS 用法概述3.EXISTS 用法的具体应用4.示例与解析正文:1.Oracle 数据库简介Oracle 数据库是一款广泛应用于企业级数据管理的关系型数据库管理系统。
它以其高效、安全、可扩展性强等特点,在全球范围内拥有大量用户。
在Oracle 数据库中,SQL(结构化查询语言)是进行数据查询和操作的主要工具。
2.Oracle 中EXISTS 用法概述在Oracle 数据库中,EXISTS 是一个逻辑运算符,用于检查子查询返回的结果集是否为空。
EXISTS 用法的基本语法如下:```SELECT EXISTS (子查询)```如果子查询返回的结果集不为空,则EXISTS 返回真(1);如果子查询返回的结果集为空,则EXISTS 返回假(0)。
3.EXISTS 用法的具体应用EXISTS 用法在实际查询中可以用于判断某个条件是否成立,从而决定后续查询的执行。
以下是一个具体的应用示例:假设有一个名为“employees”的表,包含以下字段:id, name, department。
现在需要查询所有不属于“HR”部门的员工信息。
可以使用以下查询:```SELECT *FROM employeesWHERE department!= "HR"AND EXISTS (SELECT 1 FROM employees WHERE department = "HR");```在这个查询中,子查询首先检查“HR”部门的员工是否存在。
如果存在,则主查询会返回所有不属于“HR”部门的员工信息。
4.示例与解析以下是一个具体的示例,以及对示例的解析:示例:```SELECT *FROM employeesWHERE department!= "HR"AND EXISTS (SELECT 1 FROM employees WHERE department ="HR");```解析:- 主查询:从“employees”表中选择所有满足条件的记录,即部门不为“HR”的员工信息。
oracle中exist的用法在Oracle数据库中,EXISTS是一种用于检查子查询结果是否为空的关键字。
它可以用于WHERE子句或HAVING子句中,以便在查询中过滤掉不需要的数据。
在本文中,我们将深入探讨Oracle中EXISTS的用法,包括语法、示例和最佳实践。
语法EXISTS的语法如下:SELECT column1, column2, ...FROM table_nameWHERE EXISTS (SELECT column_name FROM table_name WHERE condition);其中,column1、column2等是要查询的列名,table_name是要查询的表名,condition是子查询中的条件。
如果子查询返回结果,则WHERE子句中的条件将被视为TRUE,否则将被视为FALSE。
示例让我们看一些使用EXISTS的示例。
1. 检查子查询结果是否为空假设我们有一个名为employees的表,其中包含员工的姓名和工资。
我们想要找到工资高于平均工资的员工。
我们可以使用以下查询:SELECT name, salaryFROM employees e1WHERE salary > (SELECT AVG(salary) FROM employees e2);但是,如果我们只想找到工资高于平均工资的员工中的前5个,我们可以使用EXISTS来实现:SELECT name, salaryFROM employees e1WHERE EXISTS (SELECT 1 FROM employees e2 WHERE e2.salary > (SELECT AVG(salary) FROM employees) AND e2.salary > e1.salary)AND ROWNUM <= 5;在这个查询中,我们使用了EXISTS来检查子查询的结果是否为空。
SQL中EXISTS的⽤法⽐如在Northwind数据库中有⼀个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)这⾥⾯的EXISTS是如何运作呢?⼦查询返回的是OrderId字段,可是外⾯的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID⾥⾯啊,这是如何匹配的呢?EXISTS⽤于检查⼦查询是否⾄少会返回⼀⾏数据,该⼦查询实际上并不返回任何数据,⽽是返回值True或FalseEXISTS 指定⼀个⼦查询,检测⾏的存在。
语法: EXISTS subquery参数: subquery 是⼀个受限的 SELECT 语句 (不允许有 COMPUTE ⼦句和 INTO 关键字)。
结果类型: Boolean 如果⼦查询包含⾏,则返回 TRUE ,否则返回 FLASE 。
例表A:TableIn例表B:TableEx(⼀). 在⼦查询中使⽤ NULL 仍然返回结果集select * from TableIn where exists(select null)等同于: select * from TableIn(⼆). ⽐较使⽤ EXISTS 和 IN 的查询。
注意两个查询返回相同的结果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)select * from TableIn where ANAME in(select BNAME from TableEx)(三). ⽐较使⽤ EXISTS 和 = ANY 的查询。
注意两个查询返回相同的结果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)select * from TableIn where ANAME=ANY(select BNAME from TableEx)NOT EXISTS 的作⽤与 EXISTS 正好相反。
数据库EXISTS与NOTEXISTSEXISTS与NOT EXISTSEXISTS:表⽰存在xxx。
在查询的外层添加⼀个EXISTS,当内层查询有结果,则该EXISTS返回true,反之返回falseNOT EXISTS:表⽰不存在xxx。
在查询的外层添加⼀个NOT EXISTS,当内层查询有结果,则该NOT EXISTS返回false,反之返回true##表⽣成的过程 ``` SELECT Sname FROM Student WHERE NOT EXISTS(1) (SELECT * FROM Course WHERE NOT EXISTS(2) (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= o)); ``` ###学⽣表  ###课程表  ###学⽣选课表 以上⾯的为例:⾸先改例⼦中有两个EXISTS,我们先从最⾥⾯的内容开始,当⼀个元组和课程表中的第⼀个元组在最⾥层循环中与SC.sno和o进⾏匹配的时候。
(情况1)若配上最内层的WHERE将该数据插⼊到临时表中,第⼀个NOT EXISTS(指内层的NOT EXISTS,代码中的(2))判断该临时表不为空则返回false。
(情况2)若没有匹配上最内层的WHERE返回false,则不将数据插⼊到临时的表中,第⼀个NOT EXISTS(是内层的NOT EXISTS,代码中的(2))判断结果表为空返回true####当Course循环结束之后 ####第⼆个NOT EXISTS(最外层的NOT EXISTS,代码上的(1))判断该内层返回集是否为空。
上星期五与haier讨论in跟exists的性能问题,正好想起原来公司的一个关于not in的规定,本想做个实验证明我的观点是正确的,但多次实验结果却给了我一个比较大的教训。
我又咨询了下oracle公司工作的朋友,确实是我持有的观点太保守了。
于是写个文章总结下,希望对大家有所启发。
后面可能有大篇是关于10053 trace的内容,只作实验证明,可直接忽略看最终的结论即可。
我们知道,in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists是差别不大的。
但如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in,效率才是最高的。
假定表A(小表),表B(大表),cc列上都有索引:•select * from A where cc in(select ccfrom B); --效率低,用到了A表上cc列的索引•select * from A where exists(select cc from B where cc=A.cc); --效率高,用到了B 表上cc列的索引。
相反的:•select * from B where cc in (select cc from A); --效率高,用到了B表上cc列的索引•select * from B where exists(select ccfromA where cc=); --效率低,用到了A表上cc列的索引通过使用exists,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。
Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。
在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。
oracle中的exists和notexists⽤法详解from:/m136********/article/details/7007197exists表⽰()内⼦查询语句返回结果不为空说明where条件成⽴就会执⾏主sql语句,如果为空就表⽰where条件不成⽴,sql语句就不会执⾏。
not exists和exists相反,⼦查询语句结果为空,则表⽰where条件成⽴,执⾏sql语句。
负责不执⾏。
之前在学的时候,接触过exists,做过⼏个简单的例⼦,,如1.如果部门名称中含有字母A,则查询所有员⼯信息(使⽤exists)select * from emp where exists (select * from dept where dname like '%A%' and deptno = emp.deptno) temp and deptno=temp.deptno;结果为:EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- -------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-12⽉-80 800 207499 ALLEN SALESMAN 7698 20-2⽉ -81 1600 300 307521 WARD SALESMAN 7698 22-2⽉ -81 1250 500 307566 JONES MANAGER 7839 02-4⽉ -81 2975 207654 MARTIN SALESMAN 7698 28-9⽉ -81 1250 1400 307698 BLAKE MANAGER 7839 01-5⽉ -81 2850 307782 CLARK MANAGER 7839 09-6⽉ -81 2450 107788 SCOTT ANALYST 7566 19-4⽉ -87 3000 207839 KING PRESIDENT 17-11⽉-81 5000 107844 TURNER SALESMAN 7698 08-9⽉ -81 1500 0 307876 ADAMS CLERK 7788 23-5⽉ -87 1100 20EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- -------------- ---------- ---------- ----------7900 JAMES CLERK 7698 03-12⽉-81 950 307902 FORD ANALYST 7566 03-12⽉-81 3000 207934 MILLER CLERK 7782 23-1⽉ -82 1300 10已选择14⾏。
oracle中的exists和in⽤法详解以前⼀直不知道exists和in的⽤法与效率,这次的项⽬中需要⽤到,所以⾃⼰研究了⼀下。
下⾯是我举两个例⼦说明两者之间的效率问题。
前⾔概述:“exists”和“in”的效率问题,涉及到效率问题也就是sql优化:1.若⼦查询结果集⽐较⼩,优先使⽤in。
2.若外层查询⽐⼦查询⼩,优先使⽤exists。
原理是:若匹配到结果,则退出内部查询并将条件标志为true,传回全部结果资料因为若⽤in,则oracle会优先查询⼦查询,然后匹配外层查询,原理是:in不管匹配到匹配不到都全部匹配完毕,匹配相等就返回true,就会输出⼀条元素.若使⽤exists,则oracle会优先查询外层表,然后再与内层表匹配也就是:”匹配原则,拿最⼩记录匹配⼤记录。
也就是遍历的次数越少越好"例⼦如下:1) select * from T_USER1 where exists(select 1 from T_USER2 where T_USER1.jxb_id =T_USER2.jxb_id ) ;T_USER1 数据量⼩⽽T_USER2 数据量⾮常⼤时,T_USER1 <<T_USER2 时,1) 的查询效率⾼。
原理解析:以上查询使⽤了exists语句,sql语句如:select a.* from A a where exists(select 1 from B b where =)exists()会执⾏A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false.它的查询过程类似于以下过程:1 List resultSet=[];2 Array A=(select * from A)34for(int i=0;i<A.length;i++) { //这个循环次数越少越好5if(exists(A[i].id) { //执⾏select 1 from B b where b.id=a.id是否有记录返回6 resultSet.add(A[i]);7 }8 }9return resultSet;当B表⽐A表数据⼤时适合使⽤exists(),因为它没有那么遍历操作,只需要再执⾏⼀次查询就⾏.如:A表有10000条记录,B表有1000000条记录,那么exists()会执⾏10000次去判断A表中的id是否与B表中的id相等.如:A表有10000条记录,B表有100000000条记录,那么exists()还是执⾏10000次,因为它只执⾏A.length次,可见B表数据越多,越适合exists()发挥效果再如:A表有10000条记录,B表有100条记录,那么exists()还是执⾏10000次,还不如使⽤in()遍历10000*100次,因为in()是在内存⾥遍历⽐较,⽽exists()需要查询数据库,我们都知道查询数据库所消耗的性能更⾼,⽽内存⽐较很快.2) select * from T_USER1 where T_USER1.jxb_id in (select T_USER2 .jxb_id from T_USER2 ) ;T_USER1 数据量⾮常⼤⽽T_USER2数据量⼩时,T_USER1 >>T_USER2时,2) 的查询效率⾼。
sql中exists用法循环SQL 中的EXISTS 用法和循环在SQL 中,EXISTS 是一个非常有用的关键字,用于检查一个子查询是否返回了任何行。
它返回一个布尔值,即是否存在满足给定条件的行。
这个关键字通常被用于WHERE 子句中,以过滤那些满足条件的行。
在本文中,我们将深入探讨EXISTS 的用法,并探讨它在循环中的应用。
一、EXISTS 的基本用法EXISTS 关键字后面需要跟着一个子查询,来检查该子查询是否返回结果。
如果子查询返回了至少一行数据,则EXISTS 返回True,并将外部查询的结果包含到结果集中。
如果子查询没有返回结果行,则EXISTS 返回False,并不会影响到外部查询结果集。
下面以一个示例来说明EXISTS 的用法:假设有两个表,一个是Customers 表,包含了客户的信息,另一个是Orders 表,包含了客户的订单信息。
我们想要找到至少有一个订单的客户。
可以使用以下SQL 查询语句:SELECT *FROM CustomersWHERE EXISTS (FROM OrdersWHERE Orders.customer_id = Customers.customer_id);在上述示例中,外部查询是从Customers 表中选择所有列,并使用EXISTS 子查询来检查是否存在一个匹配的订单。
如果存在一个匹配的订单,则该客户将被包括在结果集中。
二、EXISTS 在循环中的应用在编写复杂的SQL 查询时,经常需要在结果集中对每一行数据进行操作。
这包括对每一行进行计算、更新或删除等操作。
在这种情况下,可以使用EXISTS 的循环结构来处理每一行数据。
下面以一个示例来说明EXISTS 在循环中的应用:假设我们有一个存储了学生信息的表Students,其中包含学生的姓名、学号和成绩等信息。
我们想要将每个学生的成绩乘以10,并更新回数据库中。
我们可以使用以下SQL 查询语句实现:UPDATE StudentsSET score = score * 10WHERE EXISTS (FROM Students);在上述示例中,我们使用EXISTS 子查询来选择Students 表中的每一行数据,并对每个学生的成绩进行更新。
SET NOCOUNT ON,SET NOCOUNT OFF当SET NOCOUNT 为ON 时,不返回计数(表示受Transact-SQL 语句影响的行数)。
当SET NOCOUNT 为OFF 时,返回计数。
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
SQL中IN和EXISTS用法的区别NOT INSELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN (SELECT MC001 FROM BOMMC)NOT EXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度select DISTINCT MD001 from BOMMD WHERE NOT EXISTS (SELECT MC001 FROM BOMMC where BOMMC.MC001 = BOMMD.MD001)exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。
not exists则相反。
exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。
in和existsin是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select*from A where cc in (select cc from B)效率低,用到了A表上cc列的索引;select*from A where exists(select cc from B where cc=)效率高,用到了B表上cc列的索引。
Oracle SQL NOT EXISTS用法
(1)查询所有未选修“19980201”号课程的学生姓名和班号。
SELECT Sname,classno FROM Student WHERE NOT EXISTS
(SELECT * FROM SC WHERE Sno=Student.Sno
AND schoolno ='19980201')
运行结果如图所示。
(2)查询选修了全部课程的学生姓名和班号。
分析:本例可转为查询没有一门课程不选的学生姓名和班号,代码如下:
SELECT Sname,classno FROM Student WHERE NOT EXISTS
(SELECT * FROM Sc WHERE NOT EXISTS
(SELECT * FROM school WHERE NOT EXISTS
(SELECT * FROM Course WHERE Cno=o AND school.Schoolno=sc.Schoolno AND sc.Sno=Student.Sno)));
运行结果如图所示。
NOT EXISTS用法(1)NOT EXISTS用法(2)
(3)查询至少选修了学生19980001选修的全部课程的学生编号和姓名。
分析:本题的查询要求可做如下解释,查询这样的学生,凡是19980001选修的课,他都选修了;换句话说,若有一个学号为x的学生,对所有课程y,只要学号为19980001的学生选修了课程y,则x也选修了y;那么就将他的学号选出来。
SELECT DISTINCT sno FROM SC SCX WHERE NOT EXISTS
(SELECT * FROM SC SCY WHERE SCY .Sno='19980002' AND NOT EXISTS
(SELECT * FROM SC SCZ WHERE SCZ .Sno= SCX .Sno
AND SCZ.Schoolno=SCY.Schoolno));
运行结果如图所示。
NOT EXISTS用法(3)。