例項分析SQL中除法的三種寫法

2021-05-17 15:37:24 字數 1652 閱讀 7087

首先請看

帖中從實際問題出發,討論sql語句中如何表示除法運算。

以下是問題的給出與簡要描述:

然後下面有很多的回答,在這裡我就不一一列出了。

先給出我的測試ddl與sql語句。

解法一:

解法一使用的是《資料庫系統概念(第五版)》上給出的正統轉換方法: r

¸s= r¸s

= õr-s(r)

–õr-s( (

õr-s(r

)x s) –

õr-s,s(r

)) 我在這裡做的就是把這段關係表示式轉換成sql語句就可以了。

在這裡稍微解釋一下這個關係表示式的由來。

整體思路就是先選出r集合中的(r-s)*(1)屬性,然後與s集合進行笛卡爾操作,這時候得到的是(õ

r-s(r)

x s) ,就是r集合中全部元組都能被選出來的理想情況*(2)(姑且這麼說);然後減去集合r中的現實情況*(3)õ

r-s,s(r

))(表示集合r屬性的重新排列:而屬性重新排列是集合進行差集運算所要求的),得到現實與理想的「差距」,並選出(r-s)的屬性,就得到õ

r-s( (

õr-s(r

)x s) –

õr-s,s(r

))。最後再用õ

r-s(r)

(實際的集合)來與剛剛得出的õ

r-s( (

õr-s(r

)x s) –

õr-s,s(r

))進行差集運算,得出符合理想(規定)的那些元組——而這些元組就是r¸s

的結果了。

注:(1) (r-s)屬性指的是r集合與s集合的關係模式的差集(即r集合中的字段集合與s集合中的字段集合的差集),其中s

ír,這是集

合除法規定的。

(2) 理想情況指的是所有元組都能成功配對的情況(通過笛卡爾積實現)。

(3) 現實情況指的是當前r集合中的實際元組情況。

解法二:

解法二的思路十分地獨特,它巧妙地運用group by而大大簡化了操作。

整體思路就是①先把r集合中的與s集合的相同字段(模式s)有相同值的元組提取出來(使用in操作就可以了),②然後再對查詢結果以它們相異的字段(模式r-s)分組,然後統計每個分組的count是否等於期望的count值(即s集合中的元組數),符合的就是結果了。

思路就這麼簡單,大家仔細想想就明白了。

解法三:

解法三就是傳說中的雙not exists做法了,它的思路非常的直觀,就是三層select語句的巢狀。

整體思路就是,先求出ano為256的bno集合,然後與針對每乙個相同ano的bno集合進行差集運算,如果結果為空集,那麼就證明了該ano的bno集合包含了預期的bno集合(即ano為256的bno集合),該集合可被輸出,然後繼續下乙個ano。

note that

x – y = øûx

íy

其實就是以上這條公式的思路。

講解中可能有不正確的地方,也希望大家可以指出~ ^_^

vue例項中data屬性三種寫法的區別

有哪三種寫法啊?話不多說,先上 第一種 newvue script 第二種 newvue script 第三種 newvue script 這三種寫法的區別是啥啊?但是,在元件中,data 必須宣告為返回乙個初始資料物件的函式,因為元件可能被用來建立多個例項,通過提供 data 函式,每次建立乙個新...

sql三種分頁分析

1.分頁方案一 利用not in和select top分頁 語句形式 selecttop 頁大小 from testtable where id not in select top 頁大小 頁數 id from 表 orderby id orderby id sql2000 northwind.cu...

for迴圈的三種寫法

1 遍歷迴圈 for 迴圈變數型別 迴圈變數名稱 迴圈條件 更新語句 迴圈體 string arr for int i 0 i arr.length i 列印台abc d2 迭代器迴圈 string arr listlist arrays.aslist arr for iteratoriterato...