我们之前学习的SELECT语句都是单表查询,随着我们使用数据库的灵活性越来越高,当我们需要的数据在不同的表中时,就需要使用多表查询来检索我们需要的数据。
多表查询分为横向连接查询和纵向合并查询。
连接查询是通过多张表中共有的关键字段,将多张表连成一张虚拟结果集,来补充字段信息,我们可以按照业务需求检索多张表中的数据。
SQL查询的基本原理:
- 单表查询:根据where条件过滤表中的记录,然后根据select指定的列返回查询结果。
- 两表连接查询:使用on条件对两表进行连接形成一张虚拟结果集;然后根据where条件过滤结果集中的记录,再根据select指定的列返回查询结果。
- 多表连接查询:先对第一个和第二个表按照两表连接查询,然后用用连接后的虚拟结果集和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一张虚拟结果集,然后根据where条件过滤虚拟结果集中的记录,再根据select指定的列返回查询结果。
多表连接的结果通过三个属性决定:
- 方向性:在外连接中写在前边的表为左表、写在后边的表为右表。
- 主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接时无主附表之分。
- 对应关系:关键字段中有重复值的表为多表,没有重复值的表为一表。
对应关系:
- 一对一
- 一对多或多对一
- 多对多
MySQL支持的连接方式:内连接和外连接(左外连接、右外连接)。
- 内连接:按照连接条件,返回两张表中满足条件的记录。
select <字段名1>[,<字段名2>...,<字段名n>] from <表名1>[ inner] join <表名2> on <连接条件>;
等值连接:连接条件是两张表中的关键字段取值相等。
mysql> select ename,job,hiredate,sal,dname
-> from emp
-> inner join dept
-> on emp.deptno=dept.deptno;
+--------+-----------+------------+------+------------+
| ename | job | hiredate | sal | dname |
+--------+-----------+------------+------+------------+
| clark | manager | 1981-06-09 | 2450 | accounting |
| king | persident | 1981-11-17 | 5000 | accounting |
| miller | clerk | 1982-01-23 | 1300 | accounting |
| smith | clerk | 1980-12-17 | 800 | research |
| jones | manager | 1981-04-02 | 2975 | research |
| scott | analyst | 1987-04-19 | 3000 | research |
| adams | clerk | 1987-05-23 | 1100 | research |
| ford | analyst | 1981-12-03 | 3000 | research |
| allen | salesman | 1981-</