2、多表查询
2.1 表与表关系
2.1.1 一对一关系
在一对一关系中,A表中的一行最多只能匹配B表中的一行,反之亦然。
2.1.2 一对多关系
一对多关系是最普通一种关系,A表中的一行可以匹配B表中的多行,但是B表中的一行只能匹配A表中的一行。
例如:存在部门表和人员表之间具有一对多的关系,每个部门有很多的员工,但是每个员工只属于一个部门,
只有当一个相关列是一个主键或者具有唯一性约束时,才能创建一对多的关系
2.1.3 多对多关系
在多对多的关系中,A表中一行可以匹配B表中的多行,反之亦然。要创建这种关系,需要定义第三张表,称之为结合表,其主键由A表和B表外部件组成。
mysql> select * from student;
+-----+----------+------+------+
| SID | Sname | Ssex | Sage |
+-----+----------+------+------+
| 1 | tulun | nan | 23 |
| 2 | qiandian | nan | 20 |
| 3 | sunfen | nan | 21 |
| 4 | wulan | nv | 18 |
| 5 | CJ1210 | 1 | 11 |
| 6 | LG1213 | nan | 2 |
| 7 | CJ1210 | 1 | NULL |
| 8 | GY1803 | NULL | NULL |
| 11 | TL | nan | 11 |
| 12 | TL12 | nan | 12 |
| 13 | 13 | 13 | 13 |
| 17 | 18 | man | 22 |
| 18 | tulun1 | man | 23 |
+-----+----------+------+------+
13 rows in set (0.01 sec)
mysql> select * from SC;
+------+------+-------+
| SID | CID | score |
+------+------+-------+
| 1 | 1 | 80 |
| 1 | 3 | 87 |
| 2 | 2 | 89 |
| 6 | 1 | 66 |
| 3 | 3 | 88 |
| 2 | 2 | 98 |
| 9 | 2 | 99 |
+------+------+-------+
7 rows in set (0.00 sec)
## 学生表和成绩表是一个一对多关系
2.2 笛卡尔积
笛卡尔积的元素是元组,关系A和关系B的笛卡尔积可以记为(AXB),如果A表a条,B表为b条,那么A和B的笛卡尔积为(a+b)列数,(a*b)行的元素集合
检索出来的条目是将第一个表中的行数乘以第二个表中的行数
select <字段名称1>[字段名称2,字段名称3,...字段名n] from <表1>,<表2> where <检索条件>
2.3 内连接
按照连接条件,返回两张表中的满足条件的记录
内连接称之为普通连接或自然连接
等值连接:当条件为”=“的连接,称之为等值连接
2.4 外连接
外连接不仅包含符合条件的连接的行,而且还包含左表(左外连接)、右表(右外连接)中所有的数据行
2.5 左连接
左连接是以左表中的数据为基准,若左表中有数据而右表中没有数据,则显示左表中的数据,右表中的数据显示为空
select <字段名称1>[字段名称2,字段名称3,...字段名n]
from <表名1>
left join<表名2>
on <连接条件>
2.6 右连接
右连接是以右表的数据为基准,若右表有数据且左表没有数据,则显示右表中的数据,左表中的数据则显示为空