MySQL的子查詢(xún)中FROM和EXISTS子句的使用教程
FROM 子查詢(xún)
FROM 子句中的子查詢(xún)
MySQL FROM 子查詢(xún)是指 FROM 的子句作為子查詢(xún)語(yǔ)句,主查詢(xún)?cè)俚阶硬樵?xún)結(jié)果中獲取需要的數(shù)據(jù)。FROM 子查詢(xún)語(yǔ)法如下:
SELECT ... FROM (subquery) AS name ...
子查詢(xún)會(huì)生成一個(gè)臨時(shí)表,由于 FROM 子句中的每個(gè)表必須有一個(gè)名稱(chēng),因此 AS name 是必須的。FROM 子查詢(xún)也稱(chēng)為衍生數(shù)據(jù)表子查詢(xún)。
FROM 子查詢(xún)實(shí)例
table1:
s1 s2 1 5 2 12 3 20
FROM 子查詢(xún) SQL 如下:
SELECT s1,s2 FROM (SELECT s1, s2*2 AS s2 FROM table1) AS temp WHERE s1 > 1
查詢(xún)返回結(jié)果如下所示:
s1 s2 2 24 3 40
提示
MySQL FROM 子句中的子查詢(xún)可以返回標(biāo)量、列、行或表,但不能為有關(guān)聯(lián)的子查詢(xún)。
MySQL 子查詢(xún) EXISTS 和 NOT EXISTS
MySQL EXISTS 和 NOT EXISTS 子查詢(xún)
MySQL EXISTS 和 NOT EXISTS 子查詢(xún)語(yǔ)法如下:
SELECT ... FROM table WHERE EXISTS (subquery)
該語(yǔ)法可以理解為:將主查詢(xún)的數(shù)據(jù),放到子查詢(xún)中做條件驗(yàn)證,根據(jù)驗(yàn)證結(jié)果(TRUE 或 FALSE)來(lái)決定主查詢(xún)的數(shù)據(jù)結(jié)果是否得以保留。
MySQL EXISTS 子查詢(xún)實(shí)例
下面以實(shí)際的例子來(lái)理解 EXISTS 子查詢(xún)。下面是原始的數(shù)據(jù)表:
article 文章表:

user 用戶(hù)表:

我們要查出 article 表中的數(shù)據(jù),但要求 uid 必須在 user 表中存在。SQL 語(yǔ)句如下:
SELECT * FROM article WHERE EXISTS (SELECT * FROM user WHERE article.uid = user.uid)
返回查詢(xún)結(jié)果如下:

從語(yǔ)句執(zhí)行結(jié)果可以看出,article 表中第 4 條記錄沒(méi)有被保留,原因就是該條記錄的數(shù)據(jù)在子查詢(xún)中返回的結(jié)果是 FALSE 。
當(dāng)上面的 SQL 使用 NOT EXISTS 時(shí),查詢(xún)的結(jié)果就是 article 表中 uid 不存在于 user 表中的數(shù)據(jù)記錄。
提示
EXISTS (subquery) 只返回 TRUE 或 FALSE,因此子查詢(xún)中的 SELECT * 也可以是 SELECT 1 或其他,官方說(shuō)法是實(shí)際執(zhí)行時(shí)會(huì)忽略 SELECT 清單,因此沒(méi)有區(qū)別。
EXISTS 子查詢(xún)的實(shí)際執(zhí)行過(guò)程可能經(jīng)過(guò)了優(yōu)化而不是我們理解上的逐條對(duì)比,如果擔(dān)憂(yōu)效率問(wèn)題,可進(jìn)行實(shí)際檢驗(yàn)以確定是否有效率問(wèn)題。
EXISTS 子查詢(xún)往往也可以用條件表達(dá)式、其他子查詢(xún)或者 JOIN 來(lái)替代,何種最優(yōu)需要具體問(wèn)題具體分析。
- MySQL中in與exists的使用及區(qū)別介紹
- 對(duì)比分析MySQL語(yǔ)句中的IN 和Exists
- mysql exists與not exists實(shí)例詳解
- MySQL exists 和in 詳解及區(qū)別
- mySQL中in查詢(xún)與exists查詢(xún)的區(qū)別小結(jié)
- MySQL關(guān)于exists的一個(gè)bug
- 安裝mysql出錯(cuò)”A Windows service with the name MySQL already exists.“如何解決
- MYSQL IN 與 EXISTS 的優(yōu)化示例介紹
- mysql not in、left join、IS NULL、NOT EXISTS 效率問(wèn)題記錄
- UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists
- Mysql?exists用法小結(jié)
相關(guān)文章
MYSQL隨機(jī)抽取查詢(xún) MySQL Order By Rand()效率問(wèn)題
MYSQL隨機(jī)抽取查詢(xún):MySQL Order By Rand()效率問(wèn)題一直是開(kāi)發(fā)人員的常見(jiàn)問(wèn)題,俺們不是DBA,沒(méi)有那么牛B,所只能慢慢研究咯,最近由于項(xiàng)目問(wèn)題,需要大概研究了一下MYSQL的隨機(jī)抽取實(shí)現(xiàn)方法2011-11-11
Node-Red實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)連接的方法
這篇文章主要介紹了Node-Red實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)連接的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Mysql8創(chuàng)建用戶(hù)及賦權(quán)操作實(shí)戰(zhàn)記錄
一般在開(kāi)發(fā)中,我們需要新建一個(gè)賬戶(hù),并賦予某個(gè)數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限,下面這篇文章主要給大家介紹了關(guān)于Mysql8創(chuàng)建用戶(hù)及賦權(quán)操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
查看修改mysql編碼方式讓它支持中文(gbk或者utf8)
MySQL的默認(rèn)編碼是Latin1,不支持中文,要支持中文需要把數(shù)據(jù)庫(kù)的默認(rèn)編碼修改為gbk或者utf8,真的是很麻煩啊,不過(guò)本文提供了詳細(xì)的修改教程,感興趣的你可不要走開(kāi)啊,希望本文對(duì)你有所幫助2013-01-01

