MySQL操作实战(三):表联结
1. 簡單聯結
①內部聯結
內部聯結又稱為等值聯結。ANSI SQL規范首選INNER JOIN語法 。
內部聯結分為隱式內聯結和顯式內聯結,二者查詢效果相同,僅僅是語法不一樣而已。
隱式內聯結:WHERE子句
FROM tb1_name, tb2_name, tb3_name
WHERE condition_1 AND condition_2
顯式內聯結:INNER JOIN語法
FROM tb1_name
INNER JOIN tb2_name ON condition_1
INNER JOIN tb3_name ON condition_2
- 應用場景:統計參加了考試的學生及其各科成績
2. 高級聯結
①自聯結
自聯結通常作為外部語句用來替代從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是相同的,但有時候處理聯結遠比處理子查詢快得多。
- 應用場景:發現成績表上有個100分的成績存在問題,需查詢100分的這門課程的其它同學的成績是否存在問題
子查詢:先找到100分的這門課程的名稱(lesson_id),然后找出這門課程的其他同學的成績。
mysql> SELECT stu_id, score-> FROM t_score-> WHERE lesson_id = (-> SELECT lesson_id-> FROM t_score-> WHERE score = 100)-> ; +--------+-------+ | stu_id | score | +--------+-------+ | 1 | 98 | | 2 | 84 | | 3 | 100 | | 4 | 99 | +--------+-------+自聯結:此查詢中需要的兩個表實際上是相同的表,因此t_score表在FROM 子句中出現了兩次。雖然這是合法的,但對t_score表的引用具有二義性,因為MySQL不知道引用的是t_score表的哪個實例。
mysql> SELECT a.stu_id, a.score-> FROM t_score a, t_score b-> WHERE a.lesson_id = b.lesson_id AND b.score = 100-> ; +--------+-------+ | stu_id | score | +--------+-------+ | 1 | 98 | | 2 | 84 | | 3 | 100 | | 4 | 99 | +--------+-------+②自然聯結
無論何時對表進行聯結,應該至少有一個列出現在不止一個表中(被聯結的列)。標準的聯結返回所有數據,甚至相同的列多次出現。
自然聯結排除多次出現,使每個列只返回一次。
通配符*只對表t_stu_profile使用,所有其它列明確列出,所以沒有重復的列被檢索出來。
mysql> SELECT b.*, a.lesson_id, c.lesson_name, a.score-> FROM t_score a, t_stu_profile b, t_lesson c-> WHERE a.stu_id = b.stu_id AND a.lesson_id = c.lesson_id-> ;事實上,迄今為止建立的每個內部聯結都是自然聯結,很可能永遠都不會用到不是自然聯結的內部聯結。
③外部聯結
許多聯結將一個表中的行與另一個表中的行相關聯,但有時候會需要包含沒有關聯行的那些行。例如,需要對每個客戶下了多少訂單進行計數,包括那些至今尚未下訂單的客戶。
那么,聯結包含了那些在相關表中沒有關聯行的行,這種類型的聯結稱為外部聯結。
- 應用場景:統計每位同學的成績,包括沒參加考試的同學
外部聯結:外部聯結分為左外部聯結(LEFT OUTER JOIN)和右外部聯結(RIGHT OUTER JOIN)
mysql> SELECT a.stu_id, stu_name, lesson_id, score-> FROM t_score a-> RIGHT OUTER JOIN t_stu_profile b-> ON a.stu_id = b.stu_id-> ; +--------+----------+-----------+-------+ | stu_id | stu_name | lesson_id | score | +--------+----------+-----------+-------+ | 1 | 郭東 | L001 | 98 | | 1 | 郭東 | L002 | 86 | | 1 | 郭東 | L003 | 79 | | 1 | 郭東 | L004 | 88 | | 1 | 郭東 | L005 | 98 | | 2 | 李西 | L001 | 84 | | 2 | 李西 | L002 | 90 | | 2 | 李西 | L003 | 86 | | 2 | 李西 | L004 | 75 | | 2 | 李西 | L005 | 77 | | 3 | 張北 | L001 | 100 | | 3 | 張北 | L002 | 91 | | 3 | 張北 | L003 | 85 | | 3 | 張北 | L004 | 79 | | 3 | 張北 | L005 | 85 | | 4 | 錢南 | L001 | 99 | | 4 | 錢南 | L002 | 88 | | 4 | 錢南 | L003 | 66 | | 4 | 錢南 | L004 | 66 | | 4 | 錢南 | L005 | 98 | | NULL | 王五 | NULL | NULL | | NULL | 趙七 | NULL | NULL | +--------+----------+-----------+-------+總結
以上是生活随笔為你收集整理的MySQL操作实战(三):表联结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL操作实战(一):关键字 函数
- 下一篇: 如何锁定 Visual SourceSa