MySQL多表查詢總結


MySQL術語:

  • Redundacncy(冗余):存儲兩次或多次數據,以便實現快速查詢。
  • Primary Key(主鍵):主鍵是唯一的。表中每條記錄的唯一標識。
  • Foreign Key(外鍵):用於連接兩張表。

表的連接方式

  • 內連接
  • 外連接
  • 自連接

數據准備

創建兩張表:student表,college表。

 student表結構;

CREATE TABLE `student` (
`studentId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`phone` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`collegeId` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`studentId`),
KEY `collegeId` (`collegeId`)
) ENGINE = MyISAM CHARSET = utf8 COLLATE utf8_unicode_ci;

 

創建的表:

 

college表結構:

CREATE TABLE `college` (
`collegeId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`collegeName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`collegeId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 創建的表:

 

內連接

 

內連接就是表間的主鍵與外鍵連接,只取鍵值一致的,可以獲取雙方表中的數據。語法:

SELECT 列明1,列明2......FROM 表1 INNER JOIN 表2 ON 表1.外鍵 = 表2.主鍵 WHERE 條件語句;

具體MySQL代碼:SELECT student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId;

查詢結果:

說明:通過表的內連接,實現了對兩張表的數據的查詢。將student表中的name字段與college表中的collegeName字段查詢出來。

 

外連接

與取得兩張表中的數據相比,外連接只能取得其中一方存在的數據,外連接又分為左連接和右連接兩種情況。

左外連接

左外連接是以左表為標准,值查詢在左邊表中存在的數據,當然需要兩個表中的鍵值一致。語法為:

SELECT 列明1 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.外鍵 = 表2.主鍵 WHERE條件語句;

MySQL代碼:SELECT student.name,collegeName FROM student LEFT OUTER JOIN college ON student.collegeId = college.collegeId;

運行結果;

可以看到,與內連接不同的是:【錢七】這個學生雖然沒有學校ID,但是也被查詢出來了,這就是我們所說的,左外連接會以左表中的全部數據作為基礎進行查詢。

 

右外連接

同理,右連接將會以右邊的數據作為基礎,進行檢索。語法為:

SELECT 列名1 FROM 表2 RIGHT OUTER JOIN 表2 ON 表1.外鍵 = 表2.主鍵 WHERE 條件語句;

代碼:

SELECT student.name,college.collegeName FROM student RIGHT OUTER JOIN college ON student.collegeId = college.collegeId;

 運行結果:

從運行結果中可以看到,結果是根據右邊的數據表college為基礎進行檢索的。因為表student中並沒有“廈大”對應的學生,所以檢索出來的結果為NULL。

 

總結:

  • 內連接是抽取兩張表中鍵值一致的數據,而外連接(左連接、右連接)時,是以其中的一個表中的全部記錄作為基礎進行檢索的。
  • 左連接與右連接只有數據基准的區別,本質上市一樣的,具體使用哪種連接,根據實際情況決定。
  • 無論是內連接還是外連接,在查詢時候,最好使用【表明.列明】的方式指定需要查詢的列明,否則一旦兩個表中出現了列明一致的數據,將會報錯。
  • 表的別名。其實在我們的實際工程中,如果遇到表明復雜的情況,往往通使用表的別名來簡化代碼。例:SELECT a.name,b.collegeName FROM student a RIGHT OUTER JOIN college b ON a.collegeId = b.collegeId;/SELECT a.name,b.collegeName FROM student AS a RIGHT OUTER JOIN college AS b ON a.collegeId = b.collegeId;(遇上面代碼運行結果一致)。這樣會使得代碼更加簡潔。

 

自連接

自連接顧名思義,就是根據自己連接自己。

現在我們修改【student】表的數據如下,進行效果驗證。

 

代碼:SELECT * FROM student s,student a WHERE a.collegeId = s.collegeId AND a.name <> s.name ORDER BY a.collegeId;

 

 

可以看出我們就將【student】表,在同一個學生的學生查出來了。

語句解釋:

  • 【student s】和【student a】的含義是分別給兩張表起了一個別名,為了代碼簡潔。
  • 【a.collegeId = s.collegeId AND a.name <> a.name】的含義是找出【collegeId】相同,但是【name】不同的人。
  • 【order BY a.collegeId】將結果按順序輸出。

 

子查詢

通常我們在查詢的SQL中嵌套查詢,成為子查詢。子查詢通常會使得復雜的查詢變得簡單,但是相關的子查詢要對基礎表中的的每一條數據都進行子查詢的動作,座椅當表彰的數據量過大的時候,一定要慎重選擇。基本語法如下:

SELECT 列明1 ...FROM 

 代碼:

SELECT * FROM (SELEC

T student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId)b WHERE b.collegeName = '清華';

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM