各鏈接的由來
一、當業務系統演變複雜時,系統內部數據庫的表結構也會隨着複雜化,而不在是簡單的單表操做。某個系統業務,每每伴隨着是多個表之間的鏈接查詢。mysql
二、爲了消除多表查詢中出現的笛卡爾積效應致使的多冗餘數據。sql
各鏈接的講解
爲了能幫助你們理解各鏈接的狀況和區別,所以建立了兩張表,具體表結構和數據以下:數據庫
DROP TABLE IS EXISTS `student`; DROP TABLE IS EXISTS `course`; DROP TABLE IS EXISTS `sc`; -- 學生表 CREATE TABLE student ( `sid` INT NOT NULL AUTO_INCREMENT, `snum` INT NOT NULL PRIMARY KEY, `sname` VARCHAR (20) NOT NULL, `sage` TINYINT, `sclass` SMALLINT NOT NULL, UNIQUE KEY `student_num` (`sid`) # 最後不能加',',不然會報錯 ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8; # 使用'='的都放在student()以外。 INSERT INTO `student` ( `snum`, `sname`, `sage`, `sclass` ) VALUES (20201101, 'zhangsan', 20, 150), (20201102, 'lisi', 18, 151), (20201103, 'wangwu', 19, 151), (20201104, 'zhaoliu', 18, 150), (20201105, 'qianqi', 21, 151), (20201106, 'sunba', 20, 152); -- 課程表 CREATE TABLE course ( `cid` INT NOT NULL AUTO_INCREMENT, `cnum` INT NOT NULL PRIMARY KEY, `cname` VARCHAR (20) NOT NULL, UNIQUE KEY `course_num` (`cid`) # 最後不能加',',不然會報錯 ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8; # 使用'='的都放在student()以外。 INSERT INTO `course` ( `cnum`, `cname` ) VALUES (101, '數據結構'), (102, '編譯原理'), (103, '計算機網絡'), (105,'計算機組成原理'), (106, '數據庫'); -- 學生課程中間表 CREATE TABLE `sc` ( `scid` INT NOT NULL UNIQUE AUTO_INCREMENT, `snum` INT NOT NULL, `cnum` INT NOT NULL, `grade` SMALLINT, PRIMARY KEY (`snum`, `cnum`) ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8; INSERT INTO `sc` ( `snum`, `cnum`, `grade` ) VALUES (20201101, 101, 85), (20201102, 101, 55), (20201103, 101, 90), (20201101, 102, 88), (20201102, 102, 75), (20201103, 102, 58), (20201101, 103, 72), (20201102, 103, 80), (20201103, 103, 92);
1. 等值鏈接
等值鏈接也稱爲顯示內鏈接,在進行多表聯合查詢時經過「=」等號來鏈接多張表之間相字段對應的值,其產生的結果會出現重複列。意思是,若是對多張表進行等值鏈接操做,那麼前提要求是這多張表之間必須有相同的字段名。好比上述表中,課程表和學生課程中間表均有相同的「cnum」字段,學生表與學生課程中間表均有相同的「snum」字段。網絡
2. 自鏈接
自鏈接是一種特殊的鏈接,它的本質是將一個表與它自身作鏈接, 若要在一個表中查找具備相同列值的行,則可使用自鏈接。使用自鏈接時需爲表指定兩個別名,且對全部列的引用均要用別名限定。數據結構
3. 天然鏈接
天然鏈接是一種特殊的等值鏈接,在進行多表聯合查詢時經過「natural join」關鍵字來鏈接多張表之間相同字段對應的值,其產生的結果會將重複列只保留一個。若是對多張表進行天然鏈接操做,那麼前提要求是這多張表之間必須有相同的字段名。好比上述表中,課程表和學生課程中間表均有相同的「cnum」字段,學生表與學生課程中間表均有相同的「snum」字段。spa
4. 左右外鏈接
左外鏈接在進行多表聯合查詢時經過「left join.. on 」關鍵字來鏈接多張表之間符合條件的字段,其查詢的結果會返回左表的全部數據,以及左右表交集的數據,若右表記錄不足,則使用null來表示須要篩選的右表的值。計算機網絡
右外鏈接在進行多表聯合查詢時經過「right join.. on 」關鍵字來鏈接多張表之間符合條件的字段,其查詢的結果會返回右表的全部數據,以及左右表交集的數據,若左表記錄不足,則使用null來表示須要篩選的右表的值。3d
5. 內鏈接
內外接在進行多表聯合查詢時經過「inner join.. on 」關鍵字來鏈接多張表之間符合條件的字段,其查詢的結果左右表匹配的數據。code
6. 全鏈接
全鏈接在進行多表聯合查詢時經過full join.. on 」關鍵字來鏈接多張表之間符合條件的字段,其查詢的結果除了會返回左右表匹配的數據,還會返回兩個表的全部行。可是mysql中沒有全鏈接,也可使用"UNION " 來實現full join 功能,union 鏈接左右外鏈接。blog