????????实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表,且这些表的数据之间存在一定的关系。
????????MySQL多表之间的关系可以概括为:一对一 、一对多/多对一关系,多对多
一对一关系
一对多/多对一关系
????????部门和员工
????????分析:一个部门有多个员工,一个员工只能对应一个部门
????????实现原则:在多的一方建立外键,指向另一方的主键
多对多关系
????????学生和课程
????????分析:一个学生可以选择很多课程,一个课程也可以被很多学生选择
????????原则:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键。
????????MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。 对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表) ,外键所在的表就是从表(子表)。
????????外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
定义一个外键时,需要遵守下列规则:
方式1:在创建表时设置外键约束
????????在create table语句中,通过foreign key关键字来指定外键,具体的语法格式如下:
方式2:在创建表时设置外键约束
????????外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。
????????当一个表中不需要外键约束时,就需要从表中将其删除。外键一-旦删除, 就会解除主表和从表间的关联关系
格式:
?????????在多对多关系中,A表的一行对应B的多行,B表的一行对应A表的多行,要新增加一个中间表,来建立多对多关系。
????????修改和删除时,中间从表可以随便删除和修改,但是两边的主表受从表依赖的数据不能删除或者修改
????????多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候需要显示的数据来自多张表。外键约束对多表查询并无影响。
多表查询有以下分类:?
?交叉连接查询 [产生笛卡尔积,了解]
????????语法: select * from A,B;
?内连接查询(使用的关键字inner join - inner可以省略)
????????隐式内连接(SQL92标准) : select * from A,B where条件;
????????显示内连接(SQL99标准) : select * from A inner join B on条件;
?外连接查询(使用的关键字outer join - outer可以省略)
????????左外连接: left outer join
????????????????select * from A left outer join B on条件;
????????右外连接: right outer join
????????????????select * from A right outer join B on条件;
????????满外连接: full outer join
????????????????select * from A full outer join B on条件;
?子查询
????????select的嵌套
?表自关联:
????????将一张表当成多张表来用
????????内连接查询求多张表的交集
? ? ? ? inner可以省略不写
????????外连接分为左外连接(left outer join)、 右外连接(right outer join),满外连接(full outer join)。
????????注意:oracle里 面有full join,可是在 mysql 对 full join 支持的不好。我们可以使用 union 来达到目的。
左外连接: left outer join
????????select * from A left outer join B on 条件;
右外连接: right outer join
????????select * from A right outer join B on 条件;
满外连接: full outer join
????????select * from A full outer join B on 条件;
????????子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一 点就是包含select嵌套的查询。
????????子查询可以返回的数据类型一共分为四种:
????????子查询的临时表必须要有别名
????????在子查询中,有一些常用的逻辑关键字,这些关键字可以给我们提供更丰富的查询功能,主要关键字有:ALL、ANY、 SOME、IN、EXISTS。
????????MySQL有时在信息查询时需要进行对表自身进行关联查询,即一-张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名。