MySQL中表子查詢與聯系關系子查詢的基本進修教程。本站提示廣大學習愛好者:(MySQL中表子查詢與聯系關系子查詢的基本進修教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中表子查詢與聯系關系子查詢的基本進修教程正文
MySQL 表子查詢
表子查詢是指子查詢前往的成果集是 N 行 N 列的一個表數據。
MySQL 表子查詢實例
上面是用於例子的兩張原始數據表:
article 表:
blog 表:
SQL 以下:
SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)
查詢前往成果以下所示:
該 SQL 的意義在於查找 article 表中指定的字段同時也存在於 blog 表中的一切的行(留意 = 比擬操作符換成了 IN),現實上同等於上面的前提語句:
SELECT * FROM article,blog WHERE (article.title=blog.title AND article.content=blog.content AND article.uid=blog.uid)
現實上,前面的語句是經由 MySQL 優化的而效力更高,或許也能夠應用 MySQL JOIN 表銜接來完成。在此應用該例子只是為了便於描寫表子查詢的用法。
MySQL 聯系關系子查詢
聯系關系子查詢是指一個包括對表的援用的子查詢,該表也顯示在內部查詢中。淺顯一點來說,就是子查詢援用到了主查詢的數據數據。
以一個現實的例子來懂得聯系關系子查詢:
article 文章表:
user 用戶表:
我們要查出 article 表中的數據,但請求 article 中的某個或某些字段與 user 表字段有邏輯關系(本例為 uid 相等)。SQL 語句以下:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE article.uid = user.uid)
前往查詢成果以下:
將該例 SQL 與以下語句比擬更能看出聯系關系子查詢與通俗子查詢的差別:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user)
在本實例中,固然兩個 SQL 履行後的前往成果都一樣,但它們的完成進程是完整紛歧樣的。後者(通俗子查詢)現實被履行為:
SELECT * FROM article WHERE uid IN(1,2,3)
但在聯系關系子查詢中,是沒法零丁履行子查詢語句的。其現實流程年夜致為:
這個履行流程相似於 EXISTS 子查詢,現實上某些情形下 MySQL 就是將聯系關系子查詢重寫為 EXISTS 子查詢來履行的。
MySQL 聯系關系子查詢效力
很顯著,普通情形下聯系關系子查詢的效力是比擬低下的,現實上本例中的聯系關系子查詢例子也僅是為了演示聯系關系子查詢的道理及用法。假如可以的話,聯系關系子查詢盡可能應用 JOIN 或其他查詢來取代。如本例中,應用 INNER JOIN 來調換的 SQL 為:
SELECT article.* FROM article INNER JOIN user ON article.uid = user.uid
留意:此處只是為了演示用 INNER JOIN 調換聯系關系子查詢的樣例,並不是表名這類處置是最優處置。