数据库的多表操作

实际开发中业务逻辑较为复杂,需要对多张表进行操作。

一:多表连接

将多张表连在一起进行查询。通过两个表共有的列去进行拼接。多表连接,首先要在表之间建立连接。

交叉连接

将一张表的数据与另外一张表中的数据彼此交叉。也就是说把一张表中的每一行逐个与另一张表去进行匹配。没有任何连接条件,所有的记录都会被保留。结果是笛卡尔积,没有实际应用。
用法:SELECT 字段1,字段2 FROM 表1 JOIN 表2

内连接

即最常见的等值连接,指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
用法:SELECT 字段1,字段2 FROM 表1 JOIN 表2 WHERE 连接(检索条件)

外连接

在查询时所有的表有主从之分。把作为主表的表的行与从表中的行一一进行匹配,如果匹配成功返回到主表中,如果匹配不成功,则仍然保留主表中的行,相应的从表中的行也被填上null值。
驱动表(主表),从表(副表),
左外连接LEFT JOIN ON
把左表作为主表去连接右表
用法:SELECT * FROM 表1 LEFT JOIN 表2 ON条件表达式
右外连接RIGHT JOIN ON
把右表作为主表去连接左边的表
用法:SELECT * FROM 表1 RIGHT JOIN 表2 ON 条件表达式
全外连接(经常不用):即都为主表。左表中未匹配的行仍保留,同时赋给右表NULL值,右表的未匹配的行仍然保留同时赋给左表值NULL。
用法:SELECT * FROM 表1 FULL JOIN 表2 ON 条件表达式
MYSQL不支持全外连接

自连接

就是两个表的两个副本进行连接,为了区别,对表设置别名。
外键:占用空间少,方便修改数据。

二:关联关系

(1)一对多
数据表中常见的关系,比如班主任与班级的关系,一个班级可以有一个班主任,但是一个班主任不能属于多个班级。
语法:constraint 外键名 foreign key (被约束的字段) references 约束的表(约束的字段)
例:
创建dep表,并设置id为主键自增。

create table dep(
id int auto_increment primary key,
name varchar(32) not null default ''
)charset=utf8;

查看表结构

 desc dep;

插入数据

insert into dep(name) values ('yanfabu'),('HR'),('xingzhengbu');

查看数据

select * from dep;

userinfo关联dep表,并设置外键。

create table userinfo(
id int auto_increment primary key, 
name varchar(32) not null default '',
depart_id int not null default 1,
constraint fk_user_depart foreign key (depart_id) references dep(id)
) charset=utf8;

查看表结构

 desc userinfo;

插入数据

insert into userinfo(name,depart_id) values('cat a',1);

查看数据

select * from userinfo;

效果:如果dep表中的depart_id是1–3的范围,那么userinfo表插入的depart_id范围也只能在1–3.

(2)多对一
数据表中最常见的一种关系,比如学生与班级的关系,一个班级可以有多个学生,但是一个学生不能属于多个班级。在多对一的关系中,应该将外键建在多的一方。

(3)多对多
比如学生与课程的关系,一个学生可以选择多门课程,一门课程也供多个学生选择
例:
创建男生表

create table boy(id int auto_increment primary key, bname varchar(32) not null default '') charset=utf8;
insert into boy (bname) values('xiaogao'),('xiaogang'),('xiaoming');
select * from boy;

创建女生表

create table girl(id int auto_increment primary key, gname varchar(32) not null default '') charset=utf8;
insert into girl (gname) values('xiaohong'),('xiaomin'),('xiaojie');
select * from girl;

创建关联表

create table bg(
id int auto_increment primary key, 
bid int not null defaut 1,
gid int not null defaultn 0, 
constraint fk_bg_boy foreign key (bid) references boy(id),
constraint fk_bg_girl foreign key (gid) references girl(id)
)charset=utf8;
insert into bg (bid, gid) values (1,1),(1,2),(2,3),(3,3)(2,2);

左外连接

select * from boy left join bg on boy.id=bg.bid left join girl on girl.id=bg.gid;
select bname,gname from boy left join bg on boy.id=bg.bid left join girl on girl.id=bg.gid;

select name from boy left join bg on boy.id=bg.bid left join girl on girl.id=bg.gid;

(这样的话,需要将前面定义的bname,gname都修改为name)

(4)一对一
比如一个人只有一张身份证,而一张身份证也只对应一个人。
在这里插入图片描述
感谢大家,点赞,收藏,关注,评论!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cat God 007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值