等值鏈接、自鏈接、天然鏈接、左右外鏈接、內鏈接、全鏈接講解

各鏈接的由來

       一、當業務系統演變複雜時,系統內部數據庫的表結構也會隨着複雜化,而不在是簡單的單表操做。某個系統業務,每每伴隨着是多個表之間的鏈接查詢。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

 

  

用心對待,相信美好東西會如期歸來。ღ( ´・ᴗ・` )比