MySQL復合查詢深度解析
多表查詢
內連接
內連接是最常用的多表連接方式,它只返回兩個表中滿足連接條件的行。
語法:
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;
多表內連接
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;
左外連接
左外連接會返回左表中的所有記錄,即使右表中沒有匹配項,也會保留左表的行,右表沒有對應數據的部分用 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;
右外連接
右外連接和左外連接相反,以右表為主,把它所有行都留下,左表能匹配就匹配,不能匹配補 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 / ...];
必須給表起兩個不同的別名(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 列 運算符 (SELECT 單列
FROM 表2
WHERE 條件
LIMIT 1); -- 確保只返回一行例如:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
多行子查詢
返回多行記錄的子查詢。
多行子查詢的4大運算符
IN:匹配子查詢結果中的任意一個值
SELECT stu_name FROM students WHERE stu_id IN (SELECT stu_id FROM enroll WHERE course = '數學');
ANY:與子查詢結果中的任意一個值比較即可
SELECT name FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE dept_id = 10);
ALL:與所有子查詢結果比較
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);多列子查詢
單行子查詢是指子查詢只返回單列,單行數據;
多行子查詢是指返回單列多行數據,都是針對單列而言的,而多列子查詢則是指查詢返回多個列數據的子查詢語句。
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;合并查詢
在實際應用中,為了合并多個select的執(zhí)行結果,可以使用集合操作符 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;
到此這篇關于MySQL復合查詢深度解析的文章就介紹到這了,更多相關mysql復合查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Windows服務器下MySql數據庫單向主從備份詳細實現步驟分享
將主服務器中的MySql數據庫同步到從服務器中,使得對主服務器的操作可以即時更新到從服務器,避免主服務器因環(huán)境或者網絡異常一時無法使用,達到備份效果,這篇文章整理的確實挺詳細的2012-05-05
Mysql 實現向上遞歸查找父節(jié)點并返回樹結構的示例代碼
通過mysql 8.0以下版本實現,一個人多角色id,一個角色對應某個節(jié)點menu_id,根節(jié)點的父節(jié)點存儲為NULL, 向上遞歸查找父節(jié)點并返回樹結構,今天通過本文給大家介紹Mysql遞歸查找父節(jié)點并返回樹結構,感興趣的朋友一起看看吧2022-09-09
解決MySQL報錯1267 - Illegal mix of coll
這篇文章主要給大家介紹了解決MySQL報錯1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL的問題,文中有詳細的解決方案,需要的朋友可以參考下2023-09-09

