MySQL复合查询深度解析

 更新时间:2025年08月26日 14:39:39   作者: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复合查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL内存及虚拟内存优化设置参数

    MySQL内存及虚拟内存优化设置参数

    这篇文章主要介绍了MySQL内存及虚拟内存优化设置参数,需要的朋友可以参考下
    2016-05-05
  • Windows服务器下MySql数据库单向主从备份详细实现步骤分享

    Windows服务器下MySql数据库单向主从备份详细实现步骤分享

    将主服务器中的MySql数据库同步到从服务器中,使得对主服务器的操作可以即时更新到从服务器,避免主服务器因环境或者网络异常一时无法使用,达到备份效果,这篇文章整理的确实挺详细的
    2012-05-05
  • Windows中MySQL root用户忘记密码解决方案

    Windows中MySQL root用户忘记密码解决方案

    在实际应用中,经常会出现忘记mysql管理员用户root的密码的情况出现,那么我们如何来设置一个新密码从而登录数据库呢,下面我们来探讨下
    2014-07-07
  • MySQL删除外键问题小结

    MySQL删除外键问题小结

    mysql删除外键抱错Error on rename of ./ruler/test2child to ./ruler/#sql2-298-92 (errno: 152),怎么回事,有好的方法可以解决吗?下面看下脚本之家小编给大家带来的解决思路
    2016-08-08
  • PHP中ORDER BY子句的详细用法教程

    PHP中ORDER BY子句的详细用法教程

    这篇文章主要介绍了PHP中ORDER BY子句的详细用法教程,文中提供了PHP脚本下的操作示例,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • MySQL面试题讲解之如何设置Hash索引

    MySQL面试题讲解之如何设置Hash索引

    今天研究下mysql中索引,首先我应该知道的是,mysql中不同存储引擎的索引工作方式不一样,并且不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,那么他们的实现原理也是不同的,本文将讲解Hash索引该如何设置
    2021-10-10
  • Mysql 实现向上递归查找父节点并返回树结构的示例代码

    Mysql 实现向上递归查找父节点并返回树结构的示例代码

    通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构,今天通过本文给大家介绍Mysql递归查找父节点并返回树结构,感兴趣的朋友一起看看吧
    2022-09-09
  • 解决MySQL报错1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL问题

    解决MySQL报错1267 - Illegal mix of coll

    这篇文章主要给大家介绍了解决MySQL报错1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL的问题,文中有详细的解决方案,需要的朋友可以参考下
    2023-09-09
  • mysql中find_in_set()函数的使用详解

    mysql中find_in_set()函数的使用详解

    这篇文章主要介绍了mysql中find_in_set()函数的使用,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • MySQL 存储引擎  MyISAM详解(最新推荐)

    MySQL 存储引擎  MyISAM详解(最新推荐)

    使用 MyISAM 存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要是读的场景,这篇文章主要介绍了MySQL 存储引擎  MyISAM详解,需要的朋友可以参考下
    2025-05-05

最新评论