1樓:狠有毅毅
第一問:兩個not exists表示雙重否定:沒有一個選了課的學生沒有選course表裡的課程
select sname
from student
where not exists /*沒有一個學生滿足以下條件*/
(select * from course
where not exists /*什麼條件呢?沒有選過course表裡的課*/
(select * from sc
where sno =student.sno /*這裡兩個=分別指對應的關係,表示選過課並且是course裡and **o=course.**o) 的課,只不過用not exists否定掉了*/
第二問:其實和not in 是一個意思 exists只返回true 或false 這裡not exists裡的內容 其實就是指學生選過的課程,再用not exists否定了,就變成了沒有選的
2樓:匿名使用者
分析原因如下:
第一問:兩個not exists表示雙重否定:沒有
一個選了課的學生沒有選course表裡的課程
select sname from student where not exists /*沒有一個學生滿足以下條件*/
(select * from course where not exists /*什麼條件呢?沒有選過course表裡的課*/
(select * from sc where sno =student.sno /*這裡兩個=分別指對應的關係,表示選
過課並且是course裡and **o=course.**o) 的課,只不過用not exists否定掉了*/
第二問:其實和not in 是一個意思 exists只返回true 或false 這裡not exists裡的內容 其實就 是指學生選過的課程,再用not exists否定了,就變成了沒有選
3樓:匿名使用者
exists 是類似於in 效率比in 好的多
not exists 類似於 not in 效率一樣比not in 一樣好的多
再來看這個sql語句,應該明白了吧
資料庫sql語句中 查詢選修了全部課程的學生的學號和姓名 理解
4樓:匿名使用者
這思路是用了個雙重否定來求解的。因為sql中沒有全稱量詞,於是要把題目轉換成等價的存在量詞表達形式。即根據(∀x)p≡¬∃(¬p)來轉化為雙重否定的表達。
同時由於「學生x選修課程y 」
之間是不定的,需要使用兩個exist。
於是「選修了全部課程的學生」等價於「不存在(有他沒選的課的)學生」
使用了兩次not exists來實現雙重否定。
先查詢在課程裡查詢「沒有學生選的課程」,第一次否定,
然後再在學生裡查詢「沒有屬於上面情況的學生」的名字,第二次否定;
結合起來,就是 「沒有(沒選的課程)的學生」了。
好了,從裡到外寫出來,就是
select sname from student where not exists(
select * from course where not exists(
select * from sc where sno=student.sno and **o=course.**o
))這個只不過是逆向思維來解決問題的方法。舉一反三,比如要查「被全部學生都選的課程名」
則是求「不存在有學生沒選它的課程」
select **ame from course where not exists(
select * from student where not exists(
select * from sc where sno=student.sno and **o=course.**o
))再如,查「所有人都沒選修的課程」,這個雖然是單次否定了,但仍需要兩個存在量詞表述。
等價於查詢「不存在有學生選了它的課程」。
select **ame from course where not exists (
select * from student where exists (
select * from sc where **o=course.**o and sno=student.sno))
5樓:風嘯無名
沒有資料庫難以具體說明,總的來說,就是一個多表查詢包括學生基本資訊表、課程資訊表、成績表等,學號為主鍵,查詢姓名和課程、分數等資訊,總分用sum算。
1 。 exists 子查詢找到的提交
not exists 子查詢中 找不到的提交說明:不要去翻譯為存在和不存在,把腦袋搞暈。
2 。 建立程式迴圈的概念,這是一個動態的查詢過程。如 for迴圈 。
3 。 exists執行的流程exists首先執行外層查詢,再執行記憶體查詢,與in相反。 流程為首先取出外層中的第一元組, 再執行內層查詢,將外層表的第一元組代入,若內層查詢為真,即有結果時。
返回外層表中的第一元 組,接著取出第二元組,執行相同的演算法。一直到掃描完外層整表 。
6樓:月光雪松
樓主彆著急!
為好理解我們先從這條sql語句所要實現的功能入手。
功能:查出選修了全部課程的學資訊。那麼sql在查詢資料的時候的遍歷每一個學生資訊。判斷該學生是否滿足條件。
1 如果存在這麼一條course記錄a(暫命名為a), 則不選擇該學生。否則該學生就被查詢出來
2 那麼記錄a,是怎麼查出來的呢?a查出的條件是:不存在sc記錄b,只要不存在b,就可查出a
3 那麼b記錄是什麼?b記錄是選課資訊表,根據學號和課程號可查出記錄b
如果b為空(該學生有沒有選的課程)也就是不存在,則a就有一條記錄,根據規則2可知:因為有a,所以該學生資訊將不被輸出。
如果在sc中每一個課程編號和該學生編號為條件都能夠查出一條記錄b(也就是該學生選修了全部課程),所以a記錄不存在,則輸出該學生的資訊。
也就是在選課表中,如果學生選了全部課程(也就是滿足select * from sc where sno= student.sno and **o= course.**o)始終存在,當然,課程編號是任意的)。
那麼就輸出該學生的資訊。你不要為理解這條sql而忘記了它本身是要做什麼.
帶著sql的目的(要實現的功能)去理解就好了。
7樓:雨夜的緣分
1,select * from sc where sno= student.sno and **o= course.**o
在sc表中查詢符合sno= student.sno and **o= course.**o這兩個條件的所有資料,
2,select * from course where not exists (select * from sc where sno= student.sno and **o= course.**o);這句的意思是在course表中查詢不滿足1,中的所有資料
3,select sname from student where not exists (select * from course where not exists (select * from sc where sno= student.sno and **o= course.**o));
這整句的意思就是查詢student表中所有不滿足2,資料,就是選修了全部課程的學生了
只所以會有這麼多查詢,可能sno= student.sno and **o= course.**o這兩個條件是是sc表查詢的條件分散在另外兩個表中,引用了雙重否定,也就是肯定的意思,達到可以讓student.
sno ,course.**o,在sc表中作為條件的目的
夠詳細吧!!!!
sql資料庫中查詢選修了所有課程的學生的學號和姓名及選修門數
8樓:騰訊電腦管家
select s.sname, s.s*** , s.
sage, s.sdept c.**ame g.
grade from student s , course c ,grade g where s.sno = g.sno and g.
**o = c.**o;
9樓:站在風中望著你
??????????????????????????你好,sql是什麼
查詢選修了全部課程的學生的姓名,用兩種查詢語句表示
查詢選修了全部課程的學生姓名的sql語句怎樣理解
10樓:匿名使用者
沒有表結構怎麼查啊,都不可能憑空想象表結構。
怎麼理解選修了全部課程的學生的學號和姓名的sql語句
11樓:匿名使用者
一個學生選擇了全部的課程=不存在一個課程他沒有選擇從句select * from course where not exists (select * from sc
where sno= student.sno and **o= course.**o)如果無法理解
換成 select * from course where **o not in (select **o from sc where sno= student.sno) 這是找出student的某個學生沒有選擇的課程
12樓:匿名使用者
這語句能執行嗎??同樣等待高手解釋,學習
關於sql利用相關子查詢查詢選修了全部課程的學生姓名的語句如下。麻煩高手解釋一下每個巢狀的語句意義。
13樓:匿名使用者
exists 用於只能用來於子查詢,自可以替代in,若匹配到結果,則退出內部查詢,並將條件標誌為true,傳回全部結果資料,in 不管匹配到匹配不到都全部匹配完畢,使用exists 可以將子查詢結果定為常量,不影響查詢效果,而且效率高.若子查詢結果集比較小,優先使用in,若外層查詢比子查詢小,優先使用exists。因為若用in,則oracle 會優先查詢子查詢,然後匹配外層查詢,若使用exists,則oracle 會優先查詢外層表,然後再與內層表匹配.
not exists的使用與exists 含義相反,也在子查詢中使用,取出不滿足條件的,與not in有一定的區別,注意有時候not exists不能完全替代not in.
sql語句 查詢選修了li老師所授全部課程的學生姓名和學院名稱; 20
14樓:朩朩熋
select t2.姓名, t1.學院
bai名稱
from 學院du t1, 學生 t2, 教師zhidao t3, 課版程 t4, 學習 t5, 開課 t6where t1.學院代
碼權 = t2.學院**
and t2.學院** = t3.學院**and t2.學號 = t5.學號
and t3.教師號 = t6.教師號
and t4.課程號 = t5.課程號
and t4.課程號 = t6.課程號
and t3.教師姓名 = 'li'
SQL查詢全部學生都選修的課程的課程號和課程名問題
樓上回答的 很不錯了 可以這樣做的。這個問題其實真的很簡單的。用sql語句列出全部學員都選修的課程的課程名和課程號 資料庫sql語句中 查詢選修了全部課程的學生的學號和姓名 理解 這思路是用了個雙重否定來求解的。因為sql中沒有全稱量詞,於是要把題目轉換成等價的存在量詞表達形式。即根據 x p p ...
查詢選修了2號課程的學生的學號,用SQL查詢同時選修了1號課和2號課的學生學號
select distinct sno from sc where cno c02 請根據具體的資料庫對sql語句作出適當的修改!用sql查詢同時選修了1號課和2號課的學生學號 查詢bai 同時選修了1號和2號課的學du生學號 涉及到兩zhi個表.學生表和dao課程表 語句 select from ...
查詢選修了3門以上課程的學生學號
select distinct x.s from sc as x,sc as y where x.s y.s and x.c y.c selece 學號 from 表 條件 選修課程大於或等於2的不就行了麼 怎樣用sql語句查詢選修了3門及以上課程的學生學號,姓名,選修的課程數?查詢所有至少選修2門...