mysql學習筆記 自連線的3道例題和總結

2022-02-16 01:28:30 字數 3132 閱讀 6356

自連線的應用和生命力是蠻廣泛和深刻的,也是我考試時候的十分要注意的地方!

關係代數,和sql中都有著自連線的身影。

1.先來乙個前導引入哈哈:

查詢:查詢選修1號同學選修的課程的學生學號。

分析:這個查詢語句的含義是:選修1號同學他所選修的課程的一門,兩門,多門甚至所有全部都是可以的,這裡是只要有就行了!

這裡這個語句的選修的詞後面有隱含的從1門到所有的意思.  (between 1 and all)

先用關係代數語言來解決:

有不完善的地方希望大佬門或未來的我自己再來指正修改噠2333

sql語言實現:

select * from sc;
第一種方案就是我們講的自連線啦:

select  distinct sc1.sno/*去重*/

from sc as sc1,sc as sc2

where sc2.sno='1'

and sc1.cno=sc2.cno;/*可能會出現重複,沒有去重,so*/

效果如下:

當然,也可以進一步規範化2333

第二種方法就是我不前還不多熟練地巢狀查詢:

/*選修1號學生選的課程的學生的學號,沒加所有哦所以不是除法*/

select distinct sno

from sc

where cno in

(select cno

from sc

where sno='1'

);/*巢狀不熟練*/

2.查詢:查詢同時選修1號和2號課程的學生學號。

方法:自連線,除法,交運算。

自連線方法:

或者:

嘿嘿交運算實現:

/*查詢同時選修1號和2號課程的學生學號。*/

select sno

from sc

where cno='1'

and sno in

(select sno

from sc

where cno='2');

至於除法運算啦,我目前還沒有怎麼多多地實現之qwq

——————————————————————————————————————

除法運算實現形式:

#查詢同時選修1號和2號課程的學生學號。__除法

select sno from student where not exists

(select * from c where (cno='1' or cno='2')and not exists

(select * from sc where sno=student.sno and cno=c.cno));

#查詢同時選修1號和2號課程的學生學號。__除法

記住,括號一定要加,and優先順序比or要高哦2333!括號不加的話答案可就不對了23333!(ps:蟹蟹jiaxin大佬的靈犀指點,奧力給!)

自連線方法解決之:

/*間接先修課程號*/

拓展:

select

c1.cno,c2.cpre as cppre,c3.cname

from c as c1,c as c2,c as

c3where c1.cpre=c2.cno and c2.cpre=c3.cno;/*

間接先修課課程名

補充一下哈:cpre or cpno是課程表c的外碼,cno是c的主碼

設定cpre成為c的外碼的語句格式如下:

alter

table

cadd

constraint

fk_c

foreign

key(cpre)

references c(cno);/*

將課程表c的cpre欄位設定為c的外碼,參照關係也是c

*/

4.小結:寫到這一地步,今天上課的3道自連線題目有了一定程度上的總結!勤奮奮鬥,衝鴨,龍龍!多多實踐之,衝衝衝!

mysql學習 自連線的用法

應用場景 假設一張存放了商品名稱及 的表,表裡有 蘋果 橘子 香蕉 三條記錄。在生成用於查詢銷售額的報表時,需要獲取這些商品的組合。組合 分為有順序的有序對 1,2 和 無順序的無序對 分別對應 排列 和 組合 1 可重排列 通過交叉連線生成笛卡爾積,可以得到有序對 用於獲取可重排列的sql語句 s...

MySQL學習筆記 連線

a table a b table b 1 笛卡爾積 為a,b兩個表產生笛卡爾積 x y x y 的笛卡爾積為,個人理解 即將a表所有的屬性和b表中的所有屬性進行合併,且每條記錄都產生乙個這樣的關係。select from a cross join b orselect from a,b2 自然連線...

mysql學習筆記(3)

資料表索引設定 目的 加速搜尋 檢視現有索引 show index from user g 語句以 g 結尾可以使顯示結果行列轉置,方便檢視 1.主鍵索引 primary key eg 給字段id加主鍵索引 建立表時新增 id int unsigned auto increment primary ...