数据库中的关系有一对一、一对多、多对多三种。

  • 一对一很好理解了。
  • 一对多,例如员工与部门的关系,一个员工只能属于一个部门,一个部门拥有多名员工,类似这样判断结果的都是一对多,没有多对一的关系。
  • 多对多, 学生与老师的关系,一个老师教很多学生,一个学生有不同科目的老师。

主要看看一对多关系和多对多。建立如下表:

  • 一对多:
create table employee(
id int auto_increment,
name varchar(20) not null,
dep_id int not null,
primary key(id)
);
insert into employee (name,dep_id) values ("刘备",1),("张飞",2),("关羽",2)
create table department (
id int auto_increment,
name varchar(20),
primary key(id)
);
insert into department (name) values("总经办"),("市场部");
alter table employee add foreign key (dep_id) references department (id);//插入外键

使用内部联结查询:

select e.id,e.name,d.name from employee e inner join department d on e.dep_id=d.id;

查询结果:

  • 多对多的表的设计:
create table student(
id int auto_increment,
name varchar(20) not null,
primary key(id)
);
insert into student (name) values("张三"),("李四"),("王五"),("赵六")
create table teacher(
id int auto_increment,
name varchar(20) not null,
primary key(id)
);
insert into teacher (name) values("赵四"),("李武"),("王九"),("刘师");
create table relation(
stu_id int not null,
tea_id int not null
);
insert into relation (stu_id,tea_id) values (1,1),(1,2),(1,3),(2,2),(2,3),(3,2),(4,1),(4,2);
//添加外键
alter table relation add foreign key(stu_id) references student (id);
alter table relation add foreign key(tea_id) references teacher (id);

查看每个学生都选了哪些老师:

select s.name ,t.name from
student s inner join relation r
on s.id=r.stu_id inner join teacher t
on t.id=r.tea_id

这样看,不太美观,采用分组的形式,并显示组内的详细内容:

select s.name ,group_concat(t.name) from
student s inner join relation r
on s.id=r.stu_id inner join teacher t
on t.id=r.tea_id
group by s.name;

查询成功!!

01-04 07:12