• MySQL数据库— 汇总和分组数据


    一 汇总和分组数据

    查询语句 ---> 结果集(多条数据) ---> 聚合函数  ----> 单行记录

    1.常用的聚合函数:

    sum()         数字                          对指定列中的所有非空值求总和

    avg()          数字                          对指定列中的所有非空值求平均值

    min()    数字,字符,datetime        返回指定列中的最小数字,最早的日期或者最小的字符串

    max()   数字,字符,datetime        返回指定列中的最大数字,最近的日期或者最大的字符集

    count()   任意基于行的数据类型       统计结果集合众全部记录行的数量

    例:查询玩家表中一共有多少名玩家信息

    select count (user_qq) from users

    select count(*) from users

    例:查询QQ号是12301的玩家游戏的总分数

    select sum(score) as '总分数' from scores where user_qq='12301'

    例:查询QQ号是12302玩家的评价分数

    select avg(score) as '平均分数’ from scores where user_qq='12302'

    例:查询游戏编号的1的最高分数

    select max(score) as '最高分数' from score where gno=1

    例: 查询QQ号是12302的玩家的总分数,平均分数和最高分数

    select sum(score) as '总分',avg(score) as '平均分',max(score) as '最高分' from scores where user_qq ='12302'

    2. 使用GROUP BY分组

    例:查询每个玩家的总分数,平均分数,最高分数

    select sum(score) as '总分',avg(score) as '平均分',max(score) as '最高分' from scores group by user_qq

    例: 查询每个玩家的平均分数,并显示玩家QQ号和平均分数

    select user_qq, avg(score) as '平均分数' from scores group by user_qq

    3. 筛选分组结果

      在使用GROUP BY子句时,可用HAVING子句为分组统计进一步设置统计条件,HAVING子句与GROUP BY 子句的关系相当于WHERE子句与SELECT子句之间的关系

     与WHERE子句的区别是,在HAVING子句中是以聚合函数的统计结果为筛选条件。

     例:查询平均分数大于4000的玩家QQ号,总分数,平均分数

    select user_qq, sum(score) as'总分数', avg(score) as '平均分数' from scores group by user_qq having avg(score) > 4000

    例:查询所有用户的平均分数,和总分数,并按平均分数倒序排列

    select user_qq,avg(score) as '平均分数' , sun(score) as '总分数' from scores group by user_qq orde by avg(score) desc

    4.SELECT 语句的执行顺序

         from 子句指定数据源

         where 子句基于指定的条件对记录进行筛选

         group by 子句将数据划分为多个分组

         使用聚合函数进行计算

         使用having子句筛选分组

         使用order by 子句对结果集进行排序

    二 连接查询

    1. 多表连接

    例:查询分数信息,显示玩家昵称,游戏名称和分数

    select user_name as '昵称', game as '游戏名称' , score as '分数' from users.user_qq = scores.user_qq and game.gno= scores.gno

    连接查询分为内连接和外连接两种

    内连接特点:相连接的两张表地位平等

                     如果一张表中在另一张表中不存在对应数据,则不做连接

                     from 子句后面直接出现多个表名,这种连接方式即属于内连接,是隐式内连接

                     显示内连接格式:select col_list from table1[inner] join table2 on table1.col=table2.clo1

                     例:查询分数信息,显示玩家昵称,游戏名称和分数

                     select user_name as '昵称', g_name as '游戏名称', score as '分数' from games inner join scores on games.gno =scores.gno

                     inner join users on score.user_qq=user.user_qq

                     例:查询每个玩家的昵称,总分和平均分

                        select user_name as '昵称',sum(score) as '总分',avg(score) as '平均分' from users U inner join scores S on S.user_qq = U.user_qq group by                         U.user_qq,user_name

                     例:查询平均分数大于3500的分数信息,显示玩家昵称,总分数,平均分数,并按照平均分数降序排列

                      select user_name as '昵称',sum(score) as '总分',avg(score) as '平均分' from users U inner join scores S on S.user_qq = U.user_qq group by                         U.user_qq,user_name having avg(score)>3500 order by avg(score) desc

    外连接分为左连接和右外连接

    外连接特点:做连接的两个表地位不平等,其中有一张的基础表

                     基础表中的每条数据必须出现,即使另一张表中没有数据与之匹配,也要用NULL补齐

                     左外连接时左表是基础表,右表外连接时右表是基础表

                     语句中先出现的表为'左表', 后出现的表为'右表'

    外连接格式: SELECT COL_LIST FROM TABLE1 LEFT/RIGHT[OUTER] JOIN TABLE2 ON TABLE1.COL=TABLE2.COL

     例:查询所有玩家关于5号游戏的分数信息

       select user_name as'昵称' gno as '游戏编号', score as '分数' from users U left join scores S on U.user_qq=S.user_qq and S.gno=5

  • 相关阅读:
    SQL 查询第n条到第m条的数据
    Linq 中查询一个表中指定的字段
    归并排序与逆序对
    补码拾遗
    堆排序
    It is time to cut the Gordian Knot!
    蛋疼
    [引]Microsoft Visual Studio .NET 2005 预发行版
    关于VS2005中自动生成TableAdapter的事务处理
    关于释放ASPNET进程的内存占用问题.
  • 原文地址:https://www.cnblogs.com/jly144000/p/7392029.html
Copyright © 2020-2023  润新知