MySQL:表的增删改查(进阶)
表的增删改查(进阶)十分重要,也较有难度,需多花时间掌握。
一、NULL约束:
在加null约束之前,id可以插入null,在加上null约束之后,id不再可以插入null。
二、unique约束:
将学号设置为唯一,第一次可以插入学号1,第二次不能再插入。
三、default默认键约束:
default:规定没有给列赋值时的默认值。这里的默认值为null。
将名字的默认值修改为“未命名”。
仅插入了学号1,没有插入姓名,此时姓名显示“未命名”。
四、primary key主键约束:(一张表里只能有一个primary key,not null和unique的结合)
(1) 将学号设置为主键,Null不为空,Key为唯一:
(2)自增主键:
将学号设置为自增主键,此后的数据中学号都插入null,但并非真正意义上的空,此后学号会自增,第一次为1,第二次就自增为2。写作null是交给数据库服务器自动分配。
后续分配主键都是根据这个主键来分配的 ,这里王五的学号是10,赵六没有设置值,默认是11。
五、外键:
外键用于关联其他表的主键。(父表约束子表)(class表约束student表)
student表中的classId要出自table表中的classId这一列。
张三的信息可以插入到student表中,但李四却不行,因为200并不包含在class表中的classId那一列中。
当删除父表中被约束的信息时,一定要确保其未在子表中出现过。
这里103未在子表中出现过,所以可以删除。
101在子表中出现过,所以显示删除失败。
先删子表,再删父表 :
六、表的设计:
(1)一对一:
一个学生只能拥有一个账号,一个账号也只能被一个学生拥有。
(2)一对多:
一个学生只能在一个班级中,一个班级中可以有多个学生。
(3)多对多:
一个学生可以选多门课,一门课也被多个学生选。
先创建一个学生表,包含学生id和姓名,然后插入三个人的数据。
再创建一个课程表,包含课程id和名称,然后插入三门课的数据。
借助一个关联表,表示多对多关系 。
(1,1)= 张三选了语文课 (1,2)= 张三选了数学课
(2,1)= 李四选了语文课 (2,3)= 李四选了英语课
七、新增:
将表1中的数据插入到另一个表3中: insert into 表3 select * from 表1;
两张表的数据类型和数量一定要匹配。
八、聚合函数:
(1)count(数量):看看具体有几行
具体的行不会将空计算在内,但统计所有的时候会把空算进去。
去重的查询:
1号和8号的数学成绩是一样的,去重之后查询数量就少了一个。
(2)sum(总和):
查询语文成绩的总和:525
(3)avg(平均):
查询总分的平均分:
(4) max(最大值):
查询英语的最高分。
(5)min(最小值):
查询数学70分以上的最低分:
九、group by语句: (分组查询)
分别查询程序员、产品经理和老板的平均工资:(通过岗位role来分组)
分组之前:查询每个岗位的平均工资,但排除张三。(where语句,在group by之前)
分组之后:查询每个岗位的平均工资,但是排除平均工资超过2w的。 (having 子句一般写在group by后面)
合二为一:查询每个岗位的平均薪资,排除张三,且保留平均工资2万以下的结果:
十、联合查询: (多表查询,笛卡尔积:排列组合)
创建了四张表:班级表、学生表、课名表、分数表
查询3张表的具体数据
(1)内连接:
联合学生和成绩两张表查询,条件是学生表的id与成绩表的student_id相同
查询许仙同学的成绩:
精简版:只查询名字和分数
查询所有同学的总成绩和姓名(笛卡尔积+聚合函数+分组查询):
查询所有同学的个人信息:
精简版:
(2)外连接:
新建两张表,score和student,插入数据如下:
笛卡尔积+联合查询(内连接)
左外连接:(左侧表的每条记录都会出现在最终结果里,如果右侧表不存在,对应列就设为空)
右外连接:(右侧表的每条记录都会出现在最终结果里,如果左侧表不存在,对应列就设为空)
内连接、左外连接、右外连接的区别:
(3)自连接:(自己和自己笛卡尔积,在同一张表连接自身进行查询)
显示所有“计算机原理”成绩比“java”成绩高的成绩信息:
计算机原理的课程id为3,java的课程id为1,就是要查询课程id3比1高的考试成绩。
精简版:
(4)子查询:(嵌入在其他sql语句中的select语句,也叫嵌套查询)
单行子查询:返回这一行记录的子查询。
查询与“不想毕业”同学的同班同学
多行子查询:返回多行记录的子记录:
查询语文或英文课程的考试信息:
(5)合并查询:(合并多个select的执行结果):
需要使用union关键字,该操作符作用于取得两个结果集的并集。使用该操作符时, 会自动去掉结果集中的重复行。
union:允许把两个不同的表,查询结果合并在一起。合并的两个sql的结果集的列需要匹配,列的个数和类型是要一致的,列名不用一致。
【1】查询课程编号小于3或者课程名为“英文”的信息:(两种实现方式,第一种用了or,第二种用了union)
将student1表和student2合并查询,并去除重复的数据。