共計(jì) 2001 個(gè)字符,預(yù)計(jì)需要花費(fèi) 6 分鐘才能閱讀完成。
這篇文章主要介紹“MySQL 數(shù)據(jù)庫(kù)子查詢語法規(guī)則是什么”,在日常操作中,相信很多人在 MySQL 數(shù)據(jù)庫(kù)子查詢語法規(guī)則是什么問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL 數(shù)據(jù)庫(kù)子查詢語法規(guī)則是什么”的疑惑有所幫助!接下來,請(qǐng)跟著丸趣 TV 小編一起來學(xué)習(xí)吧!
子查詢是在查詢語句里面再嵌套一個(gè)查詢,這是因?yàn)槲覀冊(cè)谔崛?shù)據(jù)的時(shí)候有很多不知道的數(shù)據(jù)產(chǎn)生了依賴關(guān)系。此時(shí)我們就需要先查詢一組數(shù)據(jù)的結(jié)果集,然后將這個(gè)結(jié)果集作用為下一個(gè)查詢的對(duì)象。在“表連接的章節(jié)”,我們?cè)f過子查詢的效率低下的問題,其實(shí)并不是所有的子查詢效率都是低下的,“WHERE”子查詢?cè)谄ヅ溆涗浀臅r(shí)候要反復(fù)執(zhí)行,這是不推薦使用的;但是如果將查詢結(jié)果集當(dāng)做一張表來使用,與其他的表做一個(gè)連接,這就是“FROM”子句的子查詢了,這種子查詢的方式,還是比較推薦使用的。
子查詢簡(jiǎn)介
子查詢是一種查詢語句中再嵌套一個(gè)查詢的語句
普通查詢語句分為“SELECT”子查詢、“FROM”子查詢、“WHERE 子查詢;(重點(diǎn)推薦使用‘FROM’子查詢”)
子查詢示例如下:
查詢底薪超過公司平均底薪的員工信息。(之前我們使用過表連接的方式做個(gè)這個(gè)案例,這里來看一下如何通過子查詢的方式來實(shí)現(xiàn)。)
SELECT
empno, ename, sal
FROM
t_emp
WHERE
sal = (SELECT AVG(sal) FROM t_emp);
-- 正常情況下,將聚合函數(shù)作為 WHERE 子句的條件是不可以的,但是這里利用子查詢與聚合函數(shù)先將平均底薪查詢出來,這就變成具體的數(shù)據(jù)了
-- 這種情況下,作為 WHERE 子句的條件,就可以被使用了
以上就是 WHERE 子句的子查詢,不過 WHERE 子句的子查詢使不推薦使用的,應(yīng)該使用表連接的寫法。
WHERE 子查詢
在書寫 SQL 語句的時(shí)候,WHERE 子查詢最符合我們?nèi)说乃伎歼壿?
雖然這種 子查詢 最簡(jiǎn)單、最容易理解,但是卻是效率很低的子查詢
以剛剛演示的 查詢底薪超過公司平均底薪的員工信息 來說吧。“WHERE”子句拿每一條員工的記錄與“SELECT”子查詢做比較的時(shí)候,子查詢都需要重新執(zhí)行一次。如果員工表有 10000 條記錄,那么 子查詢 就需要執(zhí)行 10000 次,反復(fù)執(zhí)行這么多次,效率上是極其低下的。
在查詢語句中,反復(fù)被查詢的子查詢被稱為“相關(guān)子查詢”,這里的“WHERE”子查詢就屬于“相關(guān)子查詢”應(yīng)該避免使用這種子查詢。
FROM 子查詢
在查詢語句中,“FROM”子查詢只會(huì)執(zhí)行一次,這與“WHERE”子查詢是相反的,所以查詢效率很高。
同樣以 查詢底薪超過公司平均底薪的員工信息 為例,來看一看“FROM”子查詢是如何實(shí)現(xiàn)的。
SELECT
e.empno, e.ename, e.sal, t.avg
FROM t_emp e
JOIN (SELECT deptno, AVG(sal) AS avg FROM t_emp GROUP BY deptno) t
ON e.deptno = t.deptno
AND e.sal = t.avg;
-- 首先,按照每一個(gè)部門編號(hào)去分組,然后統(tǒng)計(jì)部門標(biāo)號(hào)與該部門對(duì)應(yīng)的平均月薪。將這個(gè)結(jié)果集作為一張臨時(shí)的表與員工的表做連接。-- 連接的條件為 員工表 的 部門編號(hào) = 結(jié)果集 的 部門編號(hào),并且員工的月薪大于部門的平均月薪
所以這個(gè)題目利用 FROM 子查詢也可以輕松的實(shí)現(xiàn),未必要使用 WHERE 子查詢。因?yàn)?FROM 子查詢并不是 相關(guān)子查詢,所以再解決一些問題的時(shí)候應(yīng)該有限選擇這種子查詢類型。
SELECT 子查詢
說一句實(shí)在的,這種子查詢?cè)谖夷壳敖?jīng)歷的所有項(xiàng)目中,一次也沒見到過。
究其原因呢,是因?yàn)椤癝ELECT”子查詢也是相關(guān)子查詢,它在 SQL 語句中也會(huì)反復(fù)的執(zhí)行,查詢效率很低。
這里我們就舉個(gè)例子:比如說現(xiàn)在要查詢每個(gè)員工的部門信息,
SELECT
e.empno,
e.ename,
(SELECT dname FROM t_dept WHERE deptno = e.deptno) AS 部門名稱
FROM t_emp e;
-- 先試用 SELECT 子查詢查詢出 部門表 中的部門名稱,約束條件為 部門表 中的 部門編號(hào) 與 員工表 中的 部門編號(hào) 一致
-- 將 SELECT 子查詢得到的 部門名稱 作為 SQL 語句中的一個(gè)字段進(jìn)行輸出
雖然執(zhí)行出來的結(jié)果是對(duì)的,但是執(zhí)行的效率實(shí)在是太低了,所以這種 SELECT 子查詢的方式也是不推薦使用的,了解即可,當(dāng)我們看到有其他人使用 SELECT 子查詢的時(shí)候,最好善意的提醒一下。
到此,關(guān)于“MySQL 數(shù)據(jù)庫(kù)子查詢語法規(guī)則是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!