mysql---表的设计

三大范式

范式就是表设计的准则,目的是让表的设计更加合理

  • 第一范式
    第一范式表示表中的每个字段,都是不可分割的,如图:
    在这里插入图片描述
    可以看出address字段是可以分割的,可以分割为:
    在这里插入图片描述
    这种情况就不满足第一范式;
  • 第二范式
    第二范式就是在第一范式的基础上,表中所有字段都应该与表中的主键全部关联,而不是部分关联,一般常见于组合主键,如图:
    在这里插入图片描述
    可以看出这个表有两个主键订单号和产品号,产品数和产品单价都与订单号和产品号相关,但是订单金额和订单时间只与订单号相关,不与产品号相关,这就不符合第二范式的特点,数据冗余,因此可以对这个表进行分割,如图:
    在这里插入图片描述
    也就是第二范式通过完整相关减少数据冗余;
  • 第三范式
    第三范式就是在第二范式的基础上,表中的所有字段都应该和主键直接相关,而不是部分相关,如图:
    在这里插入图片描述
    这个表的主键是学生ID,但是班主任信息和学生ID不是直接相关的,产生了数据冗余,可以分割,如图:
    在这里插入图片描述
    第三范式就是通过直接相关减少数据冗余
联合查询
  • 笛卡尔积
    笛卡尔积就是如图:
    在这里插入图片描述
    也就是A集合*B集合;

  • 内连接
    再进行笛卡尔积之后,进行多表查询,首先是内连接,它使用inner join关键字(inner可以省略)实现,使用on关键字实现条件,例如建立四个表并插入以下数据,如图:
    classes表
    在这里插入图片描述
    student表
    在这里插入图片描述
    course表
    在这里插入图片描述
    score表
    在这里插入图片描述
    内连接就是将两张表的数据取交集(不关联的信息自动过滤掉),例如
    (1)查询"小王"同学的成绩,如图:
    在这里插入图片描述
    (2)查询所有同学的总成绩,并显示出个人信息
    在这里插入图片描述
    这个是需要分组查询的,因为是每一组每一组显示信息;
    (3)查询所有同学的成绩,并显示个人信息
    在这里插入图片描述
    查询所有同学成绩,因此要显示出来课程名,最终结果以stu.id的升序显示;

  • 外连接
    外连接分为左连接和右连接;
    1、左连接:以左表为主表,左表中的数据全都显示,若没有对应右表的信息,则以NULL显示;
    例如:
    (1)查询每个学生所在的班级,显示出学生的id和name,如图:
    在这里插入图片描述
    2、右连接:以右表为主表,左表中的数据全部显示,若没有对应右表的信息,则以NULL显示;
    例如查询每个学生所在的班级,给出班级id和名字,如图:
    在这里插入图片描述

  • 自连接
    自连接就是在同一张表连接自身进行查询,例如查询学生java和计算机组成原理的成绩,并显示对应科目,如图:
    在这里插入图片描述

  • 子查询
    子查询就是在SQL语句中嵌套其他SQL语句,例如:
    (1)查询小王同学的同班同学
    在这里插入图片描述
    或者使用in关键字
    在这里插入图片描述
    (2)查询“高等数学”或者“英语”课程的成绩信息
    如图:
    在这里插入图片描述
    或者可以使用exists关键字,例如:
    在这里插入图片描述
    在from子句中使用子查询,子查询语句出现在from子句中,把一个子查询当做一个临时表使用,例如:查询所有比“计算机科学与技术1班”平均分高的成绩信息,如图:
    在这里插入图片描述
    我这里是没有这种情况的;

  • 合并查询
    在实际应用中,为了合并多个select的执行结果,可以使用集合操作符,例如union和union all,注意使用时前后查询的结果集中,字段要一致;

  • union
    这个是用于取得两个结果集的并集,自动去除重复行
    例如查询id小于3,或者名字为“英语”的课程,如图:
    在这里插入图片描述
    当然也可以使用select* from cource where id<3 or name=“英语”;这个语句;

  • union all

这个与union的区别就是它不会去掉重复行,例如查询id小于3,或者名字为“java”的课程,如图:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章