国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL中表子查詢與關聯子查詢的基礎學習教程

2024-07-24 13:08:34
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL中表子查詢與關聯子查詢的基礎學習教程,同時文中也提到了關于關聯子查詢的查詢效率問題,需要的朋友可以參考下
 

MySQL 表子查詢
表子查詢是指子查詢返回的結果集是 N 行 N 列的一個表數據。
MySQL 表子查詢實例
下面是用于例子的兩張原始數據表:
article 表:

MySQL中表子查詢與關聯子查詢的基礎學習教程

blog 表:

MySQL中表子查詢與關聯子查詢的基礎學習教程

SQL 如下:

SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)

查詢返回結果如下所示:

MySQL中表子查詢與關聯子查詢的基礎學習教程

該 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 文章表:

MySQL中表子查詢與關聯子查詢的基礎學習教程

user 用戶表:

MySQL中表子查詢與關聯子查詢的基礎學習教程

我們要查出 article 表中的數據,但要求 article 中的某個或某些字段與 user 表字段有邏輯關系(本例為 uid 相等)。SQL 語句如下:

SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE article.uid = user.uid)

返回查詢結果如下:

MySQL中表子查詢與關聯子查詢的基礎學習教程

將該例 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 替換關聯子查詢的樣例,并非表名這種處理是最優處理。



注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 资源县| 安乡县| 吉隆县| 榆中县| 蓬安县| 石台县| 宜君县| 丰原市| 项城市| 筠连县| 孟连| 莱西市| 渝中区| 辽中县| 阿尔山市| 沙雅县| 尼玛县| 邢台市| 从江县| 米林县| 陇南市| 邵阳县| 巴楚县| 海城市| 建瓯市| 平昌县| 松潘县| 邵阳县| 湖口县| 黑龙江省| 高要市| 习水县| 姚安县| 隆安县| 襄樊市| 五峰| 桦南县| 蒙阴县| 津市市| 惠水县| 安多县|