博客
关于我
09_MySQL笔记-组函数-GROUP BY-LIMIT-多表连接查询-子查询-UNION-索引-视图-存储过程
阅读量:791 次
发布时间:2019-03-25

本文共 3198 字,大约阅读时间需要 10 分钟。

组函数

组函数,又称聚集函数(aggregation function),它在一个行的集合(一组行)上进行操作,对每个组给一个结果。常用的组函数包括:

  • AVG([DISTINCT] expr):求平均值
  • COUNT({*|[DISTINCT] } expr):统计行的数量
  • MAX([DISTINCT] expr):求最大值
  • MIN([DISTINCT] expr):求最小值
  • SUM([DISTINCT] expr):求累加和

默认情况下,组函数忽略列值为null的行,不把它们拿来参与计算。

COUNT函数

count(*):返回表中满足where条件的行的数量。例1:有多少球员住在Stratford?

SELECT count(*) FROM players WHERE town='Stratford';

count(列):返回列值非空的行的数量。例3:一共有多少个联盟会员号码?

SELECT count(leagueno) FROM players;

count(distinct 列):返回列值非空的、并且列值不重复的行的数量。例4:查询球员所居住的城市的数量

SELECT count(DISTINCT town) FROM players;

组函数的参数也可以是函数表达式。例5:得到出现在penalties表中的不同年份的数量

SELECT count(DISTINCT year(payment_date)) FROM penalties;

一个SELECT子句中可出现多个聚集函数。例6:得到球员居住城市的数量和性别的数量

SELECT count(DISTINCT town), count(DISTINCT sex) FROM players;

GROUP BY

GROUP BY子句用于对数据进行分组。GROUP BY后面出现过的字段才能出现在SELECT中,未出现的字段则不能作为聚合函数使用。

示例

例1:查询每个城市的名称和球员的数量

SELECT town, count(*) FROM players GROUP BY town;

加条件:找出城市超过三个人的城市

SELECT town, count(*) FROM players GROUP BY town HAVING count(*) > 3;

例2:对于每个球队,得到编号、参加比赛的数量以及赢得的局数

SELECT teamno, count(*), sum(won) FROM matches GROUP BY teamno;

GROUP BY规则

  • GROUP BY后面的字段必须在SELECT中出现。
  • GROUP BY可以与HAVING搭配,用来对分组结果进行过滤。
  • GROUP_CONCAT()函数

    GROUP_CONCAT()是MySQL特有的组函数,返回一组指定列的所有值,按字符串拼接的形式排列。例8:对于每个球队,得到其编号和所有球员的编号

    SELECT teamno, group_concat(playerno) FROM matches GROUP BY teamno;

    例9:查询同一城市的球员名字和城市名、数量

    SELECT town, group_concat(name), count(name) FROM players GROUP BY town;

    HAVING子句

    HAVING子句专门用来对GROUP BY的结果进行过滤,常用于对分组后的数据条件筛选。

    示例

    例1:得到那些多于一次罚款的球员的编号

    SELECT playerno FROM penalties GROUP BY playerno HAVING count(*) > 1;

    例2:对于罚款总额大于150元的球员,得到编号和罚款额

    SELECT playerno, sum(amount) FROM penalties GROUP BY playerno HAVING sum(amount) > 150;

    LIMIT

    LIMIT子句用于限制从查询结果中获取的行数,可以带偏移量。

    语法

    LIMIT [offset,] rows [ OFFSET offset_name | OFFSET OFFSET expression ] [ ROWS ] ;

    示例

    例1:获取编号最大的前4个球员的编号和名字

    SELECT playerno, name FROM players ORDER BY playerno DESC LIMIT 4;

    例2:带偏移量的limit,跳过前几行后再取

    SELECT playerno, name FROM players ORDER BY playerno ASC LIMIT 3,5;

    多表连接查询

    多表连接查询通过JOIN、UNION等方式将多个表的数据合并。

    JOIN类型

  • 内连接(INNER JOIN):只返回满足条件的行。
  • 外连接(OUTER JOIN):返回左表中的所有行,右表中满足条件的行。
  • 示例

    例6:查询每场比赛的编号、球员编号、球队编号、球员的名字以及球队的分级

    SELECT m.matchno, m.playerno, m.teamno, p.name, t.division FROM matches m, players p, teams t WHERE m.playerno = p.playerno AND m.teamno = t.teamno;

    UNION

    UNION用于将多个SELECT语句的结果合并,默认去除重复行。例1:得到那些有罚款或者担任队长的球员的编号

    SELECT playerno FROM teams UNION SELECT playerno FROM penalties;

    子查询

    子查询(inner query)先执行,然后外部查询(outer query)使用子查询结果。

    示例

    例1:得到1号球队的队长的编号和姓名

    SELECT playerno, name FROM players WHERE playerno = (SELECT playerno FROM teams WHERE teamno=1);

    示例二:查询编号小于60的球员的加入年份与104号球员的对比

    SELECT playerno, joined - (SELECT joined FROM players WHERE playerno=104) FROM players WHERE playerno < 60;

    行子查询

    返回的结果集是1行多列,适用于比较操作符。

    列子查询

    返回的结果集是多行1列,适用于ANY和ALL操作符。

    表子查询

    返回的结果集是多行多列,适用于IN操作符。

    视图

    视图是一个逻辑表,基于真实表执行查询。视图可以用于共享结果或简化复杂查询。

    示例

    例1:创建一个视图,包含具有联盟会员号码的球员

    CREATE VIEW cplayers AS SELECT playerno, leagueno FROM players WHERE leagueno IS NOT NULL;SELECT playerno FROM cplayers WHERE leagueno > 5000;

    存储过程

    存储过程是一段可执行的代码,可以受存储过程编写者调用。

    示例

    例1:创建一个存储过程,用于删除给定球员参加的所有比赛

    DELIMITER $$ CREATE PROCEDURE delete_matches(IN p_playerno INTEGER) BEGIN DELETE FROM matches WHERE playerno = p_playerno; END $$ DELIMITER ;

    转载地址:http://xjtuk.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(70)——MySQL 优化实施方案
    查看>>
    Mysql学习总结(71)——MySQL 重复记录查询与删除总结
    查看>>
    Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
    查看>>
    Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
    查看>>
    Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
    查看>>
    Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
    查看>>
    Mysql学习总结(78)——MySQL各版本差异整理
    查看>>
    Mysql学习总结(79)——MySQL常用函数总结
    查看>>
    Mysql学习总结(7)——MySql索引原理与使用大全
    查看>>
    Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
    查看>>
    Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
    查看>>
    Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
    查看>>
    Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
    查看>>
    Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
    查看>>
    Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
    查看>>
    Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
    查看>>
    Mysql学习总结(9)——MySql视图原理讲解与使用大全
    查看>>
    MySQL学习笔记十七:复制特性
    查看>>
    Mysql学习第一课-mysql的定义及sql语句
    查看>>
    mysql安全模式: sql_safe_updates
    查看>>