当前位置:   article > 正文

【MYSQL笔记】分组计算&多表查询_mysql分组计算

mysql分组计算

分组显示

 

select 列名 from 表名 group by 用于分组的列名

分组后的处理对象是“同一组的所有记录”

例:id,sales,month

根据员工id分组,并显示每位员工的总销售额

  1. select id,sum(sales) as 合计
  2. from tb
  3. group by id

 根据员工id分组,并计算每组销售额的平均值

  1. select id,avg(sales) from tb
  2. group by id;

 设置条件分组显示

select 统计列 from 表名 by 分组列 having 条件

用于提取记录的having是在分组之后执行的 

例:按员工id分组计算总销售额,仅显示小组总销售额大于等于200万元的记录

  1. select id,sum(sales) from tb
  2. group by id
  3. having sum(sales)>=200;

如果提取记录后分组:

例:仅提取销售额大于等于50万元的记录,并以该记录为对象计算各员工的平均销售额

  1. select id,avg(sales)
  2. from tb where sales>=50
  3. group by id;

如果 分组后排序:

例:将各员工的平均销售额按从高到底的顺序显示

  1. select id,avg(sales)
  2. from tb
  3. group by id
  4. order by avg(sales) desc;//先分组后排序

记住顺序:where->group by->order by (desc)

使用多个表:

示例表:

 从多个表取出记录汇总到一起显示

select 列表1 from 表名1 union select 列名2 from 表名2;

如果合并相同列结构的两个表

  1. select *from tb1
  2. union
  3. select *
  4. from tb2;

 按条件合并多条提取结果进行显示:

在各个命令的最后加上where条件

例:将tb中销售额大于等于200万元的员工号,表tb1中年龄大于等于35岁的老员工的员工号(满足任意一个即可)合并起来

  1. (select id from tb where sales>=200)
  2. union
  3. (select id from tb1 where age>=35);

执行该语句时会自动执行“消除重复记录”的操作。如果对大量记录执行“消除重复”的操作,就会产生的一定的等待时间。

消除重复:

  1. (select id from tb where sales>=200)
  2. union all
  3. (select id from tb1 where age>=35);
  4. //在union后加上all允许重复

连接多个表并显示(内连接):

将多个表通过某个连接键连接在一起的处理称为“连接”。使用join连接两个表

  1. select 列名 from1
  2. join 要连接的表2
  3. on1的列=2的列

选择列进行显示:把列名写成“表名.列名”。

只显示id,name,sales

  1. select tb.id,tb1.name,tb.sales from tb
  2. join tb1
  3. on tb.id=tb1.id;

给表添加别名:

select *from tb as x;

 显示列名可以写成“别名.列名”,可以化简书写

例:tb表别名为x,tb1表别名为y,显示tb中的id和sales,以及tb1中的姓名

思路:将tb的列id与tb1的列id相匹配的记录进行连接,然后显示表tb的列id,表tb1,的列name和表tb的列sales。这些处理在给表tb添加别名"x",给表tb1添加别名“y”的前提下进行。

  1. select x.id,y.name,x.sales
  2. from tb as x
  3. join tb1 as y
  4. on x.id=y.id;

 使用using 使on 的部分更容易阅读

当作为连接键的两个列名相同,可以用using化简

  1. select x.id,y.name,x.sales
  2. from tb as x
  3. join tb1 as y
  4. using(id);

通过where设置条件从连接表中提取记录

在最后加上where条件。列名要按照“表名.列名”(或者别名.列名)进行书写。

例:将tb的中的销售额大于等于100万元的优秀成绩为对象的id,sales,连同tb1中的姓名合并显示处来。

思路:根据id将表tb和表tb1进行连接,显示表tb的列sales中值大于等于100的记录。显示列id,列name,列sales,并给它们分别加上别名“员工号”,“姓名”,“销售额”

  1. select tb.id as 员工号,tb1.name as 姓名,tb.sales as 销售额
  2. from tb join tb1
  3. using(id)
  4. where tb.sales>=100

