mysql+层叠+约束_mysql 数据库学习第三天

本文介绍了MySQL数据库中的数据约束,包括默认值、非空、唯一和主键约束。详细讲解了主键自增特性以及如何通过外键实现表间数据约束,强调了级联操作在外键约束中的应用。同时,概述了连接查询的不同类型,如内连接、外连接,并探讨了子查询和联合查询的基本用法。
摘要由CSDN通过智能技术生成

数据的约束 (对用户操作表的数据的约束)

默认值: 当用户对使用‘默认值的字段’不插入值的时候,就使用默认值。

注:对默认值字段可以插入null

默认值:字段   数据类型   default  默认值

非空:限制字段必须赋值

注:非空字段必须赋值,非空字段不能为null

字段   数据类型  not  null

唯一:对字段的值不能重复

注:对唯一字段可以插入一个或者多个null

字段   数据类型  unique

主键:非空+唯一

通常来说,主键是用来记录每张表的唯一性,一般选择没有业务作用的id字段作为主键

id  int primary key,

自增长:字段自动增长

id  int  primary key auto_increment,

注:自增字段可以不赋值,自动递增

delete  from 表名;  不影响自增长约束(删除表数据后,下次插入数据,自增长字段会从上次的值的基础上继续增长)

truncate  from 表名; 影响自增长约束(删除表数据后,下次插入数据,自增长字段会从0的基础上继续增长)

外键:约束两张表的数据

解决数据冗余高问题: 独立出一张表

例如: 员工表  和  部门表

问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!

使用外键约束:约束插入员工表的部门ID字段值

解决办法: 在员工表的部门ID字段添加一个外键约束

//部门表(主表)

create table dept(

id int primary key,

deptname varchar(20)

)

//修改员工表(副表)

create table employee(

id  int primary key,

empname varchar(20),

deptid int --把部门名称修改成部门id

//声明一个外键约束

constraint fk_deptid  foreign key (deptid) references dept(id)

)

注意:

1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!

2)主表的参考字段通用为主键!

3)添加数据: 先添加主表,再添加副表

4)修改数据: 先修改副表,再修改主表

5)删除数据: 先删除副表,再删除主表

级联操作

当有外键约束时,必须修改或者删除副表中所关联的数据,才能修改或者删除主表。

但是若直接修改或者删除主表数据,可以使用级联操作实现。

级联修改   on update cascade

级联删除   on delete cascade

onstraint fk_deptid  foreign key (deptid) references dept(id) on update cascade on delete cascade

注:级联操作必须在外键的基础上使用

连接查询(多表查询)

连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。连接之后并非形成了一个新的数据表,而是一种“内存形态”。

基本形式: from 表1 [连接方式] join 表2 [on 连接条件]

交叉连接:将两个表不设定任何条件的连接结果。数学上成为笛卡尔积

from 表1 [cross] join 表2; cross可省略  可用inner代替

内连接: 找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些

行。

from  表1  [inner]  join表2  on表1.字段1=表2.字段2;

左[外]连接:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应放右边表的字段的位置就自动补为“null”值。

from  表1  left  [outer]  join表2   on连接条件;

右[外]连接:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。

from  表1  right  [outer]  join表2   on连接条件;

全[外]连接:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。

from  表1  full  [outer]  join表2  on连接条件;

注:mysql中其实不认识全[外]连接语法,即mysql这个软件本身不支持全连接的语法。

子查询子查询就是把一个查询的结果当作另一个查询的条件。

in  子查询

语法:where  操作数in (值1,值2,....)

any 子查询

语法:where 操作数  any(值1,值2,....)

联合查询 union

联合查询就是将两个select语句的查询结果‘层叠’到一起成为一个‘大结果’。

两个查询结果能够联合的先觉条件就是:结果字段数相等。

select 语句1

union [all | distinct]

select 语句2;

说明:

1,两个select语句的输出段(结果字段)一样数目一样,应用中通常类型一样才有意义。

2,结果集中的字段以第一个select语句的字段为准。

3,第一个select语句的字段可以做别名,但如果做别名,则后续的where,group,order等子句应该用该别名。

4,联合查询默认是会消除重复项的(DISTINCT),要想不消除,则必须明确些“ALL”。

5,如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:

(select 语句1)

union

(select 语句2)

order  by .....  limit ....;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值