MySQL复合查询深度解析
作者:Ragef
这篇文章给大家介绍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的执行结果,可以使用集合操作符 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复合查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!