亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中表子查詢與關(guān)聯(lián)子查詢的基礎(chǔ)學(xué)習(xí)教程

 更新時(shí)間:2015年12月18日 10:06:43   投稿:goldensun  
這篇文章主要介紹了MySQL中表子查詢與關(guān)聯(lián)子查詢的基礎(chǔ)學(xué)習(xí)教程,同時(shí)文中也提到了關(guān)于關(guān)聯(lián)子查詢的查詢效率問題,需要的朋友可以參考下

MySQL 表子查詢
表子查詢是指子查詢返回的結(jié)果集是 N 行 N 列的一個(gè)表數(shù)據(jù)。
MySQL 表子查詢實(shí)例
下面是用于例子的兩張?jiān)紨?shù)據(jù)表:
article 表:

2015121895547250.png (640×131)

blog 表:

2015121895608029.png (642×104)

SQL 如下:

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

查詢返回結(jié)果如下所示:

20151218100320512.png (642×84)

該 SQL 的意義在于查找 article 表中指定的字段同時(shí)也存在于 blog 表中的所有的行(注意 = 比較操作符換成了 IN),實(shí)際上等同于下面的條件語句:

SELECT * FROM article,blog 
WHERE (article.title=blog.title AND article.content=blog.content AND article.uid=blog.uid)

實(shí)際上,后面的語句是經(jīng)過 MySQL 優(yōu)化的而效率更高,或者也可以使用 MySQL JOIN 表連接來實(shí)現(xiàn)。在此使用該例子只是為了便于描述表子查詢的用法。

MySQL 關(guān)聯(lián)子查詢
關(guān)聯(lián)子查詢是指一個(gè)包含對表的引用的子查詢,該表也顯示在外部查詢中。通俗一點(diǎn)來講,就是子查詢引用到了主查詢的數(shù)據(jù)數(shù)據(jù)。
以一個(gè)實(shí)際的例子來理解關(guān)聯(lián)子查詢:
article 文章表:

20151218100140774.png (643×127)

user 用戶表:

2015121895813868.png (649×104)

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

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

返回查詢結(jié)果如下:

2015121895947027.png (642×106)

將該例 SQL 與如下語句比較更能看出關(guān)聯(lián)子查詢與普通子查詢的區(qū)別:

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

在本實(shí)例中,雖然兩個(gè) SQL 執(zhí)行后的返回結(jié)果都一樣,但它們的實(shí)現(xiàn)過程是完全不一樣的。后者(普通子查詢)實(shí)際被執(zhí)行為:

SELECT * FROM article WHERE uid IN(1,2,3)

但在關(guān)聯(lián)子查詢中,是無法單獨(dú)執(zhí)行子查詢語句的。其實(shí)際流程大致為:

  • 先做外部主查詢;
  • 將主查詢的值傳入子查詢并執(zhí)行;
  • 子查詢再將查詢結(jié)果返回主查詢,主查詢根據(jù)返回結(jié)果完成最終的查詢。

這個(gè)執(zhí)行流程類似于 EXISTS 子查詢,實(shí)際上某些情況下 MySQL 就是將關(guān)聯(lián)子查詢重寫為 EXISTS 子查詢來執(zhí)行的。

MySQL 關(guān)聯(lián)子查詢效率
很明顯,一般情況下關(guān)聯(lián)子查詢的效率是比較低下的,實(shí)際上本例中的關(guān)聯(lián)子查詢例子也僅是為了演示關(guān)聯(lián)子查詢的原理及用法。如果可以的話,關(guān)聯(lián)子查詢盡量使用 JOIN 或其他查詢來代替。如本例中,使用 INNER JOIN 來替換的 SQL 為:

SELECT article.* FROM article INNER JOIN user ON article.uid = user.uid

注意:此處只是為了演示用 INNER JOIN 替換關(guān)聯(lián)子查詢的樣例,并非表名這種處理是最優(yōu)處理。

相關(guān)文章

最新評論