数据库中的关系有一对一、一对多、多对多三种。
- 一对一很好理解了。
- 一对多,例如员工与部门的关系,一个员工只能属于一个部门,一个部门拥有多名员工,类似这样判断结果的都是一对多,没有多对一的关系。
- 多对多, 学生与老师的关系,一个老师教很多学生,一个学生有不同科目的老师。
主要看看一对多关系和多对多。建立如下表:
- 一对多:
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;
查询成功!!
相关文章
暂无评论...