第一次把二者關聯起來, 仍是在背 sql 優化方面的面試題時。 有一條是這麼說的: 當 sql 語句中出現 in 或 not in 時, 用 exists 或 not exists 代替。然而我在實際開發中,仍是習慣使用 in 關鍵字,就在最近一次開發中,忽然想試試 exist ,可是替換以後運行的結果出乎個人意料。面試
selec realname from student where id in (1, 2, 3); # 從學生表中查出來 id 爲 1 或 2 或 3的學生姓名。
sql
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
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)
select
`1 A1 2 A2`
緣由能夠按照以下分析語法
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)數據
--->SELECT * FROM B WHERE B.AID=1有值返回真因此有數據co
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
--->SELECT * FROM B WHERE B.AID=2有值返回真因此有數據
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
--->SELECT * FROM B WHERE B.AID=3無值返回真因此沒有數據