前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MySQL】表的增删查改(进阶)

【MySQL】表的增删查改(进阶)

作者头像
xxxflower
发布2023-04-16 17:49:44
3K0
发布2023-04-16 17:49:44
举报
文章被收录于专栏:《数据结构》《数据结构》

数据库约束

约束类型

NOT NULL

指示某列不能存储NULL值.

在这里插入图片描述
在这里插入图片描述

UNIQUE

保证某列的每行必须有唯一的值。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据库如何判定,当前这一条记录是重复的?先查找,再插入。但是加上约束之后,数据库的执行过程可能就变了。因此执行时间或者效率会受到很大影响。

PRIMARY KEY

约束是可以组合在一起使用的。一列中可以同时加上多个约束。如:

在这里插入图片描述
在这里插入图片描述

主键约束,就是not null + unique 主键也同样是在插入记录的时候,需要先查询,再进行真正的插入。 正因为主键和unique都有先查询的过程,MySQL就会默认给primary key和unique 这样的列,自动添加索引,来提高查询速度。 注意:

  1. 实际开发中,大部分的表,一般都会带有一个主键,主键往往是一个整数表示的id
  2. 在mysql中,一个表里,只能有一个主键,不能有多个
  3. 虽然主键不能有多个,mysql允许把多个列放到一起共同作为一个主键(联合主键)
  4. 主键另外一个非常常用的方法,就是使用mysql自带的“自增主键”作为主键的值。(主键需要保证不重复,如果我们靠自己去生成一些不重复的主键值,就比较麻烦)
在这里插入图片描述
在这里插入图片描述

值得注意的是:自增主键,并不会重复利用中间的空隙,是依照之前的最大值,来往后累加的。

在这里插入图片描述
在这里插入图片描述

mysql的数据量比较小,所有的数据都在一个mysql服务器上,自增主键是可以很好地工作的,如果mysql的数据量很大,一台主机放不下就需要进行分库分表,使用多个主机来进行存储。

在这里插入图片描述
在这里插入图片描述

在这个场景下,如果再新插入一个数据,这个数据就会落在三个服务器之一,那么新的这个数据的主键id,如果分配?能否继续用mysql自带的自增主键??? 涉及到一个“分布式系统中唯一id生成算法” 实现公式 = 时间戳 + 主机编号+ 随机因子 =>结合三部分就可以得到一个全局唯一的id。

DEFAULT

在这里插入图片描述
在这里插入图片描述

FOREIGN KEY(外键约束)

针对两个表之间,产生的约束。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

外键约束的含义,就是要求student里的classId 务必要在class表的id列中存在。

在这里插入图片描述
在这里插入图片描述

学生表中的数据要依赖班级表的数据。班级表的数据要对学生表产生约束力。此处起到约束作用的班级,就叫做“父表”(parent),被约束的这个表,就叫做子表(child)。 外键约束,是父表对 子表做了约束,但与此同时。子表也在反过来约束了父表。

在这里插入图片描述
在这里插入图片描述

id为1,被子表引用了,因此被约束,无法删除id为1的数据。 id为2,没有被引用,可以删除。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这是为什么呢?每次给子表插入数据,势必要在父表中查询一下这个id是否存在。默认情况下查询是需要遍历表的。在表非常大的时候,遍历效率非常低,所以要使用索引。 要想创建外键,就要求父表的对应的列,得有primary key 或者unique约束。

表的设计

表的设计/数据库的设计,要做的工作,就是明确一个程序里,需要使用几个数据库,几个表,表里有哪些列~ 设计表/数据库基本思路:

  1. 先明确实体
  2. 再明确实体之间的关系(关系是固定的套路:1.没关系 2.一对一 3. 一对多 4.多对多)
  3. 根据上述内容,套入到固定的“公式”中,然后就可以得到表。

一对一关系

在教务系统中,有一个实体,学生,还有一个实体,账号。

一个学生,只能拥有一个账号(一个学生不能有多个账号) 一个账号,只能被一个同学使用(一个账号不能给多个同学共享)

针对这种关系:

  1. 可以把学生和账号,这两个实体放入一个表中 student_account(id,name,username,password);
  2. 学生和账号在不同的表里,相互关联 student(studentId,name); account(accountId,username,password,studentId);

student.studentId与account.studentId相互关联~

一对多关系

一个学生,只能存在于一个班级中。 一个班级,可以包含多个学生。

针对这种关系:

  1. student(id,name); class(class,name,studentIds); 注意:这种在MySQL中不可行,因为MySQL中没有一个像数组这样的类型。
  2. student(id,name,classId); class(classId,name);

多对多关系

学生与课程之间:

一个学生可以选修多门课程 一门课程,也可以被多个学生来选择

针对这种关系: student(studentId,name); course(courseId,name); student_course(studentId,courseId);

新增

把查询的结果,插入到另一个表中。

在这里插入图片描述
在这里插入图片描述

(相当于复制粘贴~)

查询

聚合查询

本质上是在针对行和行之间进行计算。 进行聚合,需要搭配聚合函数(SQL中内置的一组函数)

聚合函数

常见的聚合函数有:

在这里插入图片描述
在这里插入图片描述

这些操作都是针对某个列的所有行来进行运算的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:count和()之间不能有空格,必须紧挨着!!! sum求和: 要求这个列必须得是数字。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NULL和任何数据运算,结果都是NULL,sum会尽可能的避免这种情况。

