SQL中EXISTS的用法 EXISTS和IN的区别介绍

编辑: 挽木琴
360集合包
360集合包
360集合包,一键装机、快捷方便。
立即下载   精品合集

  EXISTS在SQL中的作用是检验查询是否返回数据,与“IN”是有明显区别的。在下文中,小编将给大家介绍SQL中EXISTS的用法以及EXISTS和IN的区别介绍,有兴趣的伙伴,可以阅读下文了解。

  SQL中EXISTS的用法:

  比如在Northwind数据库中有一个查询为

  SELECT c.CustomerId,CompanyName FROM Customers c

  WHERE EXISTS(

  SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)

  这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢?

  EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False

  EXISTS 指定一个子查询,检测行的存在。

  语法: 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 正好相反。如果子查询没有返回行,则满足了 NOT EXISTS 中的 WHERE 子句。

  结论:

  EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT 。。。 FROM.。。), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

  一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

  分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。

  WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。

  分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

  在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。

  INSERT INTO TableIn (ANAME,ASEX)

  SELECT top 1 ‘张三’, ‘男’ FROM TableIn

  WHERE not exists (select * from TableIn where TableIn.AID = 7)

  EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:

  IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

  in、not in、exists和not exists的区别:

  先谈谈in和exists的区别:

  exists:存在,后面一般都是子查询,当子查询返回行数时,exists返回true。

  select * from class where exists (select‘x“form stu where stu.cid=class.cid)

  当in和exists在查询效率上比较时,in查询的效率快于exists的查询效率

  exists(xxxxx)后面的子查询被称做相关子查询, 他是不返回列表的值的。

  只是返回一个ture或false的结果(这也是为什么子查询里是select ’x‘的原因 当然也可以

  select任何东西) 也就是它只在乎括号里的数据能不能查找出来,是否存在这样的记录。

  其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果存在,返回ture则输

  出,反之返回false则不输出,再根据主查询中的每一行去子查询里去查询。

  执行顺序如下:

  1、首先执行一次外部查询

  2、对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当

  前行的值。

  3、使用子查询的结果来确定外部查询的结果集。

  如果外部查询返回100行,SQL 就将执行101次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。

  in:包含

  查询和所有女生年龄相同的男生

  select * from stu where sex=’男‘ and age in(select age from stu where sex=’女‘)

  in()后面的子查询 是返回结果集的,换句话说执行次序和exists()不一样。子查询先产生结果集,

  然后主查询再去结果集里去找符合要求的字段列表去。符合要求的输出,反之则不输出。

  not in和not exists的区别:

  not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,

  例如:查询那些班级中没有学生的,

  select * from class where cid not in(select distinct cid from stu)

  当表中cid存在null值,not in 不对空值进行处理

  解决:select * from class

  where cid not in

  (select distinct cid from stu where cid is not null)

  not in的执行顺序是:是在表中一条记录一条记录的查询(查询每条记录)符合要求的就返回结果集,不符合的就继续查询下一条记录,直到把表中的记录查询完。也就是说为了证明找不到,所以只能查询全部记录才能证明。并没有用到索引。

  not exists:如果主查询表中记录少,子查询表中记录多,并有索引。

  例如:查询那些班级中没有学生的,

  select * from class2

  where not exists

  (select * from stu1 where stu1.cid =class2.cid)

  not exists的执行顺序是:在表中查询,是根据索引查询的,如果存在就返回true,如果不存在就返回false,不会每条记录都去查询。

  之所以要多用not exists,而不用not in,也就是not exists查询的效率远远高与not in查询的效率。

  实例:

  exists,not exists的使用方法示例,需要的朋友可以参考下。

  学生表:create table student( id number(8) primary key, name varchar2(10),deptment number(8))

  选课表:create table select_course( ID NUMBER(8) primary key, STUDENT_ID NUMBER(8) foreign key (COURSE_ID) references course(ID), COURSE_ID NUMBER(8) foreign key (STUDENT_ID) references student(ID))

  课程表:create table COURSE( ID NUMBER(8) not null, C_NAME VARCHAR2(20), C_NO VARCHAR2(10))

  student表的数据: ID NAME DEPTMENT_ID---------- --------------- ----------- 1 echo 1000 2 spring 2000 3 smith 1000 4 liter 2000

  course表的数据: ID C_NAME C_NO---------- -------------------- -------- 1 数据库 data1 2 数学 month1 3 英语 english1

  select_course表的数据: ID STUDENT_ID COURSE_ID---------- ---------- ---------- 1 1 1 2 1 2 3 1 3 4 2 1 5 2 2 6 3 2

  1、查询选修了所有课程的学生id、name:(即这一个学生没有一门课程他没有选的。)

  分析:如果有一门课没有选,则此时(1)select * from select_course sc where sc.student_id=ts.id

  and sc.course_id=c.id存在null,

  这说明(2)select * from course c 的查询结果中确实有记录不存在(1查询中),查询结果返回没有选的课程,

  此时select * from t_student ts 后的not exists 判断结果为false,不执行查询。

  SQL》 select * from t_student ts where not exists (select * from course c where not exists (select * from select_course sc where sc.student_id=ts.id and sc.course_id=c.id));

  ID NAME DEPTMENT_ID---------- --------------- ----------- 1 echo 1000

  2、查询没有选择所有课程的学生,即没有全选的学生。(存在这样的一个学生,他至少有一门课没有选),

  分析:只要有一个门没有选,即select * from select_course sc where student_id=t_student.id and course_id=course.id 有一条为空,即not exists null 为true,此时select * from course有查询结果(id为子查询中的course.id ),

  因此select id,name from t_student 将执行查询(id为子查询中t_student.id )。

  SQL》 select id,name from t_student where exists

  (select * from course where not exists

  (select * from select_course sc where student_id=t_student.id and course_id=course.id));

  ID NAME---------- --------------- 2 spring 3 smith 4 liter

  3、查询一门课也没有选的学生。(不存这样的一个学生,他至少选修一门课程),

  分析:如果他选修了一门select * from course结果集不为空,not exists 判断结果为false;

  select id,name from t_student 不执行查询。

  SQL》 select id,name from t_student where not exists

  (select * from course where exists

  (select * from select_course sc where student_id=t_student.id and course_id=course.id));

  ID NAME---------- --------------- 4 liter

  4、查询至少选修了一门课程的学生。SQL》 select id,name from t_student where exists

  (select * from course where exists

  (select * from select_course sc where student_id=t_student.id and course_id=course.id));

  ID NAME---------- --------------- 1 echo 2 spring 3 smith

  关于SQL中EXISTS的用法就给大家讲解到这里了,希望小编的整理对大家有所帮助!

