MySQL表的增删改查(进阶)
Posted flyyyya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL表的增删改查(进阶)相关的知识,希望对你有一定的参考价值。
数据库的约束
概念
约束:数据库针对数据进行一系列的校验,如果发现插入的数据不符合约束中描述的校验规则,就会插入失败,为了更好的保证数据的正确性。
1.not null:不能插入空的数据。
2.unique:该列的所有行的数据是不能重复的。
两个约束叠加
3.default 给列执行默认值
4.primary key主键等价于not null + unique
5.auto_increment
自增的特点是:
如果表中没有任何记录,自增从1开始,如果表中已经有记录了,自增从上一条记录往下自增。
如果把中间的某个数据删了之后,再插入数据,刚才删掉的自增主键的值不会被重复利用。
6.foreign key 外键,描述两张表之间的关联关系。
需要指定三方面信息:
1.指定当前表中哪列进行关联。
2.指定和哪张表关联。
3.指定和目标表中哪一列关联。
表的设计
三大范式
1.一对一
eg:
人->身份证
2.一对多
班级–>拥有–>学生
组织形式
class 表(id,name)
student表(id,name,classid)
student表中可能会存在很多条记录,这很多条记录中其中的classid可能都是相同的记录,这些classid相同的记录表示是存在于同一个班级中.
3.多对多
多对多的关系,两者之间的对应关系是非常复杂的,多对多这个关系很复杂,需要引入中间表来解决这个问题。
例如,描述每个同学的每个科目的考试成绩~
先创建表来描述同学信息,然后再创建表描述科目信息。
由于是多对多的关系,会看到courseid存在很多重复的(很多同学都可能修了这门课程)
很多studentid也存在重复(一个同学可能修了多门课程)
如果想查找甲这个同学的语文成绩如何?
此时查找过程会更复杂
1.先找到甲的studentld
2.在找到语文的courseld
3.结合这两个id再在score表中查找
可以把其他select查找的结果作为新增的数据
子查询得到的列的数目,顺序,类型和被插入的表的列的数目,顺序,类型一致,名字不一致无所谓。
新增
可以把其他select查找的结果作为新增的数据.
子查询得到的列的数目,顺序,类型都得和被插入的表的列的数目,顺序,类型一致,列的名字一致不一致无所谓。
查询
1.count:计算结果的行数
count应该是不计算null的值的,本来是一个函数,如果和(name)有空格,相当于把Count当成一个列名。
2.求总和
3.求最大最小值
4.求所有分数小于90的同学的平均分。
5.group by把查询结果集按照一定的规则分组(可能分成多个组)
角色相同的会被分到同一组中。查询每个岗位的最高工资,最低工资,平均工资。
有了group by之后就把role相同的记录放到同一组中,avg就是针对每个组分别来求平均值。
group by 中也可以结合一些条件对数据进行进一步的筛选,不是使用where,而是使用having。
查找除所有平均工资高于250的岗位和平均薪资。
having是针对group by之后的结果进行筛选。
where是针对原始表中的每条记录都进行筛选。
联合查询/多表查询
实现联合查询的基本机制:笛卡尔积
学生表id name courseid
1 曹操 1
2 刘备 3
3 孙权 4
课程表 id name
1 语文
2 数学
3 英语
4 物理
笛卡尔积的结果
笛卡儿积就会得到12条记录,两张表每条记录进行排列组合的结果。
多表查询的过程,先计算多个表的笛卡尔积,再基于一些条件针对笛卡尔积中的记录进行筛选。
如果针对两个比较大的表进行联合查询,笛卡尔积的计算开销会很大,最终的查找效率也就较低。
a)查找名为“许仙”的同学的所有成绩
姓名包含在student表中
分数包含在score表中
就需要针对这两个表进行联合查询。
进行多表查询时,写列的时候要写成[表名][列名]
查找过程如果拆分开:
1.先找到名为许仙的id
2.拿着id去score表中查询
在笛卡尔积中发现,大量的数据其实是没啥意义的,student的表中的Id和score表中的student_id 字段对应,才是有意义的。
实际的解决思路
1.先把两张表联合在一起,得到笛卡尔积
2.按照student id 对笛卡尔积的记录进行筛选,保留有意义的数据
3.再针对名字进行筛选。
b)查找所有同学的总成绩,以及该同学的基本信息。
同学信息是在student中
成绩在score表中还是需要针对student和score来进行联合(笛卡尔积)
筛选条件:
1.按照学生id来筛选,干掉笛卡尔积中的不必要的数据
2. 按照学生id进行group by,求每个同学的总成绩
select中如果没有指定order by语句,得到的结果顺序都是不确定的。
c)查找所有同学的每一科成绩,和同学的相关信息,最终的效果需要显示:同学姓名,科目名称,对应的成绩。
以上是关于MySQL表的增删改查(进阶)的主要内容,如果未能解决你的问题,请参考以下文章