MySQL表的CRUD进阶武功(2)

37 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

查询

聚合查询

  • 聚合函数 常见的的统计计数,计数平均值等,可以通过聚合函数来实现,常见的聚合函数如下:
函数说明
count(列名)返回查询到的数据的数量
sum(表达式/列名)返回查询到的数据总和,不是数字没有意义
max(表达式/列名)返回查询到的数据最大值,不是数字没有意义
min(表达式/列名)返回查询到的数据最小值,不是数字没有意义
avg(表达式/列名)返回查询到的数据平均值,不是数字没有意义

count

查询多少学生!

在这里插入图片描述

sum

查询总分 在这里插入图片描述

avg

查询每科平均成绩 在这里插入图片描述

max

查询最大值

在这里插入图片描述

min

查询最小值 在这里插入图片描述

  • group by 子句 select中使用 group by 子句可以对指定列进行分组查询。需要满足:使用 group by进行分组查询时,select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。 也就是说,group by子句可以通过列进行分组! 例如下方的emp中根据 role这一列我们可以将该表分成多组! 在这里插入图片描述 根据role分组 在这里插入图片描述查询不同role组中的人数 平均薪水,最高薪水,最低薪水! 在这里插入图片描述
  • having group by子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用where语句,而需要用having显示平均工资低于1500的角色和它的平均工资! 在这里插入图片描述

联合查询

实际上我们的数据库,查询数据时,如果有多张表的数据,我们采用多表查询,多表查询通常采用笛卡尔积的方式! 啥是笛卡尔积呢???

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [1] --来自百度 。 在这里插入图片描述 通俗点说就是,R表和S表,笛卡尔积后变成了RXS表如果R表有n*m S表有x*y,那么RXS就是n*xm*y列!!!

那么笛卡尔积有什么用呢? 当我们需要查询一个学生表对应的班级表时,我们便可以借助笛卡尔积!!! 在这里插入图片描述 但是我们可以看到使用笛卡尔积后,学生表和班级表中的班级id并没有一一对应! 所以当我们使用笛卡尔积查看两张表时需要加一些限制条件!!! 在这里插入图片描述 当我们加了一个限制条件后,where class.id = student.class_id; 我们便可以将两张表的对应关系找出来!~!!!

  • 内连接 SQL语句 select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件; select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件; 我们可以通过上述语句进行内连接!!! 使用where限制条件!!! 在这里插入图片描述查找qq为112的学生!!! 在这里插入图片描述 使用join on限制条件!!! 表1 join 表2 on 条件 在这里插入图片描述
  • 外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

我们先查看这两张表的内容!! 在这里插入图片描述 当我们使用内连接,左外连接,右外连接时区别如下: 内连接: 在这里插入图片描述 可以看到内连接就是两个表的交集: 在这里插入图片描述

左外连接: 在这里插入图片描述 在这里插入图片描述

右外连接: 在这里插入图片描述 在这里插入图片描述

  • 自连接 自连接是指同一张表连接自身查询! 案例: 显示所有数学成绩比语文成绩高的人的成绩的学生信息! 如果我们这张表中的每一门成绩都在一列中,那么显然我们只要使用一个where判断一下即可! 比如: 在这里插入图片描述 但是如果每门的成绩并不是在单独的一列中,那该如何查询呢? 这时就需要用到自连接了!!! 就比如下方我们有三张表 分别为成绩表和学生表和课程表! 如果我们要查询java程序设计成绩比数据库原理成绩高的学生信息该如何操作呢? 在这里插入图片描述自连接就是将行改成列!!! 将一直表起多个别名,就得到多张表!!!! 通过笛卡尔积,我们就可以将这两张表中的行变成列! 我们先对成绩表进行笛卡尔积!!!

一开始的成绩表:

在这里插入图片描述 可以看到学生id为1的学生的课程成绩都在一列中!! 而我们要将不同科目的成绩放在不同的列才能进行比较!!! 进行笛卡尔积后的成绩表: 在这里插入图片描述选择课程java程序设计数据库原理的课程id!!!

在这里插入图片描述 我们将两门课的成绩分别放在了一个列中了!!!

我们再进行限定就可以找到满足条件的学生信息

在这里插入图片描述最后查询java程序设计数据库原理的课程成绩高的学生信息!!!

在这里插入图片描述 步骤有点繁琐!!! 原理就是将行转化成列! 将一张表期别名利用笛卡尔积转化!!!

  • 子查询 子查询简单讲就是,多个sql查询语句的嵌套!!! 就是套娃!!! 不建议的操作! 反人类! 代码可读性差 了解一下即可!

如果我们要查询java程序设计的成绩!! 我们第一步要获取到这个课程的id 在这里插入图片描述 然后通过这个课程id在成绩表中寻找即可!!! 在这里插入图片描述 子查询就一步即可!!! 在这里插入图片描述 显然这玩意除了能装外没啥用!!!

  • 合并查询 在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 unionunion all。使用unionunion all时,前后查询的结果集中,字段需要一致!

我们就是可以用union union all在相同表或者不同表中合并多个select 相当于 单表查询中的or

union

查询刘备和曹操的成绩信息: or

在这里插入图片描述 union

在这里插入图片描述 unionunion all可以合并多个sql语句! 可以在不同的表中进行查询!!!

union all

union allunion唯一的区别就是 union all不会去掉结果集中的重复行! 而union会进行去重!