在这里插入图片描述
在这里插入图片描述

GROUP BY 子句

使用group by 对表中的行进行分组 不用group by分组的时候,相当于只有一组。引入group by就可以针对不同的组来分别进行聚合。

在这里插入图片描述
在这里插入图片描述

如果不带聚合函数的普通查询,一般不能group by。mysql中如果没有order by,这里的顺序是不可预期的。 分组查询,也是可以指定条件的。有两种情况:

  1. 分组之前,指定条件。先筛选,再分组。 where
  2. 分组之后,指定条件。先分组,再筛选。 having
  3. 分组之前和之后,都指定条件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上having之后的条件是分组之后才能算出来的的,此时就需要先分组。再条件筛选。

在这里插入图片描述
在这里插入图片描述

以上属于第三种情况,两者都有。

在这里插入图片描述
在这里插入图片描述

联合查询(多表查询)

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

笛卡尔积是通过排列组合来的。 笛卡尔积得到一个更大的表。列数就是两个表列数只和。行数就是两个表行数之积。 但是仔细观察,笛卡尔积里的很多结果,是无效数据。只有一部分是有意义的。 需要用到成员访问运算符.

在这里插入图片描述
在这里插入图片描述

加上以上条件之后,结果就只剩下合法数据了。我们吧这个用来筛选有效数据的条件称为连接条件。 任务1:查询许仙同学的成绩 要想完成上述查询,就需要吧学生表和分数表进行联合查询。 那么如何进行联合查询呢?

  1. 先计算笛卡尔积
在这里插入图片描述
在这里插入图片描述
  1. 引入连接条件
在这里插入图片描述
在这里插入图片描述
  1. 再根据需求,加入必要的条件。
在这里插入图片描述
在这里插入图片描述
  1. 把不必要的列去掉
在这里插入图片描述
在这里插入图片描述

联合查询,还有一种写法。使用join来完成

在这里插入图片描述
在这里插入图片描述

或者写作:

在这里插入图片描述
在这里插入图片描述

任务2:查询所有同学的总成绩,以及同学的个人信息 分析:要列出每个同学的姓名(student表)和总分(分数表),由于此处是按照行的维度来进行组织的,就需要使用聚合查询来完成。

  1. 先笛卡尔积
在这里插入图片描述
在这里插入图片描述
  1. 加上连接条件
在这里插入图片描述
在这里插入图片描述
  1. 加上聚合查询,把同一个同学的行合并到同一个组中同时计算总分
在这里插入图片描述
在这里插入图片描述

任务3:查询所有同学的成绩以及同学的个人信息 分析:期望查询结果中,有个人信息(student表),有课程名字(class表),有分数(分数表)

  1. 先对三张表进行笛卡尔积
在这里插入图片描述
在这里插入图片描述
  1. 引入连接条件()此处有两个引入条件需要同时满足
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  1. 针对要求的列进行精简
在这里插入图片描述
在这里插入图片描述

同样是使用join on也可以进行三个表的查询

在这里插入图片描述
在这里插入图片描述

内连接和外连接

内连接语法:

代码语言:javascript
复制
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

外连接语法:

代码语言:javascript
复制
-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

内连接和外连接大多数情况下没什么区别。但是如果表不是一一对应,内连接和外连接就有区别了。

在这里插入图片描述
在这里插入图片描述

左外连接:会把左表的结果尽量列出来,哪怕在右表中没有对应的记录,就使用NULL填充。 同理,右表连接,会把右表的结果尽量列出来,哪怕左表中没有对应的李璐,就使用NULL来填充。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自连接

自连接就是自己和自己进行笛卡尔积。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

子查询

子查询本质上就是套娃。把多个SQL组合成一个。实际开发中,子查询要慎用! 单行子查询:返回一行记录的子查询 任务:查询与“不想毕业”同学的同班同学 分析:先去查询不想毕业同学的班级id,再按照班级id来查询那些同学和他一个班。

在这里插入图片描述
在这里插入图片描述

子查询就是把两个操作合并~

在这里插入图片描述
在这里插入图片描述

多行子查询

返回多行记录的子查询 任务:查询“语文”或者“英语课程的成绩信息” 分析:1.现根据名字查课程id 2.根据课程id查询课程分数 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

合并查询

本质上是吧两个查询的结果集,合并成一个。(要求这两结果集的列相同,才能合并) 任务:查询id小于3,或者名字为“英文”的课程。

在这里插入图片描述
在这里插入图片描述

union all和union差不多,union是会进行去重的。union all则是可以保留多份,不去重。

知识扩展: 高内聚和低耦合 耦合:描述了模块之间的关联关系是不是比较强。认为关联关系越强,越复杂,即耦合度越高,越不好。 高内聚:把所有有关联关系的代码写到一起。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据库约束
    • 约束类型
      • NOT NULL
      • UNIQUE
      • PRIMARY KEY
      • DEFAULT
      • FOREIGN KEY(外键约束)
  • 表的设计
    • 一对一关系
      • 一对多关系
        • 多对多关系
        • 新增
        • 查询
          • 聚合查询
            • 聚合函数
            • GROUP BY 子句
          • 联合查询(多表查询)
            • 内连接和外连接
              • 自连接
                • 子查询
                  • 多行子查询
                    • 合并查询
                    相关产品与服务
                    云数据库 MySQL
                    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                    http://www.vxiaotou.com