MySQL(二)——表的约束, 表的基本操作
Posted 努力学习的少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL(二)——表的约束, 表的基本操作相关的知识,希望对你有一定的参考价值。
- 💂 个人主页:努力学习的少年
- 🤟 版权: 本文由【努力学习的少年】原创、在CSDN首发、需要转载请联系博主
- 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
目录
一.表操作
1. 插入数据
如下的test表,接下来我们会对它进行操作。
全量插入数据,往表中插入所有数据段的数据,不需要在表名后面指定数据段。
insert into 表名 values(数据,数据....);
指定数据段的进行插入数据,需要在表名后面指定数据段。
insert into 表名(数据段,数据段) values(数据,数据);
将指定数据段的数据插入到test表中,表名后面需要跟上指定插入数据段的类型。
多行数据插入,在values后面用多个括号插入数据
实例:同时插入多条数据进test表中。
2. 查询
全字段查询
select * from 表名;
" * "代表的是表中的所有字段。
实例:查看reports表中的所有字段的信息。
指定字段查询
select 字段,字段 from 表名;
实例:只查看reports中的id和name的信息
查询字段为表达式
- 表达式中不包含字段的表达式:如下10+30
- 表达式中包含多个字段,如下的chinese+english+math表达式
如果我们想算reports中所有人的总分,那么我们可以用chinese+english+math表达式算出来。
给表达式取别名
直接在表达式后加上别名即可,如上,我们在chinese+english+math表达式后面加上总分,则表中显示出来chinese+math+engish会被替换为总分。
3.结果去重
如果想要将查询的字段中不包含重复数据,可以在字段的前面加上distinct
在上面的表中,我们可以看到math是有重复了,但是我们想要看到去重math结果,所以我们可以在math前面加上distinct.
4.where条件
where是用来筛选行数据的条件,例如,我们要表中筛选出math是大于60分,那么我就需要使用where进行筛选。
where筛选的运算符分为比较运算符和逻辑运算符。
比较运算符
逻辑运算符
实例:找出reports表中数学大于90分的同学 。
实例:找出reports表中的数学成绩在[100,120]区间。
实例:查找姓张的同学。
like是模糊匹配,其中” % "能够匹配到多个字符(包括0个)字符。
实例:查找张某同学。
ps:“_"只匹配到一个字符。
实例:查找语文成绩大于英语成绩的同学。
实例:筛选出总分在300分以下的同学
表达式别名不能出现在where语句中。
实例:语文成绩小于100分,且不是姓张的同学。
5. 结果排序
order by能够将筛选结果进行排序,order by语句默认排的是升序。
实例:将reports表中的语文成绩排一个升序。
order by 语句后面可以加上ASC或者DESC,ASC为升序,DESC为降序。
实例:将reports表中的语文成绩排一个降序。
实例:查询同学的各门成绩,依次按照语文成绩,数学成绩,英语成绩排一个降序。
实例:查询同学的成绩,由高到低
利用表达式的别名进行排序
表达式的别名是可以出现在order by语句后面。
查询的过程:
where语句执行选择出行数据->进行select 的要求进一步筛选出列的数据后表达式->进行 order by对数据进行排序->显示阶段。
因为select是在where的后面,在order by的前面,所以别名是不能出现在where语句中,能够出现在order by语句中。
6.筛选分页显示
在语句的后面加上limit n;显示多少行,如果我们在查询一个未知表时,最后加上一条limit 3,防止表中的行数据太多,导致数据库卡死。
实例: 查询同学的成绩,由高到低,只显示成绩前3名的同学
7. 修改行数据
update 表名 set 字段名=数据,字段名=数据.... where 语句;
实例:将关羽的数学成绩改为110分,语文成绩改为100分。
如果不加where进行筛选,则会导致表中字段下的所有数据都会被改。
实例:将总成绩倒数前三 的三位同学的数学成绩加上30分。
update reports set math=math+30 order by chinese +math+english limit 3
order by chinese+math+english limit 3.筛选出总分最后三名的同学.
set math=math+30:将数学成绩加上30分;
8.删除数据
delete from 表名 筛选条件;
实例:删除总分倒数三名的数据。
delete from reports order by chinese+math+english limit 3;
order by chinese +math +english limit 3;筛选出总分倒数三名的同学。
9.清空表
truncate 表名;
实例:清空 test1表中的所有数据
如果使用turncate清空表,会重置AUTO_INCREMENT,AUTO_INCREMENT属性下面讲解。
如果使用的是delete清空表,则不会重置ATUO_INCREMENT中的数据
delete from test1;清空test1表
二.表的约束
1.属性含义
desc person;查看person表的字段属性。
- Field:字段的名字
- Type:字段的数据类型。
- NULL:如果是Yes,则该字段的值可以为NULL,如果为NO,则该字段不能为空
- Key:主键值,可以作为该表的唯一标识
- Default:设置字段的默认值,如果为NULL,则该字段没有默认值
- Extra:设置额外的属性。
2.设置非空约束
当数据表中希望某个字段的值不希望被设置为NULL时,则可以在创建数据表的时候在该字段的后面加上"NOT NULL“约束条件,保证所有记录中该字段都有值。
实例:创建test表使id字段不能为空,name可以为空。
null的值为NULL保证该字段都有值,如下,如果只插入name是插入不成功,因为id字段被设置为NOT NULL,插入的数据id必须要有值。
3. 设置字段的默认值
当为数据库中插入一条新记录时,如果没有为某个字段赋值,尼玛数据库系统就会自动为这个字段插入默认值。在创建数据库时在某些字段后面加上" DEFAULT 默认值 "。
实例:创建一个test1表,name中包含张三默认值。
当我们只插入id字段的时候,则name的值默认是"张三".
如果一个字段同时被设置非空值和默认值,那么该字段的非空属性就会失去效果,因为每次插入的值都有一个默认值,不会导致该字段的值是空。
4.设置字段描述
字段描述是没有实际含义,专门用来描述字段,是给程序员查看字段的含义。在创建数据库时在某些字段后面加上" comment 字段描述"。
实例:创建一个test表,用comment来描述id和name字段。
查看表中字段描述指令show create table 表名;
5.zerofill
很多人在学数据库的时候,很多人对字段类型后面的长度很迷茫。例如int(11),11中这个数字它不是代表的类型大小,而代表的的是最小数据类型的宽度,当然前提得有设置zerofill这个属性..
实例:将test表中id的属性类型的最小宽度设置为5,且设置为zerofill属性,插入一个23,发现前面补了3个0.
总结:只有当字段为zerofill属性的时候, 字段属性后面的数字才有效,如果插入的数据不足为最小宽度,前面会补0.
6.设置主键约束
当想用数据库表中的某个字段来唯一标识所有记录时,则可以使用主键进行约束进行设置。主键约束在创建表时为某些字段加上 " PRIMARY KEY" 约束条件。表中的只能有一个字段能被设置为主键,且被设置的主键的字段能够标识字段中所有数据的唯一性。
实例:创建一个test3表,将id设置为主键
被设置主键的字段中key属性列中会出现PRI,NULL被设置为NO。被设置为主键的字段中的数据不能重复,不能为空,一张表中只能有一个主键。
如上:因为id被设置为主键,所以表中的id字段不能出现相同的数据,如果重复插入,则会插入失败。
7.复合主键
复合主键是让多个字段来标识其唯一性。
例如:在网络中,会使用ip+port来标识唯一的进程。
创建复合主键需要在创建表的时候需要最后加上一个 primary key(字段名,字段名...);
实例:创建test4表,使ip和port是复合主键。
被设置的复合主键的字段中,不能出现所有字段都相同的数据。
如下,表中不能同时出现ip和port都相同的数据,否则会插入失败。
其出现ip相同,port不同的数据,或者 可以出现 ip不同,port相同的数据。
8.设置字段值自动增加
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同值。它需要与主键搭配使用,作为主键值。
- 自增长设置必须是整数。
- 一张表中只有一个自增长字段。
实例:创建一个test_final表,将id字段设置为自增长属性。
ps:将字段设置为自增长属性,同时需要将其字段设置为primary_key属性,否则将会创建失败。
创建表test_final,查看表中字段属性时,可以看到id字段中的Extra中有一个auto_increment属性。
接下来我插入两个数据,不给id插入值,由于id是自增长字段,所以插入的数据如果不给id字段值,那么id值会被系统触发,系统会从当前的字段中的最大值加1。
9.唯一键
校园中每一学生中都存在大量唯一性的数据,学号,身份证号,qq号,微信号。。。
如果只有一个主键来设置唯一性是远远不够的,所以就有唯一键来表示其它数据的唯一性。
- 唯一键它能够标识某个字段下的数据的唯一性。
- 唯一键下字段的数据可以为NULL。
- 一张表中的可以多个字段被设置为唯一键。
设置唯一键,需要在字段的后面加上"unique".
实例:创建一个test表,将id设置为自增长属性,qq设置为唯一键。
唯一键字段中不能出现重复的数据,所以第二次重复插入会失败。
唯一键字段中的数据可以为NULL。
10.外键及其外键约束
外键是用来定义主表与从表之间的关系:外键的约束主要定义在从表上,主表则必须是有主键约束或unique约束,当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
如下:其中test_fial表表示的是期末排名,class_desc表表示的是班级id及其描述。test_final中的class_id被称为外键,因为它是与class_desc表中的id建立映射关系的。test_final表中的class_id字段中的数据必须存在class_desc表的中id值中,如果不存在,则插入的数据会失败,这就是外键约束,如下:test_final表中的class_id不能是4,因为class_desc表中id的没有4这个班级。
实例:创建主表class_desc与从表test_final,并让让test_final表中的class_id与class_desc表中id建立约束关系。
创建主表class_desc
创建从表test_final
查看从表test_final中字段的属性,如果字段被设置有外键,则key属性列中会有MUL值。
插入数j据到主表当中:
往test_final中插入数据,如果往class_id字段中插入的数据是4,则会插入失败,因为class_id受到了class_desc表中id的约束。
如何理解外键约束?
如果在从表test_final中的class_id没有与class_desc中的id建立外键约束的关系,那么就有可能class_id就会出现class_desc中id没有出现过值,如果没有建立约束的关系就有可能出现很大的问题,外键约束能够保证从表test_final中的class_id字段下数据都在class_desc表中的id的范围内。
例如:一个学校只开了3个班级,分别是1,2,3班,但是如果在期末成绩表中出现了一个4班的学生,那么这很明显就会有问题,因此我们需要通过外键约束来保证数据的正确性和完整性。
以上是关于MySQL(二)——表的约束, 表的基本操作的主要内容,如果未能解决你的问题,请参考以下文章