本文共 3198 字,大约阅读时间需要 10 分钟。
组函数,又称聚集函数(aggregation function),它在一个行的集合(一组行)上进行操作,对每个组给一个结果。常用的组函数包括:
AVG([DISTINCT] expr)
:求平均值COUNT({*|[DISTINCT] } expr)
:统计行的数量MAX([DISTINCT] expr)
:求最大值MIN([DISTINCT] expr)
:求最小值SUM([DISTINCT] expr)
:求累加和默认情况下,组函数忽略列值为null的行,不把它们拿来参与计算。
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后面出现过的字段才能出现在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_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子句专门用来对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 [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等方式将多个表的数据合并。
例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用于将多个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/