当前位置:   article > 正文

sql查询篇,exists和not exists的使用_oracle exists用法

oracle exists用法

目录

一、oracle中exists用法

二、例句

1.准备工作

2. exists和not exists的使用

3. 判断表或某个值是否存在

4. exists和in子句的使用场景

5. oracle数据库 in 子句表达式值数量1000报错的问题


一、oracle中exists用法

exists语句用来判断()内的表达式是否存在返回值, 如果存在就返回true,where条件成立,前面的主sql语句执行。如果不存在就返回false,where条件不成立,sql语句就不会执行。

not exists和exists相反,子查询语句结果为空,此时返回true,则表示where条件成立,执行主sql语句,否则不执行。

使用exists时, 它只要括号中的表达式有一个值存在, 就立刻返回true,而不用遍历表中所有的数据。在一定场景使用可以提高SQL的执行效率。

二、例句

1.准备工作

建立测试表:

  1. create table tb0A
  2. (
  3. id NUMBER(15) not null,
  4. ac003 VARCHAR2(40) not null,
  5. ab001 VARCHAR2(40) not null,
  6. STATUS VARCHAR2(5) not null,
  7. addtime DATE
  8. );
  9. comment on table tb0A
  10. is '人员';
  11. -- Add comments to the columns
  12. comment on column tb0A.id
  13. is 'ID';
  14. comment on column tb0A.ac003
  15. is '姓名';
  16. comment on column tb0A.ab001
  17. is '单位号';
  18. comment on column tb0A.STATUS
  19. is '状态,0未处理,1已处理';
  20. comment on column tb0A.addtime
  21. is '添加时间';
  22. create table tb0B
  23. (
  24. id NUMBER(15) not null,
  25. ac003 VARCHAR2(40) not null,
  26. ab001 VARCHAR2(40) not null,
  27. res01 VARCHAR2(40),
  28. addtime DATE
  29. );
  30. comment on table tb0B
  31. is '接口对接记录表';
  32. -- Add comments to the columns
  33. comment on column tb0B.id
  34. is 'ID';
  35. comment on column tb0B.ac003
  36. is '姓名';
  37. comment on column tb0B.ab001
  38. is '单位号';
  39. comment on column tb0B.res01
  40. is '接口返回状态,001成功,002失败';
  41. comment on column tb0B.addtime
  42. is '添加时间';
  43. create table tb0C
  44. (
  45. id NUMBER(15) not null,
  46. ac003 VARCHAR2(40) not null,
  47. ab001 VARCHAR2(40) not null,
  48. ae014 VARCHAR2(5) not null,
  49. addtime DATE
  50. );
  51. comment on table tb0C
  52. is '单位职工状态';
  53. -- Add comments to the columns
  54. comment on column tb0C.id
  55. is 'ID';
  56. comment on column tb0C.ac003
  57. is '姓名';
  58. comment on column tb0C.ab001
  59. is '单位号';
  60. comment on column tb0C.ae014
  61. is '在职状态,0,在职,1退休,2试用期';
  62. comment on column tb0C.addtime
  63. is '添加时间';
  64. --查询
  65. select * from tb0A;
  66. select * from tb0B;
  67. select * from tb0C;
  68. --插入语句
  69. insert into tb0A(id,Ac003,Ab001,Status,Addtime) values(1,'菜哥1','11123','0',sysdate);
  70. insert into tb0A(id,Ac003,Ab001,Status,Addtime) values(2,'小明','11123','1',sysdate);
  71. insert into tb0A(id,Ac003,Ab001,Status,Addtime) values(3,'小众','11123','0',sysdate);
  72. insert into tb0A(id,Ac003,Ab001,Status,Addtime) values(4,'张哥','11123','0',sysdate);
  73. insert into tb0A(id,Ac003,Ab001,Status,Addtime) values(5,'张嫂','11135','0',sysdate);
  74. insert into tb0A(id,Ac003,Ab001,Status,Addtime) values(6,'强哥','11135','0',sysdate);
  75. insert into tb0B(id,Ac003,Ab001,res01,Addtime) values(1,'菜哥1','11123','001',sysdate);
  76. insert into tb0B(id,Ac003,Ab001,res01,Addtime) values(2,'小明','11123','002',sysdate);
  77. insert into tb0B(id,Ac003,Ab001,res01,Addtime) values(8,'小众','11123','002',sysdate);
  78. insert into tb0B(id,Ac003,Ab001,res01,Addtime) values(4,'张哥','11123','002',sysdate);
  79. insert into tb0B(id,Ac003,Ab001,res01,Addtime) values(5,'张嫂','11135','002',sysdate);
  80. insert into tb0B(id,Ac003,Ab001,res01,Addtime) values(7,'强哥','11135','001',sysdate);
  81. insert into tb0C(id,Ac003,Ab001,ae014,Addtime) values(1,'菜哥1','11123','0',sysdate);
  82. insert into tb0C(id,Ac003,Ab001,ae014,Addtime) values(2,'小明','11123','0',sysdate);
  83. insert into tb0C(id,Ac003,Ab001,ae014,Addtime) values(3,'小众','11123','1',sysdate);
  84. insert into tb0C(id,Ac003,Ab001,ae014,Addtime) values(4,'张哥','11123','1',sysdate);
  85. insert into tb0C(id,Ac003,Ab001,ae014,Addtime) values(5,'张嫂','11135','0',sysdate);
  86. insert into tb0C(id,Ac003,Ab001,ae014,Addtime) values(6,'强哥','11135','0',sysdate);

