【MySQL】超详细_数据库的约束_MySQL的详细查询

复习前面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解析 

  1.  primary key 主键,但是我在表中使用的是primary key auto_increment 自增主键。使用的是自增主键的话,当前列就会从最大的那个值开始自增,也可以手动修改值;没有加上auto_increment则不会自增,只能手动新增数据。
  2. not null 不为空,则student_name这一列的值不能为null。
  3. 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 连接条件;#连接条件:应该是某一列,并且这一列在两表中同时存在。

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值