初识MySQL(4)聚集函数,分组数据,子查询,分组查询

1.聚集函数

聚集函数其实就是一种函数的使用方式,用来进行一些比较高级的数据操作,使用起来也比较简单,我们就先举几个例子,并对他们进行解释分析即可。

SELECT  AVG(age) AS avg_age FROM TABLE1; 

以上语句使用了AVG()函数来求平均值,得到的结果就是查找出表中所有年龄的平均值并且起一个新的列名为avg_age。

SELECT COUNT(e_mail) AS num_email FROM TABLE1;

以上语句使用COUNT()函数来达到计数的功能,即计算e_mail的数量,并起一个新的列名为num_email。

SELECT MAX(price) FROM max_price FROM TABLE1;

使用MAX()函数来求一个列中的最大值。MIN()函数同理求最小值。

SELECT SUM(score) AS sum_score FROM TABLE1;

使用SUM()函数进行求和操作,计算成绩的总和。

2.分组数据

我们之前学的where过滤数据与使用聚集函数得到一些更复杂的数据结论都是建立在对整张表的查询上的。但是,当我们需要统计每个公司的员工数量这种要分公司,分组来进行统计处理的操作时,我们已知的操作就显得捉襟见肘。因此我们引入了分组的概念与GROUP BY语句。

SELECT company,COUNT(id) AS num_workers FROM TABLE1 GROUP BY company;

以上的语句就实现了根据公司分组来统计每个公司中员工的数量。

而接下来我们就会想到,分组完成之后,我们如果并不需要得到所有分组的结果或者分组的数量过多,我们只需要查看其中的一部分分组的话,我们就需要过滤分组这个操作,完成这个操作WHERE语句已经不能满足我们了,我们需要引入HAVING语句。
其实也可以理解为WHERE用来过滤行,HAVING用来过滤分组!
也就是说WHERE语句都可以用HAVING进行替换,这种情况下就是将每一行看作一个分组。
我们先看一个例子:

SELECT id,COUNT(*) AS orders FROM orders GROUP BY id HAVING COUNT(*) >= 2;

我们先看HAVING之前的语句,很显然就是将每一个id进行分组,并查询出每个id的数量,然后HAVING来进行对这些id分组的筛选和过滤,即只保留下那些数量比2要大的分组。
从这也可以看出HAVING对于分组的筛选模式和WHERE对于行的筛选模式其实差不多的。

GROUP BY 和 ORDER BY的对比:

GROUP BY ORDER BY
分组行,但可能输出的不是分组的顺序 排序产生的输出
只可能使用选择列,而且必须使用每一个选择的列 任意列都可以使用,什么非选择的列
如果与聚集函数一起使用列,则必须使用 不一定必须使用

ORDER BY语句是保证结果有序排列的唯一正确的语句,不能仅仅依赖GROUP BY想要实现分组的有序排列。

3.子查询

SELECT num FROM TABLE1 WHERE thing = 'TNT2'
SELECT id FROM TABLE2 WHERE num IN (20005,20007);

以上两个单独的语句,第一个语句表示从TABLE1中查询出id是TNT2的num,第二个语句表示的是从TABLE2中查询出num在20005到20007中的id。
现在如果需要列出订购TNT2的所有用户的id,就需要用到两个查询的结合,即先查询出所有订购TNT2的用户的num(结果为20005和20007),在通过num在领一张表中去查询id。
这个时候我们就可以用到一下包含子查询的语句来一次性达到我们的查找要求:

SELECT id FROM TABLE2 WHERE num IN (SELECT num from TABLE1 WHERE thing = 'TNT2');

其含义很好理解。

4.组合查询

之前我们学过的所有SQL语句都是单句的SELECT构成的,当我们需要一次性返回两个SELECT查找的内容的时候,我们就需要使用到UNION关键字,使用方式比较简单,就是在两个独立的SELECT语句之间使用UNION进行连接,请看下面的例子:

SELECT id FROM products WHERE prince <=5
UNION
SELECT id FROM products WHERE id IN (1001,1002);

这就是返回两个SELECT语句查询的内容。
值得注意的是,如果第一个SELECT语句返回的结果有4行,第二个语句返回的结果是5行,这其中很有可能包含重复的行,使用UNION联结两个查询语句的时候会自动帮我们取消掉重复的行,但是当我们需要返回所有的行,即包括重复的行我们也要返回的时候我们可以使用UNION ALL关键字来连接两个语句,这样就不会帮我们自动取消重复行了。

而对于使用组合查询的结果进行排序,ORDER BY语句只能出现在最后,而且只能出现一次,不存在对于一种结果集有两种排序的方式。

发布了12 篇原创文章 · 获赞 0 · 访问量 240

猜你喜欢

转载自blog.csdn.net/weixin_41902922/article/details/104074062
今日推荐