博客
关于我
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/

    你可能感兴趣的文章
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
    查看>>
    myeclipse配置springmvc教程
    查看>>
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>
    MySQL
    查看>>
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>