自学内容网 自学内容网

MySQL:表的增删改查(进阶)

表的增删改查(进阶)十分重要,也较有难度,需多花时间掌握。

 

一、NULL约束:

在加null约束之前,id可以插入null,在加上null约束之后,id不再可以插入null。

566430680a6546b6bfd94295ac64babf.png

 

二、unique约束:

将学号设置为唯一,第一次可以插入学号1,第二次不能再插入。

64954701f1eb44a0a7097ef9ed4793c5.png

 

三、default默认键约束:

default:规定没有给列赋值时的默认值。这里的默认值为null。

a231b4f07b334951b42f5b7f7f6629f4.png

将名字的默认值修改为“未命名”。 

b4aaed55e3134f97be94e153e76165c7.png

 仅插入了学号1,没有插入姓名,此时姓名显示“未命名”。

214667b01f4244e396a041c498dd4923.png

 

四、primary key主键约束:(一张表里只能有一个primary key,not null和unique的结合)

(1) 将学号设置为主键,Null不为空,Key为唯一:

8e567af585634c00aa1f4a41dc703dcc.png

 

(2)自增主键:

将学号设置为自增主键,此后的数据中学号都插入null,但并非真正意义上的空,此后学号会自增,第一次为1,第二次就自增为2。写作null是交给数据库服务器自动分配。

aa59b04870784d54a7ecec7ad0315893.png

后续分配主键都是根据这个主键来分配的 ,这里王五的学号是10,赵六没有设置值,默认是11。 2d5a1b665fba4138a9b715655b270694.png

 

五、外键:

外键用于关联其他表的主键。(父表约束子表)(class表约束student表)

student表中的classId要出自table表中的classId这一列。

3682a8bc80a74b8da7c75caffed306f6.png

张三的信息可以插入到student表中,但李四却不行,因为200并不包含在class表中的classId那一列中。 

ba0a28d492674ce6adc3c4e0a0ce5add.png

当删除父表中被约束的信息时,一定要确保其未在子表中出现过。

这里103未在子表中出现过,所以可以删除。

101在子表中出现过,所以显示删除失败。 

a4373dcd3c1e4a15805cb823c8ac9435.png

 

先删子表,再删父表 :

1e11b33f7c434e2db0252d0c275ac7ff.png

 

 

六、表的设计:

(1)一对一: 

一个学生只能拥有一个账号,一个账号也只能被一个学生拥有。

1338da911d7c46fe86e1d39f7c876f96.png

8b9564bbca1249d4821456e6b9aea635.png

(2)一对多:

一个学生只能在一个班级中,一个班级中可以有多个学生。

5150fdcf69d44844905c10f63b7cda04.png

(3)多对多:

一个学生可以选多门课,一门课也被多个学生选。

先创建一个学生表,包含学生id和姓名,然后插入三个人的数据。

再创建一个课程表,包含课程id和名称,然后插入三门课的数据。

e7f35fb8baf84015823632645be24365.png

借助一个关联表,表示多对多关系 。

(1,1)=  张三选了语文课   (1,2)=  张三选了数学课

(2,1)=  李四选了语文课   (2,3)=  李四选了英语课

76b25938254545b194978085e04843c5.png

 

七、新增:

将表1中的数据插入到另一个表3中: insert into 表3 select * from 表1;

两张表的数据类型和数量一定要匹配。

d1e3bf1f77cd4e48953aa57d3be5561b.png

 

八、聚合函数:

(1)count(数量):看看具体有几行

ab4431d9e1834a06beb115b6cf3679bf.png

具体的行不会将空计算在内,但统计所有的时候会把空算进去。 

31b2a303441142c5858176b1400c331e.png

 

 去重的查询:

1号和8号的数学成绩是一样的,去重之后查询数量就少了一个。

b9e745344df94ac79bdf80fb2c918b98.png

(2)sum(总和):

查询语文成绩的总和:525

b044e62104f04e2eacf3bdfbaa7067b2.png

(3)avg(平均):

查询总分的平均分:

d5ceb6a834b04db8988469fd7dc8cb81.png

(4) max(最大值):

查询英语的最高分。

