用法
exists: ()內子查詢語句傳回結果不為空,說明where條件成立就會執行主sql語句。如果為空就表示where條件不成立,sql語句就不會執行。 not exists 和 exists相反,子查詢語句結果為空,則表示where條件成立,執行sql語句。否則不執行。
exists : 強調是否回傳結果集,不要求知道回傳什麼,與in的差別就是,in只能傳回一個欄位值,exists允許傳回多個欄位。如:
1
2
select name from student
where sex = 'm' and mark exists(select 1 from grade where ...)
exists引導的子句有結果集返回,那麼exists這個條件就算成立了,返回的字段始終為1,這個數字沒有意義。所以exists子句不在乎回傳什麼,而是在乎是不是有結果集回傳。
exists(sql回傳的結果為真)not exists(sql不回傳的結果為真)
exists效率一般優於in,使用EXISTS,會先檢查主查詢,然後執行子查詢知道它找到第一個符合項,這就節省了時間。IN子查詢時,先執行子查詢,並將所得的結果清單存放在一個加了索引的暫存表中。
exists效率優於distinct,當提交一對多表資料的查詢時,避免在 SELECT 子句中使用 DISTINCT
exists適合外表的結果集小的情況
in適合內表小的情況