Sql语句的一些事(二)
与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
from--where--group by--having--select--order by, from:需要从哪个数据表检索数据 where:过滤表中数据的条件 group by:如何将上面过滤出的数据分组 having:对上面已经分组的数据进行过滤的条件 select:查看结果集中的哪个列,或列的计算结果 order by :按照什么样的顺序来查看返回的数据
在数据库中,为了要维护数据的完整性,以及一些数据的校验和逻辑性处理,常常需要用到约束
常见的约束一共有五种:not null、unique、 primary_key、foreign_key、check
(1)not null
----称为非空约束,是指某一列的值不能为null
Null类型特征: 所有的类型的值都可以是null,包括int、float等数据类型 空字符串””是不等于null,0也不等于null
同时有一点是:Mysql对Not NULL 约束,是建立在判断插入语句里面赋的值是不是null。如果限制为not null的列在插入语句没有赋值null,则允许插入,否则禁止插入。(如果默认值NULL,且该列没出现在插入语句,则会产生一个警告信息,但是仍然能插入Okey)
如下:ces列设置的是非空约束
当执行如下sql后,数据库就会发生错误
常见用法:
增加非空约束 alter table temp modify sex varchar(2) not null; 取消非空约束 alter table temp modify sex varchar(2) null; 取消非空约束,增加默认值 alter table temp modify sex varchar(2) default ‘abc;
(2)unique
----称为唯一性约束,用来约束table中列或者列组合不能重复,保证数据的一致性
虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束
在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同
MySQL会给唯一约束的列上默认创建一个唯一索引
create table test( id int not null, name varchar(25), password varchar(25), CONSTRAINT uk_name_pwd unique(name,password) ); 表示用户名和密码组合不能重复 添加唯一约束 alter table temp add unique(name, password); 修改唯一性约束 alter table temp modify name varchar(25) unique; 删除约束 alter table temp drop index name;
在数据库可以看到刚才配置的唯一约束出现在索引的位置,其实两者是很接近的东西,唯一约束需要靠唯一索引来实现,建唯一约束,会自动建唯一索引,但建唯一索引,不会自动创建唯一约束。但创建了唯一索引,会产生和唯一约束相同的效果,即不能插入重复值(但唯一索引和唯一约束允许出现多个空值),否则会报错
(3)primary key
----主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值
如果的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建
MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引
语法: StudentID int not null primary key 创建学生编号为主键 primary key(Students) 创建学生编号为主键 primary key(StudentID,Email) 创建学生ID和Email为联合主键 为已存在的列创建主键 alter table table_name add primary key(column_name) 删除主键约束 alter table table_name drop primary key 删除主键约束 alter table table_name drop constraint 主键约束名 主键约束名可以使用sp_help查询
(4)foreign key
----外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系
也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。 注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录, 那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束
语法: foreign key (column_name) references 主表名(主键列名) 创建column_name为主表名的外键 column_name int foreign key references 主表名(主键列名) 创建column_name为主表名的外键 alter table table_name add foreign key (列名) references 主表名(主键列名) 为已存在的列创建外键 alter table table_name drop foreign key 外键约束名 删除外键约束(Mysql)
(5)check
----MySQL可以使用check约束,但check约束对数据验证没有任何作用
create table temp( id int auto_increment, name varchar(20), age int, primary key(id), check(age > 20) );
结果:上面check约束要求age必须大于20,但没有任何作用。但是创建table的时候没有任何错误或警告
备注:借鉴博主分享https://blog.csdn.net/z120270662/article/details/79501621