Mysql多种组合查询

写在前面:

本篇博客主要介绍了,Mysql中表的数据多种如下查询方式:

目录:

  1. 聚合查询
  2. Group by子句
  3. Having 条件
  4. 联合查询
  5. 子查询
  6. 合并查询
一、聚合查询:
函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义

1、count

select count(*) from tablename;//查询一个表有多少条数据
select count(0) from tablename;
//也可以为  记录某一列(值不为空NULL)的数据有多少条  例如:
select count(coulmn

在这里插入图片描述
2、sum
求某一列或者某一表达式的总和
例如:求每个学生的三门成绩的总和
有的同学可能会想到如下的代码:

select sum(column1+column2+...) from tablename;
//但是我们实验了之后会发现 结果是一个整数  而不是 一行行的数据的和  这是为什么 呢?  
//注意:  sum 是求一列(一个表达式)的所有数据的和,而不会一行一行的计算  

想要计算一行一行的 也就是将每个学生的总成绩打印出来:

select column1+column2+.... from tablename;//这样就可以了
select stu.id 学号,stu.name 姓名,stu.markid 课程表id,stm.English+stm.Chinese+stm.Japanese 总分 from student_info stu,student_mark stm where stu.markid=stm.id;

在这里插入图片描述
3.AVG
统计平均数
示例:
统计三门成绩的平均数:

select avg(English),avg(Chinese),avg(Japanese) from student_mark;

在这里插入图片描述
计算三门成绩综合的平均值

select avg(English+Chinese+Japanese) from student_mark;

在这里插入图片描述
4、MAX/MIN
求某一列的或者表达式的最大值

select min/max(column or expression) from tablename [条件];

示例:

在这里插入图片描述

二、Group by

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。
需要满足:使用 GROUP BY 进行分组查 询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函 数中。

例如:有如下一个表:

在这里插入图片描述
使用如下语句:

select column from tablename group by column

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

注意:这里是以字段名进行分组查询的,如果想要查询其他的字段名 其他的字段名必须包含在聚合函数的关键字中 例如 sum max min avg 等

例如:按角色查询每个角色里id 最大的id
在这里插入图片描述

三、Having

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING

select column,.... from tablename group by column having 条件;
//和where 用法相同

例如:

select role,max(age),min(age),avg(age) from Personinfo group by role having avg(age)<20;
select role,max(age),min(age),avg(age) from Personinfo group by role having avg(age)>20;

按角色分组查询、查询最大年龄、最小年龄、平均年龄大于(小于)20 的情况

在这里插入图片描述

联合查询

联合查询是在:当有多个表,并且需要将两个或多个表的数据联合起来进行查询,就需要进行表与表之间进行连接来查询数据,具体通过一些连接方式和条件进行连接查询

示例:
现在有三个表:
学生基本信息表:
在这里插入图片描述
学生选课信息表: 1 代表选了该课程 0 代表没有选该课程
在这里插入图片描述
学生选课成绩表:NULL是因为该学生没有选该课程
在这里插入图片描述

内连接

语法:

select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件; 
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;

例如查询所有学生的英语成绩
1:

select stu.id 学号,stu.name 姓名, stm.English 英语成绩 from student_info stu inner join student_mark stm on stu.markid=stm.id;

在这里插入图片描述
2:

select stu.id 学号,stu.name 姓名, stm.English 英语成绩 from student_info stu,student_mark stm where stu.markid=stm.id;

在这里插入图片描述

注意:只要语法基本没错,大多数的错误都是因为,单词的拼写错误,或者符号例如:逗号、分号的使用错误导致出现了问题。

外连接

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

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

示例:
左外连接:

select *from student_info stu left join student_mark stm on stu.markid=stm.id;

在这里插入图片描述

右外连接:

select *from student_mark stm right join student_info stu on stu.markid=stm.id;

在这里插入图片描述

注意:当 没有写left/right 的时候是默认左连接的也就是左侧的表完全显示。

自然连接

自连接是指在同一张表连接自身进行查询
例如:查询一个表中的学生英语成绩比语文成绩高的信息:

select stm1.* from student_mark stm1,student_mark stm2 where stm1.id=stm2.id and stm1.English>stm2.Chinese;

在这里插入图片描述
还可以搭配 join on 等语句进行自连接查询

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
**单行查询:**返回一行记录的子查询 注意这里只能返回一条记录,当返回的记录是多条时应该使用多行查询,否则会出现错误。
例如:查询选课三门都选了的学生信息

select *from student_class where id=(select id from student_class where English=1 and Chinese=1 and Japanese=1);

在这里插入图片描述
多行查询: 返回多行记录的子查询
1.使用 in 关键字 将要查询的字段信息定位在确定好的范围内进行查询
not in 与其相反 查询不在该范围内的信息 相当于反向查询

例如:查询没有选英语课的学生的信息,使用in 关键字 将要查询的条件 id 设定在 English =0 的 若干个id 中进行查询

select *from student_class where id in(select id from student_class where English=0);

在这里插入图片描述
not in 查询三门课没有全选的学生的信息:

select *from student_class where id not in(select id from student_class where English=1 and Chinese=1 and Japanese=1);

在这里插入图片描述

2.使用 exists(存在) 关键字 与 in 的作用一样 not exists 与 not in 相同作用

合并查询

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

select *from student_mark where Chinese>=70 union select *from student_mark where English>80;

在这里插入图片描述
或者也可以使用or关键字:

select *from student_mark where Chinese>=70 or English>=80;

在这里插入图片描述
union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行
例如:查询语文大于70的和英语大于80的情况

select *from student_mark where Chinese>=70 union all select *from student_mark where English>80;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值