MySQL復(fù)合查詢深度解析
多表查詢
內(nèi)連接
內(nèi)連接是最常用的多表連接方式,它只返回兩個(gè)表中滿足連接條件的行。
語法:
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;
例如:
SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.dept_id;
多表內(nèi)連接
SELECT e.name, d.dept_name, p.project_name FROM employees e INNER JOIN departments d ON e.dept_id = d.dept_id INNER JOIN projects p ON e.project_id = p.id;
左外連接
左外連接會返回左表中的所有記錄,即使右表中沒有匹配項(xiàng),也會保留左表的行,右表沒有對應(yīng)數(shù)據(jù)的部分用 NULL 填充。
語法:
SELECT 列名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 左表.列 = 右表.列;
左表寫在FROM子句中,右表寫在JOIN子句中。
例如:
SELECT e.name, d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.dept_id;
右外連接
右外連接和左外連接相反,以右表為主,把它所有行都留下,左表能匹配就匹配,不能匹配補(bǔ) NULL。
語法:
SELECT 列列表 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 連接條件;
例如:
SELECT s.id, st.name, s.score FROM students st RIGHT JOIN scores s ON st.id = s.student_id;
自連接
自連接是指在同一張表連接查詢。
語法:
SELECT 列 FROM 表名 AS A JOIN 表名 AS B ON A.某列 = B.某列 [WHERE / GROUP BY / ...];
必須給表起兩個(gè)不同的別名(A、B)
SELECT e.name AS employee,
m.name AS manager
FROM employees AS e
LEFT JOIN employees AS m
ON e.manager_id = m.emp_id;子查詢
子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢。
單行子查詢
返回一行記錄的子查詢。
SELECT ...
FROM 表1
WHERE 列 運(yùn)算符 (SELECT 單列
FROM 表2
WHERE 條件
LIMIT 1); -- 確保只返回一行例如:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
多行子查詢
返回多行記錄的子查詢。
多行子查詢的4大運(yùn)算符
IN:匹配子查詢結(jié)果中的任意一個(gè)值
SELECT stu_name FROM students WHERE stu_id IN (SELECT stu_id FROM enroll WHERE course = '數(shù)學(xué)');
ANY:與子查詢結(jié)果中的任意一個(gè)值比較即可
SELECT name FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE dept_id = 10);
ALL:與所有子查詢結(jié)果比較
SELECT name FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE dept_id = 10);
EXISTS:子查詢至少返回一行則為真
SELECT name
FROM students s
WHERE EXISTS (SELECT 1
FROM scores sc
WHERE sc.stu_id = s.stu_id
AND sc.score > 90);多列子查詢
單行子查詢是指子查詢只返回單列,單行數(shù)據(jù);
多行子查詢是指返回單列多行數(shù)據(jù),都是針對單列而言的,而多列子查詢則是指查詢返回多個(gè)列數(shù)據(jù)的子查詢語句。
SELECT name
FROM employees
WHERE (dept_id, job_title) IN (
SELECT dept_id, job_title
FROM employees
WHERE name = '張三'
);from子句中使用子查詢
SELECT d.dept_name, t.avg_sal
FROM (
SELECT dept_id, AVG(salary) AS avg_sal
FROM emp
GROUP BY dept_id
) AS t
JOIN dept d ON d.dept_id = t.dept_id
WHERE t.avg_sal > 8000;合并查詢
在實(shí)際應(yīng)用中,為了合并多個(gè)select的執(zhí)行結(jié)果,可以使用集合操作符 union,union all
union(去重合并)
SELECT name FROM employees UNION SELECT name FROM contractors;
union all(不去重、速度快)
SELECT name FROM employees UNION ALL SELECT name FROM contractors;
到此這篇關(guān)于MySQL復(fù)合查詢深度解析的文章就介紹到這了,更多相關(guān)mysql復(fù)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL內(nèi)存及虛擬內(nèi)存優(yōu)化設(shè)置參數(shù)
這篇文章主要介紹了MySQL內(nèi)存及虛擬內(nèi)存優(yōu)化設(shè)置參數(shù),需要的朋友可以參考下2016-05-05
Windows服務(wù)器下MySql數(shù)據(jù)庫單向主從備份詳細(xì)實(shí)現(xiàn)步驟分享
將主服務(wù)器中的MySql數(shù)據(jù)庫同步到從服務(wù)器中,使得對主服務(wù)器的操作可以即時(shí)更新到從服務(wù)器,避免主服務(wù)器因環(huán)境或者網(wǎng)絡(luò)異常一時(shí)無法使用,達(dá)到備份效果,這篇文章整理的確實(shí)挺詳細(xì)的2012-05-05
Mysql 實(shí)現(xiàn)向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu)的示例代碼
通過mysql 8.0以下版本實(shí)現(xiàn),一個(gè)人多角色id,一個(gè)角色對應(yīng)某個(gè)節(jié)點(diǎn)menu_id,根節(jié)點(diǎn)的父節(jié)點(diǎn)存儲為NULL, 向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),今天通過本文給大家介紹Mysql遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),感興趣的朋友一起看看吧2022-09-09
解決MySQL報(bào)錯(cuò)1267 - Illegal mix of coll
這篇文章主要給大家介紹了解決MySQL報(bào)錯(cuò)1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL的問題,文中有詳細(xì)的解決方案,需要的朋友可以參考下2023-09-09
mysql中find_in_set()函數(shù)的使用詳解
這篇文章主要介紹了mysql中find_in_set()函數(shù)的使用,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05

