MySQL中表子查詢與關聯(lián)子查詢的基礎學習教程
MySQL 表子查詢
表子查詢是指子查詢返回的結(jié)果集是 N 行 N 列的一個表數(shù)據(jù)。
MySQL 表子查詢實例
下面是用于例子的兩張原始數(shù)據(jù)表:
article 表:
blog 表:
SQL 如下:
SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)
查詢返回結(jié)果如下所示:
該 SQL 的意義在于查找 article 表中指定的字段同時也存在于 blog 表中的所有的行(注意 = 比較操作符換成了 IN),實際上等同于下面的條件語句:
SELECT * FROM article,blog WHERE (article.title=blog.title AND article.content=blog.content AND article.uid=blog.uid)
實際上,后面的語句是經(jīng)過 MySQL 優(yōu)化的而效率更高,或者也可以使用 MySQL JOIN 表連接來實現(xiàn)。在此使用該例子只是為了便于描述表子查詢的用法。
MySQL 關聯(lián)子查詢
關聯(lián)子查詢是指一個包含對表的引用的子查詢,該表也顯示在外部查詢中。通俗一點來講,就是子查詢引用到了主查詢的數(shù)據(jù)數(shù)據(jù)。
以一個實際的例子來理解關聯(lián)子查詢:
article 文章表:
user 用戶表:
我們要查出 article 表中的數(shù)據(jù),但要求 article 中的某個或某些字段與 user 表字段有邏輯關系(本例為 uid 相等)。SQL 語句如下:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE article.uid = user.uid)
返回查詢結(jié)果如下:
將該例 SQL 與如下語句比較更能看出關聯(lián)子查詢與普通子查詢的區(qū)別:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user)
在本實例中,雖然兩個 SQL 執(zhí)行后的返回結(jié)果都一樣,但它們的實現(xiàn)過程是完全不一樣的。后者(普通子查詢)實際被執(zhí)行為:
SELECT * FROM article WHERE uid IN(1,2,3)
但在關聯(lián)子查詢中,是無法單獨執(zhí)行子查詢語句的。其實際流程大致為:
- 先做外部主查詢;
- 將主查詢的值傳入子查詢并執(zhí)行;
- 子查詢再將查詢結(jié)果返回主查詢,主查詢根據(jù)返回結(jié)果完成最終的查詢。
這個執(zhí)行流程類似于 EXISTS 子查詢,實際上某些情況下 MySQL 就是將關聯(lián)子查詢重寫為 EXISTS 子查詢來執(zhí)行的。
MySQL 關聯(lián)子查詢效率
很明顯,一般情況下關聯(lián)子查詢的效率是比較低下的,實際上本例中的關聯(lián)子查詢例子也僅是為了演示關聯(lián)子查詢的原理及用法。如果可以的話,關聯(lián)子查詢盡量使用 JOIN 或其他查詢來代替。如本例中,使用 INNER JOIN 來替換的 SQL 為:
SELECT article.* FROM article INNER JOIN user ON article.uid = user.uid
注意:此處只是為了演示用 INNER JOIN 替換關聯(lián)子查詢的樣例,并非表名這種處理是最優(yōu)處理。
相關文章
asp+mysql+utf8 網(wǎng)頁出現(xiàn)亂碼問題的解決方法
無論在網(wǎng)頁中加多少UTF8的定義,顯示的結(jié)果都還是會有一些小格子,反而定義為gb2312,顯示完全正常2014-03-03mysql 數(shù)據(jù)庫備份和還原方法集錦 推薦
本文討論 MySQL 的備份和恢復機制,以及如何維護數(shù)據(jù)表,包括最主要的兩種表類型:MyISAM 和 Innodb,文中設計的 MySQL 版本為 5.0.22。2010-03-03Windows系統(tǒng)下MySQL添加到系統(tǒng)服務方法(mysql解壓版)
這篇文章主要介紹了Windows系統(tǒng)下MySQL添加到系統(tǒng)服務方法,主要針對mysql解壓版,感興趣的朋友參考下吧2016-05-05在Windows環(huán)境下安裝MySQL 的教程圖解
這篇文章主要介紹了在Windows環(huán)境下安裝MySQL 的教程圖解,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07MySQL需要根據(jù)特定順序排序的實現(xiàn)方法
在MySQL中,我們可以通過指定順序排序來在查詢結(jié)果中控制數(shù)據(jù)的排列順序,這種排序方式是非常有用的,本文就來介紹一下,感興趣的可以了解一下2023-11-11