相关推荐
最新软件
最新教程
1.1740
基本信息
SQL
$_GET
$_POST
$_COOKIE
包含文件
自动加载
  1. 模型: /www/wwwroot/www.pjwan.com/lecms/model/
  2. 视图: /www/wwwroot/www.pjwan.com/view/m/xt_show.htm
  3. 控制器: /www/wwwroot/www.pjwan.com/lecms/control/show_control.class.php
  4. 日志目录: /www/wwwroot/www.pjwan.com/log/
  5. 当前页面: /www/wwwroot/www.pjwan.com/index.php
  6. 当前时间: 2026-08-19 05:33:17
  7. 当前网协: 216.73.216.186
  8. 请求路径: /anzhuang/23617.html
  9. 运行时间: 1.1740
  10. 内存开销: 1.11 MB
  1. #0 [time:0.0003s] SELECT * FROM le_runtime WHERE k='cfg' LIMIT 1
  2. #1 [time:0.0002s] SELECT * FROM le_runtime WHERE k='website_group_m_pjwan_com' LIMIT 1
  3. #2 [time:0.0003s] SELECT id FROM le_website_group WHERE webdomain='m.pjwan.com' AND is_active=1 ORDER BY id ASC LIMIT 0,1
  4. #3 [time:0.0003s] SELECT id FROM le_website_group WHERE webdomain='m.pjwan.com' AND is_active=1 ORDER BY id ASC LIMIT 0,1
  5. #4 [time:0.0003s] SELECT id FROM le_website_group WHERE webdomain='m.pjwan.com' AND is_active=1 ORDER BY id ASC LIMIT 0,1
  6. #5 [time:0.0003s] SELECT * FROM le_runtime WHERE k='cate_68' LIMIT 1
  7. #6 [time:0.0002s] SELECT id FROM le_website_group WHERE webdomain='m.pjwan.com' AND is_active=1 ORDER BY id ASC LIMIT 0,1
  8. #7 [time:0.0004s] SELECT * FROM le_cms_article WHERE id=23617 LIMIT 1
  9. #8 [time:0.0002s] SELECT id FROM le_website_group WHERE webdomain='m.pjwan.com' AND is_active=1 ORDER BY id ASC LIMIT 0,1
  10. #9 [time:0.0002s] SELECT id FROM le_website_group WHERE webdomain='m.pjwan.com' AND is_active=1 ORDER BY id ASC LIMIT 0,1
  11. #10 [time:0.0003s] SELECT * FROM le_user WHERE uid=2 LIMIT 1
  12. #11 [time:0.0208s] SELECT * FROM le_cms_article_data WHERE id=23617 LIMIT 1
  13. #12 [time:0.0003s] SELECT * FROM le_cms_article_views WHERE id=23617 LIMIT 1
  14. #13 [time:0.0003s] UPDATE LOW_PRIORITY le_cms_article_views SET views=views+1 WHERE id=23617 LIMIT 1
  15. #14 [time:0.0002s] SELECT * FROM le_kv WHERE k='navigate' LIMIT 1
  16. #15 [time:0.0002s] SELECT * FROM le_kv WHERE k='le_sharejs' LIMIT 1
  17. #16 [time:0.0003s] SELECT tagid,id FROM le_cms_article_tag_data WHERE tagid=540 ORDER BY id DESC LIMIT 0,6
  18. #17 [time:0.0003s] SELECT * FROM le_cms_article_tag_data WHERE tagid=540 AND id=99775 OR tagid=540 AND id=94539 OR tagid=540 AND id=88674 OR tagid=540 AND id=86452 OR tagid=540 AND id=84052 OR tagid=540 AND id=83840
  19. #18 [time:0.0003s] SELECT * FROM le_cms_article WHERE id=99775 OR id=94539 OR id=88674 OR id=86452 OR id=84052
  20. #19 [time:0.0002s] SELECT * FROM le_runtime WHERE k='cate_1' LIMIT 1
  21. #20 [time:0.0002s] SELECT id FROM le_website_group WHERE webdomain='m.pjwan.com' AND is_active=1 ORDER BY id ASC LIMIT 0,1
  22. #21 [time:0.0005s] SELECT id FROM le_cms_pcsoft WHERE (cid=3 OR cid=4 OR cid=5 OR cid=6 OR cid=7 OR cid=8 OR cid=9 OR cid=10 OR cid=11 OR cid=12 OR cid=13) ORDER BY id DESC LIMIT 0,8
  23. #22 [time:0.0004s] SELECT * FROM le_cms_pcsoft WHERE id=681 OR id=680 OR id=679 OR id=678 OR id=677 OR id=676 OR id=675 OR id=674
  24. #23 [time:0.0002s] SELECT * FROM le_user WHERE uid=1 LIMIT 1
  25. #24 [time:0.0002s] SELECT id FROM le_cms_article WHERE cid=68 ORDER BY id DESC LIMIT 0,5
  26. #25 [time:0.0003s] SELECT * FROM le_cms_article WHERE id=79666 OR id=79665 OR id=79664 OR id=79663 OR id=79662
  1. #control => show
  2. #action => index
  3. #cid => 68
  4. #id => 23617
  5. #mid => 2
    1. #PHPSESSID => qo51ggrchkou86rvdbq4mf5ucd
    2. #acw_tc => 0819529e17870887954535051e20544c215a33b4f53396202d9a69fc82
    3. #cdn_sec_tc => 0819529e17870887954535051e20544c215a33b4f53396202d9a69fc82
    1. #0 /www/wwwroot/www.pjwan.com/index.php
    2. #1 /www/wwwroot/www.pjwan.com/lecms/xiunophp/xiunophp.php
    3. #2 /www/wwwroot/www.pjwan.com/lecms/config/config.inc.php
    4. #3 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/base.func.php
    5. #4 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/core.class.php
    6. #5 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/debug.class.php
    7. #6 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/log.class.php
    8. #7 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/model.class.php
    9. #8 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/view.class.php
    10. #9 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/control.class.php
    11. #10 /www/wwwroot/www.pjwan.com/lecms/xiunophp/db/db.interface.php
    12. #11 /www/wwwroot/www.pjwan.com/lecms/xiunophp/db/db_pdo_mysql.class.php
    13. #12 /www/wwwroot/www.pjwan.com/lecms/xiunophp/cache/cache.interface.php
    14. #13 /www/wwwroot/www.pjwan.com/lecms/xiunophp/cache/cache_memcache.class.php
    15. #14 /www/wwwroot/www.pjwan.com/lecms/xiunophp/ext/network/Network__interface.php
    16. #15 /www/wwwroot/www.pjwan.com/lecms/config/plugin.inc.php
    17. #16 /www/wwwroot/www.pjwan.com/lecms/plugin/editor_sd/conf.php
    18. #17 /www/wwwroot/www.pjwan.com/lecms/plugin/editor_tinymce/conf.php
    19. #18 /www/wwwroot/www.pjwan.com/lecms/plugin/editor_um/conf.php
    20. #19 /www/wwwroot/www.pjwan.com/lecms/plugin/le_adminer/conf.php
    21. #20 /www/wwwroot/www.pjwan.com/lecms/plugin/le_baidu_zz/conf.php
    22. #21 /www/wwwroot/www.pjwan.com/lecms/plugin/le_category_filter/conf.php
    23. #22 /www/wwwroot/www.pjwan.com/lecms/plugin/le_content_tag_url/conf.php
    24. #23 /www/wwwroot/www.pjwan.com/lecms/plugin/le_data_table_split/conf.php
    25. #24 /www/wwwroot/www.pjwan.com/lecms/plugin/le_drafts/conf.php
    26. #25 /www/wwwroot/www.pjwan.com/lecms/plugin/le_feedback/conf.php
    27. #26 /www/wwwroot/www.pjwan.com/lecms/plugin/le_homepage_feign/conf.php
    28. #27 /www/wwwroot/www.pjwan.com/lecms/plugin/le_html_cache/conf.php
    29. #28 /www/wwwroot/www.pjwan.com/lecms/plugin/le_links/conf.php
    30. #29 /www/wwwroot/www.pjwan.com/lecms/plugin/le_minganci_do/conf.php
    31. #30 /www/wwwroot/www.pjwan.com/lecms/plugin/le_rand404content/conf.php
    32. #31 /www/wwwroot/www.pjwan.com/lecms/plugin/le_rand_author/conf.php
    33. #32 /www/wwwroot/www.pjwan.com/lecms/plugin/le_rand_pic_cid/conf.php
    34. #33 /www/wwwroot/www.pjwan.com/lecms/plugin/le_sharejs/conf.php
    35. #34 /www/wwwroot/www.pjwan.com/lecms/plugin/le_slide/conf.php
    36. #35 /www/wwwroot/www.pjwan.com/lecms/plugin/le_special_pro/conf.php
    37. #36 /www/wwwroot/www.pjwan.com/lecms/plugin/le_spider/conf.php
    38. #37 /www/wwwroot/www.pjwan.com/lecms/plugin/le_super_sitemap/conf.php
    39. #38 /www/wwwroot/www.pjwan.com/lecms/plugin/le_title_pic/conf.php
    40. #39 /www/wwwroot/www.pjwan.com/lecms/plugin/le_use_del_id/conf.php
    41. #40 /www/wwwroot/www.pjwan.com/lecms/plugin/le_webp_oss/conf.php
    42. #41 /www/wwwroot/www.pjwan.com/lecms/plugin/le_website_group/conf.php
    43. #42 /www/wwwroot/www.pjwan.com/lecms/plugin/le_zhanqunsitemaps_pro_v303/conf.php
    44. #43 /www/wwwroot/www.pjwan.com/lecms/plugin/lu_huochetou/conf.php
    45. #44 /www/wwwroot/www.pjwan.com/lecms/plugin/models_filed/conf.php
    46. #45 /www/wwwroot/www.pjwan.com/lecms/plugin/qrcode/conf.php
    47. #46 /www/wwwroot/www.pjwan.com/lecms/plugin/sy_mobile/conf.php
    48. #47 /www/wwwroot/www.pjwan.com/runcache/misc.func.php
    49. #48 /www/wwwroot/www.pjwan.com/runcache/core_lang/zh-cn.php
    50. #49 /www/wwwroot/www.pjwan.com/runcache/lang/zh-cn.php
    51. #50 /www/wwwroot/www.pjwan.com/runcache/lecms_control/parseurl_control.class.php
    52. #51 /www/wwwroot/www.pjwan.com/runcache/lecms_model/runtime_model.class.php
    53. #52 /www/wwwroot/www.pjwan.com/runcache/lecms_model/website_group_model.class.php
    54. #53 /www/wwwroot/www.pjwan.com/runcache/lecms_control/show_control.class.php
    55. #54 /www/wwwroot/www.pjwan.com/runcache/lecms_control/base_control.class.php
    56. #55 /www/wwwroot/www.pjwan.com/runcache/lecms_model/urls_model.class.php
    57. #56 /www/wwwroot/www.pjwan.com/runcache/lecms_model/category_model.class.php
    58. #57 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_model.class.php
    59. #58 /www/wwwroot/www.pjwan.com/runcache/lecms_view/m,xt_show.htm.php
    60. #59 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_data_model.class.php
    61. #60 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_tag_model.class.php
    62. #61 /www/wwwroot/www.pjwan.com/runcache/lecms_model/user_model.class.php
    63. #62 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_views_model.class.php
    64. #63 /www/wwwroot/www.pjwan.com/runcache/lecms_model/kv_model.class.php
    65. #64 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_tag_data_model.class.php
    66. #65 /www/wwwroot/www.pjwan.com/lecms/xiunophp/ext/utf8.class.php
    67. #66 /www/wwwroot/www.pjwan.com/lecms/xiunophp/tpl/sys_trace.php
    1. #0 utf8 类