MySQL数据库 - 约束和联合查询

目录

  • 1.约束的类型
    • [1.1 默认约束](#1.1 默认约束)
    • [1.2 非空约束](#1.2 非空约束)
    • [1.3 唯一约束](#1.3 唯一约束)
    • [1.4 主键约束](#1.4 主键约束)
    • [1.5 检查约束](#1.5 检查约束)
    • [1.6 外键约束](#1.6 外键约束)
  • 2.联合查询
    • [2.1 两个表的联合查询](#2.1 两个表的联合查询)
    • [2.2 多个表的联合查询](#2.2 多个表的联合查询)

1.约束的类型

复制代码
                                 MySQL数据可中主要有以下几种约束。

1.1 默认约束

创建表格对应列需要固定值时,就可以添加默认约束,后续添加数据时就不需要再重新设置信息。

例如创建一个班级信息表,就包含班级名称,可以将班级信息设置为默认值,例如设置为"三(6)班",在列信息后添加默认值即可。

sql 复制代码
# 创建班级表
create table class(
class_name char(20) default '三(6)班'
);

1.2 非空约束

非空约束的列增加的信息不能为null,例如在班级表中存在学生,可以将学生的学号(id)设置不为null。

sql 复制代码
create table class(
class_name char(20) default '三(6)班',
student_id char(8) not null
);

如果student_id列增加null数据则会报错。

sql 复制代码
insert into class(student_id) value(null);

1.3 唯一约束

唯一约束确定约束对象是在表中唯一存在的,使用unique修饰,例如班级表中的科目老师是唯一,可以设置为unique。

sql 复制代码
create table class(
class_name char(20) default '三(6)班',
student_id char(8) not null,
teacher_id char(10) unique
);
sql 复制代码
# 增加重复的老师id
insert into class(student_id,teacher_id) value(10011001,1231231231);
insert into class(student_id,teacher_id) value(10011002,1231231231);

1.4 主键约束

主键约束(primary key)是非空约束和唯一约束的结合,在表中只能唯一存在,例如添加班级的id,一般默认是唯一且不为空,将班级id(class_id)设置为主键约束。

sql 复制代码
create table class(
class_id char(20) primary key # 主键约束
class_name char(20) default '三(6)班', #默认约束
student_id char(8) not null, # 非空约束
teacher_id char(10) unique # 唯一约束
);

1.5 检查约束

班级表中有学生的id,而学生又有一些其它属性,可以再重新创建一个学生表,描述学生信息:

学号,姓名,年龄,性别等;性别的设置可以为男或者女,可以添加检查约束,在添加数据时只能选择男或者女。

sql 复制代码
# 创建学生表
create table student(
student_id char(8) primary key ,# 主键约束
student_age int,
student_name char(20),
student_sex char,
check(student_sex = '男' or student_sex = '女') #检查约束:在定义后列后,末尾检查
);

添加性别为"w",''m'',均不可添加成功。

sql 复制代码
insert into student values(10011001,10,'李华','w'),(10011002,9,'李四','m');

1.6 外键约束

两个表格间需要确定关联时,就可使用外键约束,例如以上的班级表中包含教室id,每一个学生都有一个班级,在学生表中可添加class_id,就可以通过class_id建立两个表的联系。

sql 复制代码
# 班级表
create table class(
class_id char(20) primary key, # 主键约束
class_name char(20) default '三(6)班', #默认约束
);


# 创建学生表
create table student(
student_id char(8) primary key ,# 主键约束
student_age int,
student_name char(20),
student_sex char,
class_id char(20),# 班级id
check(student_sex = '男' or student_sex = '女'), #检查约束:在定义后列后,末尾检查
#建立外键联系:foreign key(联系列) references list_name(联系列)
foreign key(class_id) references class(class_id) 
);

因为学生表与班级表建立了外键联系,在添加学生信息时,需要先有班级的id信息才可添加学生信息,否则会出现报错。

sql 复制代码
insert into student value(10011001,9,'王五','男','0306'); # 班级id:0306不存在,不可添加信息

2.联合查询

2.1 两个表的联合查询

联合查询是在多个表中进行组合查询,获取多个表格组合后新的查询表。

例如创建学生表和班级表,进行结果的查询。

sql 复制代码
# 班级信息表
create table class(
class_id char(20) primary key, # 主键约束
class_name char(20)
);

创建班级信息:三年(1)班,id:0301,三年(2)班,id:0302,三年(3)班,id:0302.

sql 复制代码
insert into class values('0301','三年(1)班'),('0302','三年(2)班'),('0303','三年(3)班');
sql 复制代码
# 创建学生表
create table student(
student_id char(8) primary key ,# 主键约束
student_age int,
student_name char(20),
student_sex char,
class_id char(20),# 班级id
check(student_sex = '男' or student_sex = '女'), #检查约束:在定义后列后,末尾检查
#建立外键联系
foreign key(class_id) references class(class_id)
);

假设每一班只有一个学生:1班:10011001,李四,9岁,男,0301;

2班:10021001,王五,10岁,男,0302;3班:10031001,赵四,9岁,男,0303;

sql 复制代码
insert into student values('10011001',9,'李四','男','0301'),
                          ('10021001',10,'王五','男','0302'),
                          ('10031001',9,'赵四','男','0303');

查询表格信息

对学生表和班级表进行联合查询。

sql 复制代码
## 与单表查询类似,在第一个表后使用逗号隔开,添加第二个表
select* from class,student;

以上表格信息查询的结果只有部分是正确,这是因为联合查询会将第一个表的数据与第二个表的每一行数据进行匹配,学生表为第二个表,存在三条数据,教室表中存在3条数据,所以总共匹配到9条数据。

为了匹配正确的数据,就需要加上过滤条件,可以使用class_id进行匹配过滤,最终就可以得到正确的数据。

sql 复制代码
# 查询表格的列:表名.列名
select* from class,student where class.class_id = student.class_id;

默认排序方式是升序的,如果需要降序可以通过某一个指标分组后排序,例如class_id.

sql 复制代码
select* from class,student where 
class.class_id = student.class_id # 过滤条件
order by class.class_id desc;# 通过class_id 分组后降序 desc(descend降序,升序是abs,absent)

2.2 多个表的联合查询

对以上表格还可在添加课程表和课程成绩表在进行联合查询。

假设课程表为:语文,id:1010,数学,id:1020,英语:1030,思想道德与品质,id:1040,体育,id:1050,基于以上信息创建课程表。

sql 复制代码
create table course(
course_id char(20) primary key, # 主键约束
course_name char(20)
)
sql 复制代码
## 增加信息
insert into course values('1010','语文'),('1020','数学'),
('1030','英语'),('1040','思想道德与品质'),('1050','体育');

查询表格信息

sql 复制代码
select* from course;

创建成绩表格,因为成绩与学生和课程有关,所以需要加入学生id和课程id,此参加表为一门科目的成绩表,所以在添加一个成绩信息,为了和其它表格建立联系需要创建外键约束:成绩表与学生表的联系,课程表和成绩表的联系。

如何确定外键约束的关系?

确定表和表主键的数量对应关系:对于学生表和成绩表,一个学生可以有多门成绩,而一门课程的一个成绩只能对应一个学生,所以学生表和课程表是多对一的关系,应该在成绩表中建立外键联系;对于课程表和成绩表,一门课程可以对应多个学生成绩,而一门课程的一个成绩只能对应一门课程,所以课程表和成绩表是多对一的关系,需要在成绩表中建立联系。

创建的成绩表如下。

sql 复制代码
# 增加学生成绩表
create table score(
student_id char(20),
course_id char(20),
course_socore double, # 课程成绩
# 外键联系 :成绩表和学生表
foreign key(student_id) references student(student_id), //一个表可以建立多个外键联系,但是外键联系的列必须是主键
# 成绩表和课程表
foreign key(course_id) references course(course_id)
)

加入学生的成绩信息:一共五门课程:语数英,思想,体育。

sql 复制代码
# 加入学生成绩信息
insert into score values('10011001','1010',99),('10011001','1020',89),('10011001','1030',67),('10011001','1040',59),('10011001','1050',100), # 李四成绩表
                        ('10021001','1010',20),('10021001','1020',29),('10021001','1030',57),('10021001','1040',66),('10021001','1050',100), # 王五成绩表
                        ('10031001','1010',39),('10031001','1020',100),('10031001','1030',33),('10031001','1040',20),('10031001','1050',100) # 赵四成绩表

查询成绩表信息

sql 复制代码
select*from score;

针对以上四个表:班级表,学生表,课程表,成绩表,进行联合查询。

需要确定过滤条件:1)学生表和班级表关联的class_id需要相同;2)学生表和成绩表关联的student_id需要相同;3)学生表和成绩表关联的id需要相同;

sql 复制代码
# 联合查询
select class.class_name as '班级名称',student.student_name as '学生姓名' ,
student.student_id as '学号',course.course_name as '课程',score.course_socore as '课程成绩' 
from class,student,course,score where 
class.class_id = student.class_id and student.student_id = score.student_id and course.course_id = score.course_id;

以上过滤后的数据行与成绩表查询的数据行行数相同,说明查询的结果过滤正确。

对于过滤条件的解释:1)成绩表和学生表通过class_id过滤,保证学生信息和班级学习匹配;

2)课程表和成绩表通过course_id匹配,确保课程信息和成绩信息匹配;3)成绩表和学生表通过student_id匹配,保证学生的课程成绩相匹配;通过三个过滤确保正确的信息。

如果需要将成绩信息一行展示,可以修改课程表和成绩表。课程表只需要添加一共id信息,一个id表示一套课程内容,在score表中添加成绩信息。

sql 复制代码
# 课程表2: id保证课程内容为:语文,数学,英语,思想道德与品质,思想道德与品质
create table course2(
course2_id char(20) primary key # 主键约束
)
drop table course2;
## 增加信息
insert into course2 value('2025');

# 增加学生成绩表2
create table score2(
student_id char(20),
course2_id char(20),
ch_score double, # 语文成绩
ma_score double, # 数学成绩
en_score double, # 英语成绩
iam_score double, # 思想成绩
sp_score double, # 体育成绩
# 外键联系 :成绩表和学生表
foreign key(student_id) references student(student_id), #一个表可以建立多个外键联系,但是外键联系的列必须是主键
# 成绩表和课程表
foreign key(course2_id) references course2(course2_id)
)

## 增加信息
insert into course value('2025');


insert into score2 values('10011001','2025',99,89,67,59,100), # 李四成绩表
                         ('10021001','2025',20,29,57,66,100), # 王五成绩表
                         ('10031001','2025',39,100,33,20,100) # 赵四成绩表

联合查询

sql 复制代码
# 联合查询
# 修改变量名:使用as,不同变量间重命名使用逗号隔开
select class.class_name as '班级名称',student.student_name as '学生姓名' ,
student.student_id as '学号',
score2.ch_score as '语文成绩', score2.ma_score as '数学成绩',
score2.en_score as '英语成绩', score2.ch_score as '思想道德与品质成绩', 
score2.sp_score as '体育成绩'
## 查询表格
from class,student,course2,score2 
# 过滤条件
where  class.class_id = student.class_id  //班级表和学生表
and student.student_id = score2.student_id //学生表和成绩表
and course2.course2_id = score2.course2_id;//课程表和成绩表

以上就是本文的有关约束和查询的内容,如果有相关疑问,欢迎留言讨论,我们下一篇文章再见。

相关推荐
一 乐11 分钟前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
1.14(java)1 小时前
SQL数据库操作:从CRUD到高级查询
数据库
Full Stack Developme2 小时前
数据库索引的原理及类型和应用场景
数据库
贺biubiu3 小时前
2025 年终总结|总有那么一个人,会让你千里奔赴...
android·程序员·年终总结
xuekai200809013 小时前
mysql-组复制 -8.4.7 主从搭建
android·adb
IDC02_FEIYA4 小时前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录4 小时前
MySQL面试题——联合索引
数据库·面试
nono牛4 小时前
ps -A|grep gate
android
萧曵 丶4 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
小北方城市网4 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存