mysql 数据库学习第三天
数据的约束 (对用户操作表的数据的约束)
默认值: 当用户对使用‘默认值的字段’不插入值的时候,就使用默认值。
注:对默认值字段可以插入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 ....;
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步