美文网首页
mysql联表查询总结

mysql联表查询总结

作者: EldonZhao | 来源:发表于2017-04-25 10:19 被阅读1965次

联表查询在平时的项目中经常遇到,总觉得理解的不是很透彻,这里简单总结一下连表查询的使用。

比方我们有如下两张表:

  • EmployeeTB:
employee_id employee_name dept_id
0001 张三 01
0002 李四 01
0003 王五 02
0004 赵六 02
0005 郑七 NULL
  • DeptTB
dept_id dept_name
01 技术部
02 市场部
03 工程部

从上面两张表可以看出他们存在dept id为关联的关系,所以就会存在如下需求:

1、找出EmployeeTB中员工与DeptTB中部门之间对应关系;

查询方式有多种,下面就做简单的概括:

  • 内联结查询:

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e, DeptTB AS d WHERE e.dept_id=d.dept_id;
SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e INNER JOIN DeptTB AS d ON e.dept_id=d.dept_id;

上面两句查询的效果是一样的:

mysql> SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e,
DeptTB AS d WHERE e.dept_id=d.dept_id;
+-------------+---------------+------------+
| employee_id | employee_name | dept_name  |
+-------------+---------------+------------+
|           1 | zhangsan      | jishubu    |
|           2 | lisi          | jishubu    |
|           3 | wangwu        | shichangbu |
|           4 | zhaoliu       | shichangbu |
+-------------+---------------+------------+
4 rows in set (0.00 sec)
  • 外联结查询:

    • 1、左外联结:

如上面例子,有时候我们需要知道所有员工的信息,如果不属于任何部门,则dept_name字段用NULL补充。此时,我们就可以采用左外联结达到该效果:

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;

查询结果:

mysql> SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e L
EFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;
+-------------+---------------+------------+
| employee_id | employee_name | dept_name  |
+-------------+---------------+------------+
|           1 | zhangsan      | jishubu    |
|           2 | lisi          | jishubu    |
|           3 | wangwu        | shichangbu |
|           4 | zhaoliu       | shichangbu |
|           5 | zhengqi       | NULL       |
+-------------+---------------+------------+
5 rows in set (0.00 sec)
  • 2、右外联结:

右外联结查询和左外联结查询中把两张表的位置互换是一致的。读者可以试试如下两个查询语句的执行结果:

SELECT d.employee_id, d.employee_name, e.dept_name FROM DeptTB AS e LEFT OUTER JOIN EmployeeTB AS d ON d.dept_id=e.dept_id;
SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;

查询结果应该是如下的:

+-------------+---------------+-------------+
| employee_id | employee_name | dept_name   |
+-------------+---------------+-------------+
|           1 | zhangsan      | jishubu     |
|           2 | lisi          | jishubu     |
|           3 | wangwu        | shichangbu  |
|           4 | zhaoliu       | shichangbu  |
|        NULL | NULL          | gongchengbu |
+-------------+---------------+-------------+
5 rows in set (0.00 sec)
  • 3、完全外联结:

如果我们需要知道所有的记录,不管部门下有没有员工,员工有没有所属的部门,我们都需要检索。那我们就需要用到完全外联结查询了。

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e FULL OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;

由于MYSQL目前不再支持完全外联结查询,可以使用如下方法实现相同的效果:

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id UNION SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;
mysql> SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e L
EFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id UNION SELECT e.employee_id, e.
employee_name, d.dept_name FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON
d.dept_id=e.dept_id;
+-------------+---------------+-------------+
| employee_id | employee_name | dept_name   |
+-------------+---------------+-------------+
|           1 | zhangsan      | jishubu     |
|           2 | lisi          | jishubu     |
|           3 | wangwu        | shichangbu  |
|           4 | zhaoliu       | shichangbu  |
|           5 | zhengqi       | NULL        |
|        NULL | NULL          | gongchengbu |
+-------------+---------------+-------------+
6 rows in set (0.01 sec)

参考资料:

相关文章

  • mysql联表查询总结

    联表查询在平时的项目中经常遇到,总觉得理解的不是很透彻,这里简单总结一下连表查询的使用。 比方我们有如下两张表: ...

  • mysql表关系

    mysql数据库 知识要点: 单表查询 子查询 联表查询 事务 在进行查询之前,我们要先建好关系表,并往数据表中插...

  • mysql 联表查询

    mysql 联表查询 JOIN 对比 思路: 1.分析需求,分析查询的字段来自哪些表(连接查询) 2.确定使用哪...

  • MySQL多表联表查询驱动表选择

    联表查询做开发的小伙伴会经常使用,但是可以大家都比较少去深入了解MySQL是怎么执行多表联表查询的,比如怎么选择驱...

  • 常用方法

    A alias 联表查询方式 一、table() 二、联表查询(内联、左联、右联、全联)的语法 表1结构--- ...

  • 转载 - MySQL 联表查询

    原文链接:http://www.cnblogs.com/gotodsp/p/10090382.html MySQL...

  • MySQL联合查询语法内联、左联、右联、全联

    MySQL联合查询效率较高,以下例子来说明联合查询(内联、左联、右联、全联)的好处: T1表结构(用户名,密码) ...

  • mongo 联表查询方法

    这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动,之后可能会联表查询)我用到的联表查询...

  • mysql联表查询简单优化

    今天在工作当中遇到一个需要联多张表查询的业务场景,心里大概知道如果正常写,放在线上去绝对是一个慢查询,于是乎就想了...

  • MySQL「查询/联表查询/索引/序列/导出」

    MySQL,关系型数据库(RDBMS),有几个关键术语需要巩固一下 冗余:存储两倍数据,冗余降低了性能,但提高了数...

网友评论

      本文标题:mysql联表查询总结

      本文链接:https://www.haomeiwen.com/subject/ldxrzttx.html