MySQL(二)——表的约束, 表的基本操作

Posted 努力学习的少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL(二)——表的约束, 表的基本操作相关的知识,希望对你有一定的参考价值。

  • 💂 个人主页:努力学习的少年
  • 🤟 版权: 本文由【努力学习的少年】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

目录

一.表操作

1. 插入数据

2. 查询

 3.结果去重

4.where条件

5. 结果排序

6.筛选分页显示

7. 修改行数据

8.删除数据 

9.清空表

二.表的约束

1.属性含义

2.设置非空约束

​3. 设置字段的默认值

4.设置字段描述

5.zerofill

6.设置主键约束

7.复合主键

8.设置字段值自动增加

9.唯一键

10.外键及其外键约束


一.表操作

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(二)——表的约束, 表的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:表的操作 知识点难点总结:表完整性约束及其他常用知识点二次总结🙄

038_MySQL 表的操作

MySQL表的增删改查(进阶)

Linux--表的高级操作/外键约束 MySQL数据库管理

『 MySQL篇 』:MySQL表的相关约束

132 MySQL表的完整性约束