sql 语句 中的 exits 和 in 关键字

开篇

第一次把二者关联起来, 仍是在背 sql 优化方面的面试题时。 有一条是这么说的: 当 sql 语句中出现 in 或 not in 时, 用 exists 或 not exists 代替。然而我在实际开发中,仍是习惯使用 in 关键字,就在最近一次开发中,忽然想试试 exist ,可是替换以后运行的结果出乎个人意料。面试


应用

先来看一条 sql

selec realname from student where id in (1, 2, 3); # 从学生表中查出来 id 为 1 或 2 或 3的学生姓名。sql

用 exits 代替 in

select realname from student where id exists in (1, 2, 3);优化

运行

控制台提示了一条错误信息 “exists 关键字附近出现了语法错误”code


结论

懵圈了片刻以后, 便开始了个人探索之旅。 最终的结果以下:exits 的用法是 select 字段1,字段2 from TableA where exits (select 字段 from TableB where 条件) exits 后面的语句返回的是一个 Boolean 类型的数据。若是exits 返回 true, 那么就从 TableA 查出符合条件的数据。开发

先看两张表

`表A
ID  NAME
1   A1
2   A2
3   A3

表B
ID AID NAME
1   1     B1
2   2     B2  
3   2     B3
`

表A和表B是1对多的关系 A.ID => B.AIDit

exits 的使用

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)select

执行结果为

`1 A1
 2 A2`

缘由能够按照以下分析语法

  1. SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)数据

    --->SELECT * FROM B WHERE B.AID=1有值返回真因此有数据co

  2. SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)

    --->SELECT * FROM B WHERE B.AID=2有值返回真因此有数据

  3. SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)

    --->SELECT * FROM B WHERE B.AID=3无值返回真因此没有数据

相关文章
相关标签/搜索