SQL全稱量詞總結

2021-10-07 21:55:21 字數 1903 閱讀 5658

在sql中無全稱量詞,因此,在解決相關的查詢問題中,我們一般將帶有全稱量詞的謂詞轉換成等價的帶有存在量詞的謂詞問題。因此本文將基於學生—課程資料庫中的三個基本表進行相關總結。

學生表 student(sno,sname,s***,sage,sdept)

課程表course(cno,cname,cpno,ccredit)

選課表sc(sno,cno,grade)

根據語義:所有的課程這位學生都選修了。

即:其中x表示實際有的任意一門選修課。

p表示該學生選修了x。

於是,上述全程量詞問題可以轉換為:對任意一門課程x,該學生都選修了。

等價於:不存在一門課程,該學生沒有選修。

於是可以得出相應問題的sql語句如下:

select sname

from student

where

notexists

(select

*from course

where

notexists

(select

*from sc

where sno=student.sno

and cno=course.cno)

);

總:仔細觀察,對應的sql語句與相應的語義轉化具有一致性。因此,解決此類問題的關鍵在於根據問題意思將原問題轉化為含存在量詞的等價問題。

原問題的意思是:

對於學校的任意一門選修課y,如果學生201215122選修了y,那麼要查詢的學生也選修了y。

即:其中,y表示學校任意一門選修課,p表示學生201215122選修了y,q表示要查詢的學生也選修了y。

問題的等價轉換語義為:不存在一門課程y,學生201215122選修了,但同時要查詢的學生卻沒有選修。

於是可以得到如下sql語句:

select sno

from sc scx

where

notexists

(select

*from sc scy

where sno=

'201215122'

andnot

exists

(select

*from sc scz

where scz.sno=scx.sno

and scz.cno=scy.cno)

);

select scx.sno,sname

from student,sc scx

where student.sno=scx.sno/*將學生表與選課表按學號連線*/

andnot

exists

(select

*from sc scy

where scy=

'201215123'

andnot

exists

(select

*from sc scz

where scz.cno=scy.cno

and scz.sno=scx.sno)

);

總:此問題與例2問題的區別在於:查詢涉及到了學生表與選課表兩個基本表。其它思路與例2類似。

轉化後等價語義為:對於要查詢的課程,不存在學生沒有選修。

select cno,cname

from course

where

notexists

(select

*from student

where

notexists

(select

*from sc

where sc.cno=course.cno

and sc.sno=student.sno)

);

解決SQL中全稱量詞 轉變為 存在量詞的案例

1 至少使用了s1 的商品的工程號 不存在 p s1 商品 q jno 沒有用該商品 select jno from spj a where not exists select from spj b where b.sno s1 and not exists select from spj c wh...

學習總結 SQL學習總結之SQL語法

選取所有列即原表返回 select from table name 例如 select distinct country from websites 例如 從 websites 表中選取國家為 cn 的所有 例如 從 websites 表中選取id為1的所有 文字字段 vs.數值字段 where 子...

SQL知識總結

use tablename 要操作的資料庫名 select logicalfilename tablename log 日誌檔名 maxminutes 10,limit on time allowed to wrap log.newsize 1 你想設定的日誌檔案的大小 m setup initia...