1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MySQL多表关联关系与多表关联查询

MySQL多表关联关系与多表关联查询

时间:2019-02-19 13:13:41

相关推荐

MySQL多表关联关系与多表关联查询

一、多表的必要性与多表关联关系

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 | 赵雷 | -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 | 张三 | -12-20 00:00:00 | 女 || 10 | NULL | -12-25 00:00:00 | 女 || 11 | 李四 | -06-06 00:00:00 | 女 || 12 | 赵六 | -06-13 00:00:00 | 女 || 13 | 孙七 | -06-01 00:00:00 | 女 |+-----+--------+---------------------+------+12 rows in set (0.03 sec)

3、外连接

select *from 表1 left join 表2 on(表1.字段1=表2.字段2)###左外连接查询映射出join左侧这张表的所有数据mysql> select * from Teacher ;+-----+--------+| TId | Tname |+-----+--------+| 01 | 张三 || 02 | 李四 |+-----+--------+2 rows in set (0.01 sec)mysql> select * from Course;+------+--------+------+| CId | Cname | TId |+------+--------+------+| 01 | 语文 | 02 || 02 | 数学 | 01 |+------+--------+------+2 rows in set (0.00 sec)mysql> select *from Teacher left join Course on(Teacher.TId=Course.TId);+-----+--------+------+--------+------+| TId | Tname | CId | Cname | TId |+-----+--------+------+--------+------+| 01 | 张三 | 02 | 数学 | 01 || 02 | 李四 | 01 | 语文 | 02 |+-----+--------+------+--------+------+2 rows in set (0.00 sec)

select *from 表1 right join 表2 on(表1.字段1=表2.字段2)###右外连接查询映射出join右侧这张表的所有数据

mysql> select *from Teacher right join Course on(Teacher.TId=Course.TTId);+------+--------+------+--------+------+| TId | Tname | CId | Cname | TId |+------+--------+------+--------+------+| 02 | 李四 | 01 | 语文 | 02 || 01 | 张三 | 02 | 数学 | 01 |+------+--------+------+--------+------+2 rows in set (0.00 sec)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。