Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql复合查询

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复合查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文