【D1n910】(15/42) C++語言程序設(shè)計 - MySQL數(shù)據(jù)庫學(xué)習(xí)筆記 表連接
正常操作,正常分析,大家好,我是D1N910,這是我觀看【MySQL數(shù)據(jù)庫】C++語言程序設(shè)計 - MySQL數(shù)據(jù)庫從而整理的學(xué)習(xí)筆記。我會繼續(xù)努力的。
本篇 D1n910】(13/42)學(xué)習(xí)【MySQL數(shù)據(jù)庫】C++語言程序設(shè)計 - MySQL數(shù)據(jù)庫的筆記
的主要內(nèi)容是 表連接!多張表的數(shù)據(jù)展示!

如果你沒看過之前的專欄內(nèi)容,那么強(qiáng)烈建議一定要先看看再繼續(xù)往下看





Unit08 表連接
表連接的類型
內(nèi)連接
外連接
有關(guān)于表連接的需求需求:列出學(xué)生的信息,包括學(xué)號、姓名和班級名稱
student:?student_no、student_name
classes:?class_name
數(shù)據(jù)在兩個不同的表,那么就需要把兩個表變成一個大表,然后從這個大表中進(jìn)行數(shù)據(jù)的檢索。
1.表連接的類型
· 內(nèi)連接
????符合關(guān)聯(lián)條件的記錄被檢索出來,不符合條件的被過濾掉
·?外連接
????外連接的結(jié)果集 = 內(nèi)連接的結(jié)果集 + 匹配不上的記錄
2.內(nèi)連接
????語法
????????> select 字段列表
示例
》列出學(xué)生及其所在班級的信息,包括學(xué)號、姓名和班級名稱
inner 可寫可不寫
》向班級表和學(xué)生表中分別插入測試數(shù)據(jù),再次執(zhí)行查詢語句
可以看出剛剛新插入的測試輸入,其中張三豐是沒有綁定班級的
再次執(zhí)行查詢語句發(fā)現(xiàn)沒有查出
匹配不上的數(shù)據(jù)不會出現(xiàn)在結(jié)果集中,只有使得連接成立的才會出現(xiàn)在結(jié)果集中。
*表的別名
剛才我們學(xué)習(xí)過表頭的別名,這里我們還可以弄表的別名,剛剛說過inner可以省略,那么我們這里省略,然后和表頭一樣,表名空格然后名字。
下面可以看出信息是和剛剛保持一致的
備注1:表名起別名后,不能再用原表名了,否則會報錯。
備注2:若表A中的字段名在表B中未出現(xiàn),則可省略表A名or表A別名。表B同理。
執(zhí)行結(jié)果
不過不太建議,因為如果沒有指定表名的話,會所有的表都找,導(dǎo)致效率低。
三表內(nèi)連接(后面4表、5表都一樣的)
語法
直接用join進(jìn)行連接即可。
關(guān)聯(lián)條件的數(shù)量是連接條件的數(shù)量? - 1。超過兩張表以后,表的關(guān)聯(lián)條件不是完全無需的。至少要和前面出現(xiàn)的表有關(guān)系。
回憶我們數(shù)據(jù)庫模型圖,想要測試三表連接的例子,那么肯定要用上 choose 表。

這里插入的時候可能會遇到報錯,我自己碰到以下兩種
1、choose 有外鍵限制,如果插入的數(shù)據(jù)對應(yīng)主表的數(shù)據(jù)不一致,那么就插入失敗;
2、插入時的內(nèi)容不是時間格式或者有其他錯誤,也會插入失敗,注意細(xì)節(jié)。
按照老師的視頻,在把一些之前的表清理后,目前有七個表。
根據(jù)我們之前的數(shù)據(jù)庫模型圖,我們一共有三種不同的三表。
couse、choose和student
couse、choose和teacher
student、choose和teacher

現(xiàn)在用 couse、choose和student 這三張表
任務(wù):列出學(xué)生及其選課的信息,包括學(xué)號、姓名、選修的課程名和成績
student: student_no、student_name
choose: score
course: course_name
關(guān)聯(lián)條件1: student.student_no = choose.student_no
關(guān)聯(lián)條件2: course.course_no = choose.course_no
1.寫出框架
2.寫上表以及關(guān)系(注意順序)
3.寫上表名
運(yùn)行結(jié)果
* 如果學(xué)生沒有選任何一門課,那么就不會在結(jié)果中出現(xiàn)
3.外連接
類型
????>左外連接
????????左外連接的結(jié)果集 = 內(nèi)連接的結(jié)果集 + 左表中匹配不上的記錄
? ?> 右外連接
???????右外連接的結(jié)果集 =內(nèi)連接的結(jié)果集 +右表中匹配不上的記錄
語法
????>左外連接
????>右外連接
注意1:outer? 可以省略。
注意2:和內(nèi)連接不同,這里的 join 左右兩張表的順序會影響結(jié)果。
任務(wù)1 :左連接示例,列出全部學(xué)生的學(xué)號、姓名和所在班級名稱(沒有班級的學(xué)生也列出)
student: student_no, student_name
classes: class_name
關(guān)聯(lián)條件:s.class_no == c.class_no;
SQL語句
運(yùn)行結(jié)果,匹配不上班級的張三豐也出來了,只是班級名稱用 NULL 填上
任務(wù)2:右連接示例,列出全部班級的學(xué)生學(xué)號、姓名和所在班級名稱(沒有學(xué)生的班級也列出)
student: student_no, student_name
classes: class_name
關(guān)聯(lián)條件:s.class_no == c.class_no;
SQL語句
運(yùn)行結(jié)果,匹配不上學(xué)生的2018電子信息1班也出來了,只是學(xué)號和姓名用 NULL 填上

恭喜你,掌握了數(shù)據(jù)庫表的設(shè)計
你的學(xué)習(xí)進(jìn)度為 15/42!
未完待續(xù)!