mysql关联子查询_MySQL 关联子查询
MySQL 關(guān)聯(lián)子查詢
關(guān)聯(lián)子查詢是指一個(gè)包含對(duì)表的引用的子查詢,該表也顯示在外部查詢中。通俗一點(diǎn)來講,就是子查詢引用到了主查詢的數(shù)據(jù)數(shù)據(jù)。
以一個(gè)實(shí)際的例子來理解關(guān)聯(lián)子查詢:
article 文章表:
aidtitlecontentuid
1
文章1
文章1正文內(nèi)容...
1
2
文章2
文章2正文內(nèi)容...
1
3
文章3
文章3正文內(nèi)容...
2
4
文章4
文章4正文內(nèi)容...
4
user 用戶表:
uidusernameemail
1
admin
admin@5idev.com
2
小明
xiao@163.com
3
Jack
jack@gmail.com
我們要查出 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é)果如下:
aidtitlecontentuid
1
文章1
文章1正文內(nèi)容...
1
2
文章2
文章2正文內(nèi)容...
1
3
文章3
文章3正文內(nèi)容...
2
將該例 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í)行;
子查詢?cè)賹⒉樵兘Y(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)處理。
總結(jié)
以上是生活随笔為你收集整理的mysql关联子查询_MySQL 关联子查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL联合查询及取别名
- 下一篇: mysql关联查询语句