資料庫exist
這么記,兩個not exists就是 兩個exists
你這句話意思就是從student中拿出一個記錄(假設a)再從course拿出一個(假設b),然後和sc表比較,如果a的學號與表sc中某一記錄(這個記錄假設為c)相等且同時b的課程號與該記錄(c)中的學號相等的話,則該記錄(a)就是一個結果記錄,然後再與sc其他記錄比較,知道sc記錄掃描完,之後從course中再拿一條記錄(假設為d),此時就是記錄a和d和sc中每條記錄比較,滿足條件的就輸出,等course記錄掃描完畢後從最外層表student拿出一條然後在從頭掃描course表盒sc表。以此類推。這個是順序由外到內再到外的。
㈡ 資料庫的exists用法啊,我真的難以拐過彎來啊,怎麼理解比如下面的例子:
exists語法可以這樣理解,執行查詢areas表,並且逐條調用exists語句去匹配,如果在deals表中有匹配項則返回1(true),沒有匹配項則返回0(false),返回1的話就顯示記錄,返回0的話不顯示該行記錄(這里顯示的是areas表的記錄,要理解,你現在只是查詢areas表,deals表只是拿過來用一下而已),然後進行下一條記錄的匹配。
關鍵是你要想像成他是一條一條記錄去匹配的,也就是說areas表中每一行記錄都會在deals全表中搜索匹配項,只要存在匹配(可以是一對一也可以是一對多匹配)立即返回1;如果搜索到deals表尾依然沒有匹配項,這時候才返回0。
如果懂了請採納,不懂的話繼續追問。
㈢ sql中exists是什麼意思,怎麼講解
SQL EXISTS:
EXISTS 運算符用於判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。
具體語法參考:
-from shulanxt
回答不易,望樓主採納哦~
㈣ SQL語句中exists和not exists的用法,講得通俗易懂些。
exists : 強調的是是否返回結果集,不要求知道返回什麼, 比如:
select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要
exists引導的子句有結果集返回,那麼exists這個條件就算成立了,大家注意返回的欄位始終為1,如果改成「select 2 from grade where ...」,那麼返回的欄位就是2,這個數字沒有意義。所以exists子句不在乎返回什麼,而是在乎是不是有結果集返回。
而 exists 與 in 最大的區別在於 in引導的子句只能返回一個欄位,比如:
select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)
,in子句返回了三個欄位,這是不正確的,exists子句是允許的,但in只允許有一個欄位返回,在1,2,3中隨便去了兩個欄位即可。
而not exists 和not in 分別是exists 和 in 的 對立面。
exists (sql 返回結果集為真)
not exists (sql 不返回結果集為真)
下面詳細描述not exists的過程:
如下:
表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.AID
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)
執行結果為
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有值返回真所以有數據
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無值返回真所以沒有數據
NOT EXISTS 就是反過來
SELECT ID,NAME FROM A WHERENOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
執行結果為
3 A3
===========================================================================
EXISTS = IN,意思相同不過語法上有點點區別,好像使用IN效率要差點,應該是不會執行索引的原因
SELECT ID,NAME FROM A WHEREID IN (SELECT AID FROM B)
NOT EXISTS = NOT IN ,意思相同不過語法上有點點區別
SELECT ID,NAME FROM A WHEREIDNOT IN (SELECT AID FROM B)
有時候我們會遇到要選出某一列不重復,某一列作為選擇條件,其他列正常輸出的情況.
如下面的表table:
Id Name Class Count Date
1 蘋果 水果 10 2011-7-1
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 白菜 蔬菜 12 2011-7-1
2 青菜 蔬菜 19 2011-7-2
如果想要得到下面的結果:(Id唯一,Date選最近的一次)
1 香蕉 水果 15 2011-7-3
2 青菜 蔬菜 19 2011-7-2
正確的SQL語句是:
SELECT Id, Name, Class, Count, Date
FROM table t
WHERE (NOT EXISTS
(SELECT Id, Name, Class, Count, Date FROM table
WHERE Id = t.Id AND Date > t.Date))
如果用distinct,得不到這個結果, 因為distinct是作用與所有列的
SELECT DISTINCT Id, Name, Class, Count, Date FROM table
結果是表table的所有不同列都顯示出來,如下所示:
1 蘋果 水果 10 2011-7-1
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 白菜 蔬菜 12 2011-7-1
2 青菜 蔬菜 19 2011-7-2
如果用Group by也得不到需要的結果,因為Group by 要和聚合函數共同使用,所以對於Name,Class和Count列要麼使用Group by,要麼使用聚合函數. 如果寫成
SELECT Id, Name, Class, Count, MAX(Date)
FROM table
GROUP BY Id, Name, Class, Count
得到的結果是
1 蘋果 水果 10 2011-7-1
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 白菜 蔬菜 12 2011-7-1
2 青菜 蔬菜 19 2011-7-2
如果寫成
SELECT Id, MAX(Name), MAX(Class), MAX(Count), MAX(Date)
FROM table
GROUP BY Id
得到的結果是:
1 香蕉 水果 20 2011-7-3
2 青菜 蔬菜 19 2011-7-2
如果用in有時候也得不到結果,(有的時候可以得到,如果Date都不相同(沒有重復數據),或者是下面得到的Max(Date)只有一個值)
SELECT DISTINCT Id, Name, Class, Count, Date FROM table
WHERE (Date IN
(SELECT MAX(Date)
FROM table
GROUP BY Id))
得到的結果是:(因為MAX(Date)有兩個值2011-7-2,2011-7-3)
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 青菜 蔬菜 19 2011-7-2
注意in只允許有一個欄位返回
有一種方法可以實現:
SELECT Id, Name, Class, COUNT, Date
FROM table1 t
WHERE (Date =
(SELECT MAX(Date)
FROM table1
WHERE Id = t .Id))
㈤ 資料庫語言關於not exist的用法
鹵煮你好,
答案寫法很好,我看了很久才弄明白,但我認為有漏洞,實際應用的話應該需要完善
我先說我的寫法,再解釋答案的邏輯
我的:
select st.sno, st.sname
FROM student st
where exists(
select 1 from SC a join Cource b on a.Cno=b.Cno where a.Sno=st.Sno and
a.Cno in(3,5,8) having count(*)=3
)
或者
select st.sno, st.sname
FROM student st
where exists(
select 1 from SC where Sno=st.Sno and
Cno in(3,5,8) having count(*)=3
)
/*通過和上面的比較你可以發現其實Cource其實沒有作用,但是第一種寫法更加嚴密,因為可以判斷SC中的Cno是不是有效的*/
-------分割線--------------------------
再來看看這個答案
SELECT student.sno, student.sname
FROM student
WHERE not exists(select course.cno
from course
where course.cno in (3,5,8) and not exists(select *
from sc
where student.sno=sc.sno and course.cno=sc.cno));
看起來很復雜,我們先來拆分下
因為SQL 的查詢和執行是逐條進行的,主體是從Student表中中選數據,我們假設Student中有【小明】這個人,如何判斷小明是不是該出來呢,只要
select course.cno
from course
where course.cno in (3,5,8) and not exists(select *
from sc
where 『小明』=sc.sno and course.cno=sc.cno)
這一大坨【不返回結果】即可,
這一坨
,select course.cno
from course
where course.cno in (3,5,8) and not exists(select *
from sc
where 『小明』=sc.sno and course.cno=sc.cno)
意思就比較明確了(我這兒迷糊了好一陣子)
只要小明同時選修了3,5,8那麼這段話就不返回結果,所以最終小明就出現了!
/*ps.題目有個地方我沒太看明白,「3且5且8」 是指的是同時選修3,5,8呢還是同時選修3,5,8且只選修這三個。如果是後者這3個寫法還要再加一句exists*/
----三段寫法全部測試通過,鹵煮可以盡情測試~要給分啊!!!!!!!!!!!!
㈥ 資料庫中IN 和EXISTS有什麼區別
在SQL中,同樣的查詢很多情況下,既可以用in的用法來寫,也可以用exists來寫。in寫法比exists的寫法要容易讀,好理解,但是當數據量大的時候,exists的效率要遠高於in的寫法。
㈦ SQL中EXISTS怎麼用
EXISTS在SQL中的作用是:檢驗查詢是否返回數據。
select a.* from tb a where exists(select 1 from tb where name =a.name)返回真假,當 where 後面的條件成立,則列出數據,否則為空。
exists強調的是是否返回結果集,不要求知道返回什麼。比如:select name from student where sex = 'm' and mark exists(select 1 from grade where ...)
只要exists引導的子句有結果集返回,那麼exists這個條件就算成立了,大家注意返回的欄位始終為1
如果改成「select 2 from grade where ...」,那麼返回的欄位就是2,這個數字沒有意義。所以exists子句不在乎返回什麼,而是在乎是不是有結果集返回。
(7)資料庫exist擴展閱讀:
Exists 方法描述如果在 Dictionary對象中指定的關鍵字存在,返回True,若不存在,返回False。
語法object.Exists(key)Exists 方法語法有如下幾部分:部分描述Object必需的。始終是一個 Dictionary對象的名字。Key必需的,在 Dictionary對象中搜索的Key值。
exist相當於存在量詞:表示集合存在,也就是集合不為空只作用一個集合.
例如 exist P表示P不空時為真; not exist P表示p為空時為真in表示一個標量和一元關系的關系。
例如:s in P表示當s與P中的某個值相等時為真; s not in P 表示s與P中的每一個值都不相等時為真。
exits與not exits
exists(sql 返回結果集為真)
not exists(sql 不返回結果集為真)
如果not exists子查詢只有自己本身的查詢條件,這樣只要子查詢中有數據返回,就證明是false,結果在整體執行就無返回值;一旦跟外面的查詢關聯上,就能准確查出數據。
㈧ sql中in和exist語句的區別
兩者都能實現表功能查詢,主要區別如下:
1、適用表的類型不同。
in是子查詢為驅動表,外面的表為被驅動表,故適用於子查詢結果集小而外面的表結果集大的情況。
exists是外面的表位驅動表,子查詢裡面的表為被驅動表,故適用於外面的表結果集小而子查詢結果集大的情況。
2、子查詢關聯不同。
exists一般都是關聯子查詢。對於關聯子查詢,必須先執行外層查詢,接著對所有通過過濾條件的記錄,執行內層查詢。外層查詢和內層查詢相互依賴,因為外層查詢會把數據傳遞給內層查詢。
in則一般都是非關聯子查詢,非關聯子查詢則必須先完成內層查詢之後,外層查詢才能介入。
3、執行次數不同。
IN 語句:只執行一次,確定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾積,然後按照條件進行篩選。所以相對內表比較小的時候,in的速度較快。
EXISTS語句:執行次數根據表的長度而定。指定一個子查詢,檢測行的存在。遍歷循環外表,然後看外表中的記錄有沒有和內表的數據一樣的。匹配上就將結果放入結果集中。
㈨ 資料庫語言 not exists 是什麼意思
就是不在這個范圍的意思
select id
from table
where name not exists(select 1
from table
where name = 'aaa')
也許你看不懂這個1的意思,不過在使用EXISTS的時候,通常都會使用1,它代表所查詢出來的集合,等同於select name。
整個例子的意思是:查詢name不等於aaa的所有ID。
不明白再問我,謝謝!
㈩ 已經存在的資料庫提示table doesn't exist
update語句錯誤。
在服務運行目錄找到my.ini或者my.cnf文件,打開文件,找到[mysqld]在下面增加一行
lower_case_table_names=1 (0:大小寫敏感;1:大小寫不敏感)
重啟MySQL服務
(10)資料庫exist擴展閱讀
注1:如未改動數據文件夾所有者和組,啟動資料庫後,進入bus庫點擊相應表名會出現 ERROR #1017 :Can't find file: '/xxx.frm' 錯誤或ERROR #1036 Table '表名' is read only
注2:如資料庫較多,可能會發現,部分資料庫文件中有.frm .MYD .MYI這三種文件,部分資料庫中只有.frm文件,這是因為MySQL存儲表的時候,使用的默認資料庫存儲引擎是InnoDB,而使用InnoDB存儲引擎的時候,是不生成.MYD 和.MYI文件的。