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無值返回真因此沒有數據

相關文章
相關標籤/搜索