数据库的多表操作
实际开发中业务逻辑较为复杂,需要对多张表进行操作。
一:多表连接
将多张表连在一起进行查询。通过两个表共有的列去进行拼接。多表连接,首先要在表之间建立连接。
交叉连接
将一张表的数据与另外一张表中的数据彼此交叉。也就是说把一张表中的每一行逐个与另一张表去进行匹配。没有任何连接条件,所有的记录都会被保留。结果是笛卡尔积,没有实际应用。
用法: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)一对一
比如一个人只有一张身份证,而一张身份证也只对应一个人。
感谢大家,点赞,收藏,关注,评论!