SQL联结表
阅读:446上节讲到子查询,本节开始讲解联结表。
1. 什么是联结表
通过一个SELECT语句,把多个表联结在一起,返回一组数据,我们称为联结表。
还记得课程表t_course和课程分类表t_category吗?我们现在把他们联结在一起,SQL如下:
SELECT title, name FROM t_course, t_category;
执行输出:
+-------------------------------------------------+--------------+
| title | name |
+-------------------------------------------------+--------------+
| Java教程:核心技术一网打尽 | 后端 |
| Java教程:核心技术一网打尽 | 架构 |
| Java教程:核心技术一网打尽 | 中间件 |
| Java教程:核心技术一网打尽 | 算法 |
| Java教程:核心技术一网打尽 | 后端 |
| Java教程:核心技术一网打尽 | 架构 |
| Java教程:核心技术一网打尽 | 算法 |
| Java教程:核心技术一网打尽 | 中间件 |
| Java教程:核心技术一网打尽 | 程序人生 |
| Java教程:核心技术一网打尽 | 前端 |
| Java面试教程 | 后端 |
......
不出所料,返回了很多行数据,这里为列举了一部分返回结果。为什么出现这种情况呢?是因为t_course的每一行都与t_category的所有行都匹配一次,然后返回结果,也就是我们说的笛卡尔积。
所以,我们联结表的时候,必须加联结条件。看如下SQL,然后输出:
mysql> SELECT title, name FROM t_course, t_category WHERE t_course.category_id = t_category.id;
+-------------------------------------------------+-----------+
| title | name |
+-------------------------------------------------+-----------+
| Java教程:核心技术一网打尽 | 后端 |
| Java面试教程 | 后端 |
| redis基础教程 | 中间件 |
| 深入理解MySQL底层原理 | 中间件 |
| kafka教程 | 中间件 |
| Spring Cloud基础教程 | 后端 |
| 架构师教程 | 架构 |
| git教程 | 后端 |
| 深入剖析Java虚拟机 | 后端 |
| SQL教程 | 中间件 |
| 设计模式:GOF的23种设计模式全剖析 | 后端 |
| HTML教程 | 前端 |
| HTML5教程 | 前端 |
| CSS教程 | 前端 |
| JavaScript教程 | 前端 |
| HTTP协议 | 前端 |
| Tomcat教程 | 中间件 |
| Servlet教程 | 后端 |
| Jsp教程 | 前端 |
| Ajax教程 | 前端 |
| JQuery教程 | 前端 |
| Maven教程 | 后端 |
| Linux教程 | 后端 |
| JDBC教程 | 后端 |
| Spring教程 | 后端 |
| Spring MVC教程 | 后端 |
| Spring boot教程 | 后端 |
| MyBatis教程 | 后端 |
| ActiveMQ教程 | 中间件 |
| ZooKeeper教程 | 中间件 |
| dubbo教程 | 中间件 |
+-------------------------------------------------+-----------+
31 rows in set (0.00 sec)
本次输出就是联结加联结条件后的结果。
2. 联结表使用场景
当联结表查询时,多个表可以没有任何逻辑关系,但是实际使用中,多个表都是有关系的。比如上面的例子中,课程信息和课程分类,我们一般放在多个表中存储信息,便于维护。当需要查询时候,由于他们分散在不同的表中存储,所以我们需要联结两个表进行查询。
总结:
- 联结表是通过联结多个表,组合一组数据,然后输出。
- 联结表一定要加联结条件,否则输出笛卡尔积。
赞赏支持
