sqlexistson
❶ 請教下關於sql的EXISTS的問題
第二個不能得到正確的結果,而對exists效率較為低下,此處不如使用謂詞,但是謂詞的效率也是較低的!
select id from [table1] where 狀態=0 and id in (select id_1 from [table2] where 名字='nn')
其實你的語句也不必加連接的。
select id from [table1] where 狀態=0 and exists(select id_1 from [table2] where 名字'nn')
這兩句前一句效率稍高,但都不是最佳的方案。要想提高效率,不如使用聯想合查詢:
select id from [table1] join [table2] on id_1 = id where 狀態=0 and 名字='nn'
這種聯合查詢的效率遠遠高於謂詞與exits方法。
方法2中兩個語句在執行時,沒有任何的關系,再執行第二句時會找不到id_1而出現失敗。所沒有效率可言。
❷ sql語句中in的用法
你這樣構造in的范圍不對。你這樣是把in後面處理成一個字元串了。而in後面跟的應該是一個范圍。
你可以自己寫一個返回數據集的函數來將aa.ddid值處理成in的范圍,
類似於:
假設函數:
ft01(nvarchar(1000))
returns
table
tb
(val
int)。
那麼,
這樣更新裡面子查詢的in條件:
where
id
in
(select
val
from
ft01(aa.ddid))。
另外,
此解決方法只是從in條件上來說。
如果子查詢只有1條記錄,in和=是沒有區別,如果子查詢有多條記錄,用=會出錯的,所以in是無論只查詢有多少條記錄都可以使用,而=只有當子查詢只有1條記錄的時候才能使用。
in和exists理解上其實是差不多,但對資料庫而言,in的執行順序是先執行只查詢條件,然後把記錄和外查詢核對,找符合條件的。
而exists是先執行外查詢,再執行子查詢,找到外查詢記錄後和只查詢對比符合條件的,如果外查詢和子查詢的條目數差異很大,那麼效率相差很明顯的。
❸ sql 執行錯誤 當沒有用EXISTS 引入子查詢時 在選擇列表中只能指定一個表達式
因為set Fnote= 這後面是只能給一個值得。現在估計有復數個,所以有問題。解決方法如下:
1、創建一個臨時表,IFOBJECT_ID('tempdb..#tmp1') IS NOT NULL DROP TABLE #tmp1; CREATE TABLE #tmp1(Col1 varchar(50),Col2 varchar(200));。
❹ SQL關於EXISTS的使用問題!!
陳冠希同學妹選的課程? 好像表結構裡面. 沒看到親屬關系的欄位啊...
不知道是不是 「未選」 啊 ...
已選課程的課程號
SELECT
study.cid
FROM
student JOIN study ON(student.sid = study.sid)
WHERE
student.sname = '陳冠希';
未選課程的課程號
SELECT
course.cid
FROM
course
WHERE
NOT EXISTS (
SELECT
study.cid
FROM
student JOIN study ON(student.sid = study.sid)
WHERE
student.sname = '陳冠希'
AND study.cid = course.cid
);
❺ SQL語句中 in和exist區別
in 和 exists也是很好區別的.
in 是一個集合運算符.
a in {a,c,d,s,d....}
這個運算中,前面是一個元素,後面是一個集合,集合中的元素類型是和前面的元素一樣的.
而exists是一個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.
in 運算用在語句中,它後面帶的select 一定是選一個欄位,而不是select *.
比如說你要判斷某班是否存在一個名為"小明"的學生,你可以用in 運算:
"小明" in (select sname from student)
這樣(select sname from student) 返回的是一個全班姓名的集合,in用於判斷"小明"是否為此集合中的一個數據;
同時,你也可以用exists語句:
exists (select * from student where sname="小明")
❻ sql2008用exists進行多表查詢
selectd1.sno,d1.sname
fromstudentd1
whereexists(
selecttop1d2.sno
fromresultd2
innerjoincoursed3ond3.cno=d2.cnoandd3.cname='平面設計'
whered2.sno=d1.sno
)
不用exists子句,直接將student, result, course表連接查詢速度上會更好些。
❼ SQL:exists和in使用原來及區別;inner jon...ON的用法
請查閱SQL相關命令
❽ sql in用exist替代問題
請參考:
--in改寫exists
SELECTu.id,u.real_nameASrealName
FROMsys_useru
LEFTJOINsys_orgo
ONo.id=u.org_id
WHEREu.org_id=#{orgId}
ANDexists(select1
fromsys_user_roleur
whereur.user_id=u.id
anr.role_idIN(6,8))
❾ sql語句中exists的用法
SELECT b.*, a.time FROM a LEFT JOIN (SELECT * FROM b) ON a.id = b.from_id
❿ SQL語句中「in」和「exist」有什麼區別
本文主要分析了in和exists的區別與執行效率的問題:
in可以分為三類:
1、形如select * from t1 where f1 in ( 'a ', 'b '),應該和以下兩種比較效率。
select * from t1 where f1= 'a ' or f1= 'b '
或者
select * from t1 where f1 = 'a ' union all select * from t1 f1= 'b '
你可能指的不是這一類,這里不做討論。
2、形如
select * from t1 where f1 in (select f1 from t2 where t2.fx= 'x '),
其中子查詢的where里的條件不受外層查詢的影響,這類查詢一般情況下,自動優化會轉成exist語句,也就是效率和exist一樣。
3、形如
select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
其中子查詢的where里的條件受外層查詢的影響,這類查詢的效率要看相關條件涉及的欄位的索引情況和數據量多少,一般認為效率不如exists。
除了第一類in語句都是可以轉化成exists 語句的,一般編程習慣應該是用exists而不用in.
A,B兩個表,
(1)當只顯示一個表的數據如A,關系條件只一個如ID時,使用IN更快:
select * from A where id in (select id from B)
(2)當只顯示一個表的數據如A,關系條件不只一個如ID,col1時,使用IN就不方便了,可以使用EXISTS:
select * from Awhere exists (select 1 from B where id = A.id and col1 = A.col1)
(3)當只顯示兩個表的數據時,使用IN,EXISTS都不合適,要使用連接:
select * from A left join B on id = A.id
所以使用何種方式,要根據要求來定。
這是一般情況下做的測試:
測試結果:
set statistics io on select * from sysobjects where exists (select 1 from syscolumns where id=syscolumns.id) select * from sysobjects where id in (select id from syscolumns ) set statistics io off (47 行受影響)
表 'syscolpars '。掃描計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 2 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysschobjs '。掃描計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
(1 行受影響)
(44 行受影響)
表 'syscolpars '。掃描計數 47,邏輯讀取 97 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysschobjs '。掃描計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
(1 行受影響)
set statistics io on select * from syscolumns where exists (select 1 from sysobjects where id=syscolumns.id) select * from syscolumns where id in (select id from sysobjects ) set statistics io off
(419 行受影響)
表 'syscolpars '。掃描計數 1,邏輯讀取 10 次,物理讀取 0 次,預讀 15 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysschobjs '。掃描計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
(1 行受影響)
(419 行受影響)
表 'syscolpars '。掃描計數 1,邏輯讀取 10 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysschobjs '。掃描計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
(1 行受影響)
測試結果(總體來講exists比in的效率高):
效率:條件因素的索引是非常關鍵的
把syscolumns 作為條件:syscolumns 數據大於sysobjects
用in
掃描計數 47,邏輯讀取 97 次,
用exists
掃描計數 1,邏輯讀取 3 次
把sysobjects作為條件:sysobjects的數據少於syscolumns
exists比in多預讀 15 次