MySQL一对一:一对多:多对多

时间:2023-03-09 02:10:06
MySQL一对一:一对多:多对多

学生表和课程表可以多对多

一个学生可以学多门课程

一门课程可以有多个学生: 多对多
***
一个学生对应一个班级

一个班级对应多个学生: 一对多
***
一个老师对应多个学生

多个学生对应一个老师:一对多
***
一个老师教一门课

一门课对应一个老师: 一对一

1. 一对多(foreign key):
学生表要关联班级表,多个学生属于一个班级. 班级是被关联的表.
create table class(
id int primary key auto_increment,
caption  char(20)
);

insert into class(caption) values('三年二班'),('一年三班'),('三年一班');

create table student (
id int primary key into_increment,
name varchar(20),
sex enum('male','famale') default 'male',
class_id int,
foreign key(class_id) references class(id)
);

insert into sudent(name,class_id) values ('钢弹',1),('铁锤',1),('山炮',2);

#对这个班级来说,一门课程只有一个老师,一个老师只会教一门课程. 所以是一对一的关系

create table teacher(
id int primary key auto_increment,
name varchar(20)
on delete cascade
on update cascade
);

insert into teacher(name) value('ff'),('ff1'),('ff2');

create table course (
id int primary key auto_increment,
name varchar(20),
teacher_id int unique,
foreign key(teacher_id) references teacher(id)
);

#一个学生可以学多门课程,一门课程可有有多个学生, 他们就是多对多的关系.
create table student2course (
id int primary key auto_increment,
student_id int,
course_id int,
foreign key(student_id) references student(id)
on delete cascade
on update cascade,
foreign key(course_id) references course(id)
on delete cascade
on update cascade,
score int
);

insert into student2course (student_id,course_id,score) values(1,1,60),(1,2,59),(2,2,100);

user 和 admin的一对一关系

create teable user(

id int premary key auto_increment,

name varchar(10)

on delete cascade

on update cascade# 只管理被关联的表

);

create table admin(

id int priment key auto_increment,

password varchar(10),

user_id int unique,

foreign key(user_id) references user(id)

);

..

..

..
..
..
..
..
..
..

学生表关联客户表, 学生一定是客户,客户不一定是学生.
create table customer(
id int primary key auto_increment,
name char(10),
qq int
);

create table  stu(
id int primary key auto_increment,
name varchar(10),
cid int unique,
foreign key(cid) references customer(id)
);

多对多

create table book(
id int primary key auto_increment,
name varchar(20) not null
);

create table author (
id int primary key auto_increment,
name varchar(20),
price float(5)
);

create table book2author(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key(book_id) references book(id)
on delete cascade
on update cascade,
foreign key(author_id) references author(id)
on delete cascade
on update cascade,
unique(book_id,author_id)
);

用户表可以属于一个组, 用户可以 foreign 组

多个组可以由一个用户管理

这俩就是多对多, 找一张单独的表 存他们关联的字段. 保证关联字段联合唯一.

另外例子

**
unique (1,2) ##意思就是联合唯一

select查询语句

1.简单查询

select * from 表;

select name,salary from employee

2.where 条件

from employee where salary >1000;

3.group by (分组) !!!重要

select * from employee group by sex; #by 后面的字段必须是可以能区分的.

select depart_id,group_concat(name) from employee group by depart_id;

group_concat (合并多个数组)

count(id) # 这个 id 的个数

select depart_id,count(id) from employee group by depart_id;

max(salary)

min(salary)

sum(salary)

avg(salary)