exists和in後邊接子查詢
exists子查詢
Exists關鍵字用來進行子查詢
Exists放在where之後使用,可以看成查詢資料所滿足的一個條件,只是這個條件的值比較特殊(true或false),當子查詢返回資料時則結果為true,沒有資料時結果為false
使用exists子查詢時,一般使用到了外表中的欄位作為子查詢的條件
Exists對外表的每一條記錄進行遍歷,然後根據外表中依賴的條件判斷子查詢中是否可以返回資料
例項:
SELECT s.id sid, s.name sname FROM student s WHERE EXISTS (SELECT * FROM teacher t)
只要techer表中存在資料,子查詢就會有資料,返回true,子查詢一直成立,沒有實際意義
SELECT s.id sid, s.name sname FROM student s
WHERE EXISTS (SELECT * FROM teacher t WHERE s.name = t.name AND t.name = 'cc')
查詢學生名字和老師名字相同,並且老師名字為cc 的資料
Not exists和exists的結果集正好相反
使用子查詢時,要處理好子查詢中所依賴的外部表中的欄位和子查詢表中欄位對應的條件關係
in子查詢
In用於條件查詢,相當於or ,in後邊的子查詢語句只能返回一列值
例項:
查詢student中name和teacher表中name相同的資料
SELECT s.id sid, s.name sname FROM student s WHERE s.name in (SELECT name from teacher)
相當於
SELECT s.id sid, s.name sname FROM student s WHERE s.name = name1 or s.name = name2 …
Not in和in的結果集相反
Exists和in的比較
查詢student表中name值和teacher表中name相同的資料
SELECT s.id sid, s.name sname FROM student s
WHERE EXISTS (SELECT * FROM teacher t WHERE s.name = t.name)
Exists子查詢是遍歷外表然後根據條件去內表中查詢並判斷是否有資料返回,主要用到的是子查詢中表的索引進行的查詢,外表只需要過濾即可,所以影響效率的關鍵在內表及teacher表
SELECT s.id sid, s.name sname FROM student s WHERE s.name in (SELECT name from teacher)
In後邊的子查詢相當於使用or將條件進行拼接,所以真正查詢時主要操作的還是外表,及影響效率的關鍵在外表及student表