一、多表的必要性与多表关联关系
1、为什么需要将数据都存储多张表:
:如果将数据都存储在一张表中,字段之间如果部署同一类信息,就会产生大量的数据冗余(重复)
2、外键(foregin key):
:用来描述多张表之间的关联关系的字段
3、表与表之间的关联关系存在三种
1对1
:外键创建在任何一张表中都是可以的
1对多
:外键创建在一方,不要创建在多方(冗余)
多对多
:外键一般是在一张独立的表中,这张表用来描述其他两张表的关联关系
二、多表关联查询
如何进行多表关联查询:
1、交叉查询(cross join)
当不指定多张表的关联关系,直接进行查询时则默认全匹配,从而产生笛卡尔积现象
mysql> select * from Teacher,Course;###第一种写法
+-----+--------+------+--------+------+
| TId | Tname | CId | Cname | TId |
+-----+--------+------+--------+------+
| 02 | 李四 | 01 | 语文 | 02 |
| 01 | 张三 | 01 | 语文 | 02 |
| 02 | 李四 | 02 | 数学 | 01 |
| 01 | 张三 | 02 | 数学 | 01 |
+-----+--------+------+--------+------+
4 rows in set (0.12 sec)
mysql> select * from Teacher cross join Course;###第二种写法
+-----+--------+------+--------+------+
| TId | Tname | CId | Cname | TId |
+-----+--------+------+--------+------+
| 02 | 李四 | 01 | 语文 | 02 |
| 01 | 张三 | 01 | 语文 | 02 |
| 02 | 李四 | 02 | 数学 | 01 |
| 01 | 张三 | 02 | 数学 | 01 |
+-----+--------+------+--------+------+
4 rows in set (0.00 sec)
交叉连接是数据库底层的实现方式,因此开发中一定要避免使用交叉连接,会产生笛卡尔积现象
2、内连接(inner join)
select *from 表1,表二 where 表1.字段1=表2.字段2 (声明这两张表中的字段存在外键关联关系)若还有其他外键关联关系用 and…
select *from 表1 u inner join 表2 d on(u.字段1=d.字段2) 若还有条件则用where
注意:内连接只能查询有关联关系的数据
mysql> select *from student ;
+-----+--------+---------------------+------+
| SId | Sname | Sage | Ssex |
+-----+--------+---------------------+------+
| 01 | 赵雷 | 2021-11-01 00:00:00 | 男 |
| 02 | 钱李 | 1990-12-21 00:00:00 | 男 |
| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
| 08 | 张三 | 2017-12-20 00:00:00 | 女 |
| 10 | NULL | 2017-12-25 00:00:00 | 女 |
| 11 | 李四 | 2012-06-06 00:00:00 | 女 |
| 12 | 赵六 | 2013-06-13 00:00:00 | 女 |
| 13 | 孙七 | 2014-06-01 00:00:00 | 女 |
+-----+--------+---------------------+------+
12 rows in set (0.03 sec)