在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...