d1bf1784bdb143199c8c1fdc9e5000c0.png

(5)min(最小值):

查询数学70分以上的最低分:

7590df364394457ab25dd97e7f0f3165.png

 

九、group by语句: (分组查询)

分别查询程序员、产品经理和老板的平均工资:(通过岗位role来分组)

427bb5697f214ffc93a58d18f24895c8.png

分组之前:查询每个岗位的平均工资,但排除张三。(where语句,在group by之前)

97edc96ad3994ae1b339dc98563db069.png

分组之后:查询每个岗位的平均工资,但是排除平均工资超过2w的。 (having 子句一般写在group by后面)

16768761dfb348fe9578102ed321374c.png

合二为一:查询每个岗位的平均薪资,排除张三,且保留平均工资2万以下的结果:

9714eefc32de46d29cf7e3fb09e232d5.png

 

十、联合查询: (多表查询,笛卡尔积:排列组合)

创建了四张表:班级表、学生表、课名表、分数表

272b1fa4476d49b898d50193819ea84f.png

 查询3张表的具体数据

58686715575e4df09d598ed15ac75849.png

 (1)内连接:

联合学生和成绩两张表查询,条件是学生表的id与成绩表的student_id相同

d63a251b565948c396308defba58def5.png

查询许仙同学的成绩: 5c7cc0a2bbbf400ca2088aa97b83e816.png

精简版:只查询名字和分数 

a661cb95fe5f4fc19bbf6cbc42a17f1d.png

查询所有同学的总成绩和姓名(笛卡尔积+聚合函数+分组查询):

c1344fa58d8d4cd1b6c1b1078d9bb30c.png

查询所有同学的个人信息:

52ce76484924467b9be3dcc4d58e2703.png

精简版:

08bdb7bb6bb943c5b4c09d6ed6340b59.png

(2)外连接:

新建两张表,score和student,插入数据如下:

e73c0a2c2d83457d9932ac7b64f689f4.png

笛卡尔积+联合查询(内连接)

d221f14942844fac869b89f6917776cb.png

 左外连接:(左侧表的每条记录都会出现在最终结果里,如果右侧表不存在,对应列就设为空)

6956a058bee54738b1bccff2713feadd.png

右外连接:(右侧表的每条记录都会出现在最终结果里,如果左侧表不存在,对应列就设为空)

2210c614ac584e29965520307c146f36.png

内连接、左外连接、右外连接的区别: 

6a94c365993a439aa8dac1f902a4df5c.png

 

495a5d67f20b43699daaafba9f82c8f5.png

 

 

(3)自连接:(自己和自己笛卡尔积,在同一张表连接自身进行查询)

显示所有“计算机原理”成绩比“java”成绩高的成绩信息:

计算机原理的课程id为3,java的课程id为1,就是要查询课程id3比1高的考试成绩。

944ce5e6b3104b2ea1787085f676232f.png

精简版:

427ea22afbf5469886b312114d0eae6c.png

 

(4)子查询:(嵌入在其他sql语句中的select语句,也叫嵌套查询)

 单行子查询:返回这一行记录的子查询。

查询与“不想毕业”同学的同班同学

4958dced7ed347babbd665eaf0e8697b.png d0c2d242095b444c858f2f9e48a470af.png

多行子查询:返回多行记录的子记录:

查询语文或英文课程的考试信息:

aec1f493e9b24dcea45e03c8662a73dd.png

(5)合并查询:(合并多个select的执行结果):

需要使用union关键字,该操作符作用于取得两个结果集的并集。使用该操作符时, 会自动去掉结果集中的重复行。

union:允许把两个不同的表,查询结果合并在一起。合并的两个sql的结果集的列需要匹配,列的个数和类型是要一致的,列名不用一致。

【1】查询课程编号小于3或者课程名为“英文”的信息:(两种实现方式,第一种用了or,第二种用了union)

39be2252744e46a684a3bd6204f7477c.png

 

将student1表和student2合并查询,并去除重复的数据。 

9a309d83e3ac4c588f3a54c7ed340c8c.png

 


原文地址:https://blog.csdn.net/gdswsj/article/details/143440536

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!