自連線的應用和生命力是蠻廣泛和深刻的,也是我考試時候的十分要注意的地方!
關係代數,和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號課程的學生學號。*/至於除法運算啦,我目前還沒有怎麼多多地實現之qwqselect sno
from sc
where cno='1'
and sno in
(select sno
from sc
where cno='2');
——————————————————————————————————————
除法運算實現形式:
#查詢同時選修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大佬的靈犀指點,奧力給!)
自連線方法解決之:
/*間接先修課程號*/拓展:
selectc1.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的外碼的語句格式如下:
alter4.小結:寫到這一地步,今天上課的3道自連線題目有了一定程度上的總結!勤奮奮鬥,衝鴨,龍龍!多多實踐之,衝衝衝!table
cadd
constraint
fk_c
foreign
key(cpre)
references c(cno);/*
將課程表c的cpre欄位設定為c的外碼,參照關係也是c
*/
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 ...