資料庫與SQL No 2 SQL中的除法

2021-08-05 23:07:55 字數 1724 閱讀 3683

sql中的除法是用於解決什麼場景的呢?

我們假設student 表示學生資訊,sc表示學生選課記錄,course表示課程資訊,其結構如下:

create table `student` (

`sid` varchar(10) default null,

`sname` varchar(10) default null,

`sbirth` datetime default null,

`s***` varchar(10) default null,

`sage` varchar(10) default null

) engine=innodb default charset=utf8;

create table `course` (

`cid` varchar(10) default null,

`cname` varchar(10) default null,

`tid` varchar(10) default null

) engine=innodb default charset=utf8;

create table `sc` (

`sid` varchar(10) default null,

`cid` varchar(10) default null,

`score` decimal(18,1) default null

) engine=innodb default charset=utf8;

當我們想要查詢,所有至少選過語文課和數學課的同學的學號時:

select distinct sc1.sid from student sc1

where not exists

(select distinct c.cid from (select * from course t where t.cid = "01" or t.cid = "02" ) as c

where not exists

(select * from sc sc2

where sc1.sid = sc2.sid

and c.cid = sc2.cid))

怎麼理解上面這句話呢?

我們選出這樣的同學,不存在語文課和數學課,什麼樣的語文課和數學課呢?在選課記錄中沒有該同學和語文課數學課的記錄。是不是有點繞?我們換乙個

當我們想要查詢,所有選過所有課的同學的學號時:

select distinct sc1.sid from student sc1  // 雙重否定表肯定,除法

where not exists

(select distinct c.cid from course c // 不返回結果

where not exists

(select * from sc sc2 //返回了結果

where sc1.sid = sc2.sid

and c.cid = sc2.cid))

我們查詢這樣乙個同學,不存在一門課,這門課不存在該同學的選課記錄。這樣就清楚很多了吧

所以,在我們希望表示表示至少覆蓋了某個集合c的***x記錄時?中間的那個查詢變為我們的集合c就好了

我們使用雙 not exists來表示sql中的除法是常用的套路~

SQL資料庫總結2

sql 資料庫總結2 vb6.0 資料庫開發經典例項精解 五例項總結 縱觀五例,寫完之後,我發現主要講了一件事,就是 ado的使用,如下圖 圖1 例項 1 1 vb 建立資料庫建立 ado引用 主要用到的 adoconnection 使用和ado recordset 的使用 2 設計一下窗體 3 編...

sql資料庫中的約束

先用設計器建立約束,再用 建立約束。資料庫約束是為了保證資料的完整性 正確性 而實現的一套機制 1.非空約束 選擇核取方塊 2.主鍵約束 唯一且不為空,選中列,右鍵設為主鍵 3.唯一約束 唯一允許為空,但只能出現一次,右鍵,索引 鍵,新增,型別 唯一,選擇列 表示唯一約束列不能有重複的值 表中可以包...

SQL中的表 與關聯式資料庫

sql server 中幾個重要的表 1 主系統表 sysobjexts 出現在每個資料庫中,每個資料庫物件含有一行記錄 2系統表 syscolumns 出現在master資料庫和侮個使用者自定義的資料庫中,它對基表或者檢視的每個列和儲存過程中的侮個引數含有一行記錄。3系統表 sysindexes ...