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替換時(shí)間(年月日)字段時(shí)分秒不變實(shí)例解析
這篇文章主要介紹了MYSQL替換時(shí)間(年月日)字段,時(shí)分秒不變的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07
mysql使用字符串字段判斷是否包含某個(gè)字符串的方法
在MySQL中,判斷字符串字段是否包含特定子字符串,可使用LIKE操作符、INSTR()函數(shù)、LOCATE()函數(shù)、POSITION()函數(shù)、FIND_IN_SET()函數(shù)以及正則表達(dá)式REGEXP或RLIKE,每種方法適用于不同的場景和需求,LIKE和INSTR()通常用于簡單包含判斷2024-09-09
MySQL數(shù)據(jù)庫入門之多實(shí)例配置方法詳解
這篇文章主要介紹了MySQL數(shù)據(jù)庫入門之多實(shí)例配置方法,結(jié)合實(shí)例形式分析了MySQL數(shù)據(jù)庫多實(shí)例配置相關(guān)概念、原理、操作方法與注意事項(xiàng),需要的朋友可以參考下2020-05-05

