关联介绍与连接查询

关联关系介绍

MySql不仅可以存储数据,还可以维护数据与数据之间的关系---通过在表中添加字段建立外键约束
数据与数据之间的**关联**关系分为四种:
	* 一对一关联
	* 一对多关联
	* 多对一关联
	* 多对多关联
一对一关联
方案一 :主键关联----两张数据表中主键相同的数据为相互对应的数据
方案二 :唯一外键----在任意一张表中添加一个字段外键约束与另一张表主键关联,并且将外键列添加唯一约束(unique)
一对多与多对一
在多的一端添加外键,与一的一端主键进行关联
多对多关联
额外创建一张表来维护多对多关联----在关系表中定义两个外键,分别与两个数据表的主键进行关联
外键约束
外键约束----将一个列添加外键约束与另一张表的主键(唯一列)进行关联后,这个外键约束的列添加的数据必须要在关联的主键字段中存在
  • 例:
1.先创建班级表
create table class(
	c_id int primary key auto_increment,
	c_name varchar(255) not null unique,
	c_remark varchar(255)
);
2.创建学生表(在学生表中添加外键与班级表的主键进行关联)
*** 在创建表的时候,定义cid字段,并添加外键约束(cid与c_id字段类型和长度要保持一致)
create table student(
	s_num char(8) primary key,
	s_name varchar(20) not null,
	s_gender char(2) not null,
	s_age int not null,
	cid int,
	constraint FK_STUDENT_CLASS foreign key(cid) references class(c_id)
);
**************************或者**************************
create table student(
	s_num char(8) primary key,
	s_name varchar(20) not null,
	s_gender char(2) not null,
	s_age int not null,
	cid int
);
alter table student add constraint FK_STUDENT_CLASS foreign key(cid) references class(c_id);

     当学生表中存在学生信息关联班级表的某条记录时,就不能对班级表的这几条记录进行修改和删除操作

  • 解决办法 :
    第一种 :
         把与被删除(修改)的记录相关联的记录修改为null
         在删除(修改)要修改的记录
         重新修改与被修改表相关的记录
update student set cid=null where cid=1;
update class set c_id=5 where c_name='java';
update student set cid=5 where cid is null;

第二种 :级联操作

  • 在添加外键时,设置级联修改和级联删除
*** 删除原有的外键
alter table student drop foreign key FK_STUDENT_CLASS;
*** 重新添加外键,并设置级联修改和级联删除
alter table student add constraint FK_STUDENT_CLASS foreign key(cid) references class(c_id) on update class on delete cascade;

连接查询

在MySql中可以使用join实现多表的联合查询----连接查询,join按照其功能不同分为三个操作 :
	* inner join :内连接
	* left join :左连接
	* right join :右连接
  • 内连接
select ... from tablename1 inner join tablename2;
  • 笛卡尔积
笛卡尔积 :使用A中的每个记录依次关联B中的每个记录,笛卡尔积的总数 = A总数 * B总数
如果直接执行语句,会获取两种数据表中的数据集合的笛卡尔积(依次匹配)
  • 内连接条件
*** 使用on设置两张表连接查询的匹配条件
--- 使用where设置过滤条件 :先生成笛卡尔积再从笛卡尔积中过滤数据(效率很低)
select * from student inner join class where student.cid = class.c_id;
--- 使用on设置连接查询条件 :先判断连接条件是否成立,如果成立两张表的数据进行组合生成一条结果记录
select * from student inner join class on student.cid = class.c_id;

结果:只获取两种表匹配条件成立的数据,任何一张表在另一种表如果没有找到对应匹配则不会出现在查询结果中。

  • 左连接
左连接 :显示左表中的所有数据,如果在有右表中存在左表记录满足匹配条件的数据,则进行匹配 ;如果右表中不存在匹配数据,则显示为null
select * from leftTable left join rightTable on 匹配条件 {where 条件};
--- 左连接 : 显示左表中的所有记录
select * from student left join class on student.cid = class.c_id;
  • 右连接
*** 右连接 : 显示右表中的所有记录
select * from student right join class on student.cid = class.c_id;
数据表别名
select s.*,c.c_id
from student s
inner join class c
on s.cid = c.c_id;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值