数据库(MySQL 8.0)--4

基于以下三个表来做:
这是三个表的表名
在这里插入图片描述
students表
在这里插入图片描述
subjects表
在这里插入图片描述
scores表

create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);

在这里插入图片描述
在这里插入图片描述
注:scores表根据以下关系来建立(借用的是某网课的授课图),关系也是一条数据,有没有外键无所谓,关系存在哪个表中要分析是几对几的关系(一对一都可以,一对多存在多的里面,多对多单独建立表存关系)
在这里插入图片描述
外键约束
目的:为了保证关系列数据的有效性,比如说scores表中的stuid列的值必须在students表id列的值之中

ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action; #更改表添加外键

注:也可以在创建表时就添加外键

外键的级联操作
在删除students表的数据时,如果这个id值在scores表已经存在,那怎么办?
restrict(限制):默认值,抛出异常
cascade(级联):如果主表的数据删除,则对应从表的相关数据也删除
set null:将外键设置为空
no action:什么都不做
建议:我们可以使用逻辑删除或者指定上述的级联操作

连接查询
目的:在单个表查询的信息比较抽象,比如查询scores表subid列就是编号,不够主观,我们可以建立与subjects表的关系这样就可以看到编号对应的stitle

inner join:结果是两个表都能匹配的结果集

select students.sname,subjects.stitle,scores.score from scores inner join students on scores.stuid=students.id inner join subjects on scores.subid=subjects.id; #结果:

在这里插入图片描述
left join:结果是两个表都匹配的数据和左表中特有的数据(右表没有的数据用null填充)

select * from students left join scores on scores.stuid=students.id; #结果:

在这里插入图片描述
right join:结果是两个表都匹配的数据和右表中特有的数据(左表没有的数据用null填充)

select * from scores right join students on students.id=scores.stuid;

在这里插入图片描述
小练习
1.查询学生的姓名和平均分

select students.sname,avg(scores.score) from scores inner join students on scores.stuid=students.id group by stuid; #结果

在这里插入图片描述
2.查询男生的姓名、总分
分析:
students.gender=1 #男生
students.sname #姓名
sum(scores.score) #总分,sum聚合所以要分组
涉及到两张表>要连接students.id=scores.stuid

select students.sname,sum(scores.score) from students inner join scores on students.id=scores.stuid where gender=1 group by stuid;#结果:

在这里插入图片描述
3.查询科目的名称、平均分
分析:
subjects.stitle #科目名称
avg(scores.score) #平均分,agv聚合需要分组group by 科目
连接 subjects.id=scores.subid

select subjects.stitle,avg(scores.score) from scores inner join subjects on subjects.id=scores.subid group by subjects.stitle;#结果:

在这里插入图片描述
先给subjects表中添加一列isDelete,默认值为0表示未删除

alter table subjects add column isDelete int default 0;

在这里插入图片描述

4.查询未删除科目的名称、最高分、平均分
分析:
subjects.stitle #科目名称
max(scores.score) #最高分
avg(scores.score) #平均分
连接 subjects.id=scores.subid
where subjects.isDelete=0 #未删除科目
group by 科目

select subjects.stitle,max(scores.score),avg(scores.score) from scores inner join subjects on subjects.id=scores.subid where subjects.isDelete=0 group by subjects.stitle;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fenfenxhf/article/details/82790084
今日推荐