SQL中的Exist操作
exists用于檢查一個子查詢是否至少會返回一行數據(即檢測行的存在),返回值為true或false。
語法: exists subquery
參數: subquery是一個受限的select語句(不允許有compute子句和into關鍵字),該語句返回一個結果集。
結果類型: boolean類型——如果子查詢包含行,則返回true,否則返回false,即言:exists根據subquery的結果集是否為空來返回一個布爾值——如果不為空則返回true,否則返回false。
以例子說明其使用方法:
table1table2
id class_nameid name class_id
01一年級 01 張三01
02二年級 02 李四02
03三年級 04 王五04
1、在子查詢中使用NULL仍然返回結果集:select * from table1 where exists(select null),該條sql語句等同于:select * from table1,其查詢結果為:
id class_name
01一年級
02二年級
03三年級
2、select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = t1.id),該條sql語句等同于:select t1.id,t1.class_name from table1 t1 where t1.id in (select t2.class_id from table2 t2 where t2.class_id = t1.id),其查詢的結果為:
id class_name
01一年級
02二年級
其查詢過程為:
select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = '01')
---> select * from table2 t2 where t2.class_id = '01'有數據存在,所以exists返回true;
select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = '02')
---> select * from table2 t2 where t2.class_id = '02'有數據存在,所以exists返回true;
select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = '03')
---> select * from table2 t2 where t2.class_id = '03'沒有數據存在,所以exists返回false;
這種執行過程可以通俗的理解為:將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則exists子句返回true,這一行可作為外查詢的結果行,否則不能作為結果。
分析器會先看語句的第一個詞,當它發現第一個詞是select關鍵字的時候,它會跳到from關鍵字,然后通過from關鍵字找到表名并把表裝入內存,接著是找where關鍵字,如果找不到則返回到select找字段解析,如果找到where,則分析其中的條件,完成后再回到select分析字段,最后形成一張虛表。
where關鍵字后面的是條件表達式,條件表達式計算完成后,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。如果為正則執行select語句,否則不執行select語句。
分析器先找到關鍵字select,然后跳到from關鍵字,將該關鍵字后面的表導入內存,并通過指針找到第一條記錄,接著找到where關鍵字計算它的條件表達式,如果為真那么把這條記錄裝到一個虛表當中,指針再指向下一條記錄。如果為假那么指針直接指向下一條記錄,而不進行其它操作。一直檢索完整個表,并把檢索出來的虛擬表返回給用戶。exists是條件表達式的一部分,它也有一個返回值(true或false)。
在插入記錄前,需要檢查這條記錄是否已經存在,只有當記錄不存在時才執行插入操作,可以通過使用EXISTS條件句防止插入重復記錄。
insert into table1 (id,class_name) values ('03','四年級') where not exists (select * from table1 where table1 = '03')
exists與in的區別:
1、in引導的子句只能返回一個字段,exists子句可以有多個字段;
2、通常情況下采用exists要比in效率高,因為in不走索引,但要但要具體情況具體分析:in適合于外表大而內表小的情況;exists適合于外表小而內表大的情況。
轉載于:https://www.cnblogs.com/jpit/p/8317176.html
總結
以上是生活随笔為你收集整理的SQL中的Exist操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 借助Docker单机秒开数十万TCP连接
- 下一篇: ssm框架的整合搭建(一)