提取多个表中的记录

  1. select ~ from tb
  2. join tb1 连接条件(on或者using)
  3. join tb2 连接条件
  4. join tb3 连接条件
  5. ...;

例:连接销售信息表tb,员工信息表tb1,员工出生地表tb3,显示员工号(tb.id),销售额(tb.sales),姓名(tb1.name),出生地(tb3.religion)。

  1. select tb.id,tb.sales,tb1.name,tb3.region
  2. from tb
  3. join tb1 using(id)
  4. join tb3 using(id);

显示多个表的所有记录(外连接

使用join的内连接只会提取与连接键相匹配的记录,即共有的记录。如果要显示不是共有的记录,就需要使用外连接。

即使与连接键不匹配,外连接也会提取另一个表中的所有记录。

外连接的种类:

select from 表1 join 表2

左外连接:显示相匹配的记录和表1的全部记录

右外连接:显示相匹配的记录和表2的全部记录

使用左外连接

  1. select 列名
  2. from1
  3. left join 要连接的表2
  4. on1的列=2的列

 例:将id作为连接键,使用左外连接显示表tb和表tb1相匹配的记录,以及表tb的所有记录。但是仅显示表tb的列id,和tb1的列name

  1. select tb.id,tb1.name
  2. from tb
  3. left join tb1
  4. using(id);

如果tb中的id在tb1中没有记录,那么name显示为null

使用右外连接:

  1. select 列名 from1
  2. right join 要连接的表2
  3. on1的列=2的列;

例:以id为键,使用右外连接显示表tb和表tb1相匹配的记录,以及表tb1的所有即。仅显示表tb的列id和表tb1的列name

  1. select tb.id,tb1.name
  2. from tb
  3. right join
  4. tb1
  5. using(id);

 混合使用左外连接和右外连接可能会导致日后发生错误。

注:left join 可以写成left outer join 。同样,right join 可以写成right outer join 

自连接:

将表与其自身,也就是和同名的表进行连接。为了区分不同的列,连接时必须起别名

  1. select 列名 from 表名 as 别名1
  2. join 表名 as 别名2;

例:对员工信息tb1进行自连接,并把所有的列显示出来

  1. select * from tb1
  2. as a
  3. join tb1
  4. as b;

 由于表tb1是和不同名的自身进行连接,所以自身拥有的所有记录将与自身拥有的所有记录进行连接(n*n)

自连接的作用:

自连接会包含所有的组合。可以通过筛选设置条件选出想要的内容?

子查询:

执行查询(子查询),然后使用检索到的记录进一步执行查询。

例如,在第一阶段提取“销售额大于等于200万元的员工号”,然后在第二阶段中进行“从提取出来的员工号中提取相对应的姓名”。第一阶段的查询叫做子查询

第一阶段的子查询可以返回值,列和记录等。

例:显式表tb中sales最大值的记录(返回值的子查询)

思路:在第一阶段查询中取出max(sales)的值,然后在第二阶段选择了包含了最大值列sales的记录

  1. select * from tb
  2. where sales in (select max(sales) from tb);

例;计算tb1中员工的平均年龄,并提取大于等于平均年龄的员工记录(返回值的子查询)

  1. select * from tb1
  2. where age>=(select avg(age) from tb1);

例:显式销售额大于等于200万元的员工姓名(返回列的子查询):使用in

思路:提取销售信息表tb中的销售额(sales)大于等于200的id,然后显示tb1中的姓名

  1. select * from tb1
  2. where id in
  3. (select id from tb where sales>=200);

当只有一条记录时, 使用=也无妨

子查询和内连接提取结果的差异:

子查询:

  1. select id,name
  2. from tb1
  3. where id in(select id from tb);

这里,会显示tb1中和tb id相匹配的记录

内连接:

  1. select tb1.id,tb1.name
  2. from tb1
  3. join tb
  4. on tb1.id=tb.id;

这里,会显示tb中的所有记录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/622747
推荐阅读
相关标签
  

闽ICP备14008679号