复习前面MySQL的基础操作,目的是让我们有印象!!在这篇文章中,我主要写的是数据库的约束和查询操作的详细、深入讲解!
基础操作 (复习->【MySQL】超详细-基础操作)
插入 insert -> insert into 表名 values (值,值...)
查询 select -> select 列名 from 表名
修改 update -> update 表名 set 列名 = 值 where 条件
删除 delete -> delete from 表名 where(删的是数据)
数据库的约束
约束定义
1、not null
表示添加了not null这个约束的列不能存储null值
2、unique
某列如果添加unique约束,那么这一列的值就存在唯一性
3、default
给某列添加默认值
4、primary key
primary key(主键)= not null + unique。主键是一行的身份标识
5、foreign key
foreign key(外键),用于有联系的表之间建立关系
6、check
保证列中的值符合条件
表中添加约束【代码】
我这里简要的写一个学校宿舍管理系统,系统中主要包含了宿舍信息表、学生信息表和每日的宿舍查房记录表。在上面的三张表中,我会在适合的位置添加约束。添加约束的目的是:使校验更严格了,写代码则会减少出错率,提高了开发的效率。
学生信息表
create table student (
student_id int primary key auto_increment,
student_name varchar(20) not null,
gender varchar(2) default '女',
age int,
block_number int,
dormitory_number int,
berth_number int);
primary key,not null,default解析
- primary key 主键,但是我在表中使用的是primary key auto_increment 自增主键。使用的是自增主键的话,当前列就会从最大的那个值开始自增,也可以手动修改值;没有加上auto_increment则不会自增,只能手动新增数据。
- not null 不为空,则student_name这一列的值不能为null。
- default '女' 默认gender这一列为女,就是在不需要添加这一列的情况下为女,想要值为男,则需要手动修改或添加值。
宿舍信息表
create table dormitory (
block_number int,
dormitory_number int,
berth_number int,
id int,
foreign key (id) references student (student_id));
foreign key解析
- foreign key (id) references student (student_id)这句代码的意思就是,子表dormitory的id列受父表student的student_id列所制约。
- 当父表中的列没被引用的时候,就可以被删除;但是父表中的列被子表引用,父表就不能被删掉;所以父表和子表是双向制约的。
- 删除表时,应该先删除子表,再删除父表。
- 应用自父表的那一列,要么时主键,要么是unique。
每日的宿舍查房记录表
create table record (
date_time datetime,
dormitory_supervisor varchar(20),
state varchar(5) default '未归寝',
id int unique,
foreign key (id) references student (student_id));
详细查询
1、插入与查询相结合
普通插入:
insert into 表1 values (值1,值2,...);#向表1中插入值
普通查询:
select * from 表2;#查询表2中所有的数据
插入与查询相结合:
1、insert into 表1(列名1,列名,...) select 列名1,列名2,... from 表2; #将表2中查询到的结果插入到表1中;
2、insert into 表1 select * from 表2; #将表2中查询到的结果全部插入到表1中;
注意:
1、查询的值的类型,顺序,个数,必须和要插入的表相匹配!!!
2、括号在 SQL 中用于分组表达式或子查询,而不是用于列名!!
2、聚合查询
聚合查询:行与行之间的运算;
表达式查询:列和列之间的运算;
1:count (数量)
count和后面的括号中间不能加空格!!!
2:sum(总数)
3:avg(平均值)
4:max/min 最大值/最小值
以上的4个函数只能针对数值进行操作,sql是一个弱类型,往往会自动转向double;
5:group by子句
group by 列名,是针对某一列进行分组的。
非group by 的列,不应该直接写到select查询的列中,如果搭配聚合函数是可以的。
注意:
当搭配聚合函数使用的顺序:先查询,再分组,后聚合!!
6:having
having的作用和where的作用是一样的,但是在含有group by的不能使用where。当我们需要过滤掉不需要的条件时,则使用having添加限制条件。
3、联合查询/多表查询(*)
1:笛卡尔积
联合查询也叫做多表查询,多表查询就是对多张表的数据取笛卡尔积。
笛卡尔积是全排列,尝试穷举所有的可能性,所以会产生一些不符合实际情况的数据。
select * from 表1,表2...;
2:join on
因为笛卡尔积可能会包含很多无意义的数据,所以在进行表连接时可以使用join关键字,使用join on还可以提高代码可读性。
select 列名 from 表1 join 表2 on 连接条件;#连接条件:应该是某一列,并且这一列在两表中同时存在。