2. exists和not exists的使用

  1. --exists的使用,查询tb0A表和tb0B表,id关联相等、单位号相等、Status为0的数据
  2. select * from tb0A where exists(select 1 from tb0B Where tb0A.id = tb0B.id and tb0A.ab001='11123' and tb0A.status='0')--查询tb0A
  3. select * from tb0B where exists(select 1 from tb0A Where tb0A.id = tb0B.id and tb0A.ab001='11123' and tb0A.status='0')--查询tb0B
  4. --也可以 delete 删除使用
  5. delete from tb0B where exists(select 1 from tb0A Where tb0A.id = tb0B.id and tb0A.ab001='11123' and tb0A.status='0')
  6. --not exists的使用
  7. select * from tb0A where not exists(select 1 from tb0B Where tb0A.id = tb0B.id and tb0A.ab001='11123' and tb0A.status='0')
  8. --exists的使用,查询tb0A表和tb0B表,id关联相等、单位号相等、Status为0的数据
  9. --增加tb0C表联查出两个表的数据显示,且tb0C表中 ae014为0的
  10. select * from tb0A,tb0C where exists(select 1 from tb0B Where tb0A.id = tb0B.id and tb0A.ab001='11123' and tb0A.status='0')
  11. and tb0A.id=tb0C.id and tb0C.Ae014='0'
  12. --exists的使用,查询tb0A表和tb0B表,id关联相等、单位号相等、Status为0的数据
  13. --只显示tb0A表的数据,且tb0C表中 ae014为0的
  14. select * from tb0A where exists(select 1 from tb0B,tb0C Where tb0A.id = tb0B.id and tb0A.ab001='11123' and tb0A.status='0'
  15. and tb0A.id = tb0C.id and tb0C.Ae014='0')

3. 判断表或某个值是否存在

  1. --判断TB0A表是否存在
  2. select 1 from dual where EXISTS( SELECT 1 FROM User_Tables WHERE table_name = 'TB0A')
  3. --也可以这样写,返回结果为条数
  4. SELECT COUNT(1) FROM User_Tables WHERE table_name = 'TB0A';
  5. --判断tb0c表中ab001 = '11123'的是否存在
  6. select 1 from dual where EXISTS(SELECT 1 FROM tb0c WHERE ab001 = '11123')
  7. --也可以这样写,此例中返回结果为4
  8. SELECT COUNT(1) FROM tb0c WHERE ab001 = '11123';

注:此例说明

使用exists时, 它只要括号中的表达式有一个值存在, 就立刻返回true,而不用遍历表中所有的数据。在一定场景使用可以提高SQL的执行效率。
select 1 from dual where EXISTS(SELECT 1 FROM tb0c WHERE ab001 = '11123')--使用EXISTS只查找到第一条ab001 = '11123'就返回true。
SELECT COUNT(1) FROM tb0c WHERE ab001 = '11123';--count需要查找表中所有ab001 = '11123'的数据。

4. exists和in子句的使用场景

--当b表的数据量远大于a表,使用exists的查询效率高。相反则使用in子句

select * from a where exists(select 1 from b where a.id=b.id);
select * from a where id in (select id from b) ;


5. oracle数据库 in 子句表达式值数量1000报错的问题

select * from a where id in ('1','2','3',····);--在oracle中使用in,其括号内列表允许最大的数量为1000,超出报错。列表传值时注意。其它数据库貌似不受影响。

select * from a where id in (select id from b) ;--在容量上,这种语句在oracle,mysql ...等数据库都不受1000报错的影响。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/479967
推荐阅读
相关标签
  

闽ICP备14008679号