SQL基础 四
关键词:SUM , MAX,MIN,AVG,DISTINCT,GROUP BY
今天我将继续介绍SQL命令类型中的数据查询语言(DQL),将介绍如何把查询的数据划分为组来提高可读性。
COUNT函数
count函数用于统计不包含NULL值的记录或字段,它可以与DISTINCT命令一起使用,从而统计数据集里不同的记录数量。count(*)会统计表里的全部记录数量,包括重复的,也不管是否包含NULL值。
例:统计不同姓名的学生的个数。
select count(ditinct vchStuName)
from t_stuinfo
注意:DISTINCT命令不能与COUNT(*)一起使用。
SUM函数
SUM函数返回一组记录中某一个字段值的总和。它也可以与DISTINCT一起使用,这时只会计算不同记录之和。
例:计算不同学费的总和。
select SUM(ditinct intCost)
from t_stuinfo
注意:sum函数只处理数值型,不能用于其他类型。
AVG函数
AVG函数可以计算一组指定记录的平均值。与DISTINCT一起使用时,它返回不重复记录的平均值。
例:返回不同薪水的平均值。
select AVG(distinct salary)
from t_employee
count函数使用一对圆括号来指定目标字段,或是一个星号表示表里的全部记录。
例:查询课程号为8023成绩大于90的人数。
select count(*)
from t_selcourse
where flo_grade > 90;
使用字段别名
当我们进行查询操作时,我们会看到查询结果的第一行分别显示了字段名,如果我们不想看字段名,因为他太抽象了,而是想看汉字什么的,那这时就要用到字段别名了。
select column_name alias_name
from table_name
例:查询全部学生姓名,并用姓名替换字段名
select stuname 姓名
from t_stuinfo
MAX与MIN函数
MAX函数返回记录中某个字段的最大值,MIN函数返回记录中某个字段的最小值。
例:查看成绩编号为8010的课程的最高(最低)成绩。
select max(floGrade)或min(floGrade)
from course
GROUP BY子句
GROUP BY 子句与SELECT语句配合,可以把相同的数据划分为组。所谓的分组就是把一个数据集划分为若干个小区域。GROUP BY子句在WHERE子句之后,在ORDER BY之前。
例1:获取1203班学生不同籍贯的人数
select vchCity , count(*)
from t_stuInfo
group by varCity;
例2:获取数据库中每种动物的数量
SELECT species, COUNT(*)
FROM pet
GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+
例3:每中性别的动物数量:
SELECT sex, COUNT(*)
FROM pet
GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL | 1 |
| f | 4 |
| m | 4 |
+------+----------+
(在这个输出中,NULL表示“未知性别”。)
例4:按种类和性别组合的动物数量:
SELECT species, sex, COUNT(*)
FROM pet
GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL | 1 |
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+
例5:只查询猫狗的性别的数量。
SELECT species, sex, COUNT(*)
FROM pet
WHERE species = "dog" OR species = "cat"
GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
+---------+------+----------+
HAVING 子句
having 子句在SELECT语句里与group by子句联合使用时,可以告诉group by子句在输出力包含哪些分组。having子句往往位于group by子句的后面,order by子句的前面。
GROUP BY 、 ORDER BY 、 HAVING
GROUP BY 与 ORDER BY 的相同之处在于它们都是对数据进行排序,ORDER BY子句专门用于对查询得到的数据进行排序,GROUP BY子句也把查询得到的数据排序为适当分组数据。两者的区别是:order by 可以理解为行的排序,order by 后面必须列出排序的字段名。GROUP BY 是分组的意思,必须和“聚合函数”配合使用。当我们用GROUP BY进行分组后,如何对分组进行筛选呢?having就是解决这个问题的,假如要求平均价格在3.0以上的水果。如果我们使用下面的语句是否会成功呢?
select vch_fruitName,avg(flo_price) from t_fruit where avg(flo_price)>=3
答案是否定的,因为where里不能使用聚合函数,这样子你就知道having的用处了吧!
正确写法:select vch_fruitName , avg(flo_price) from t_fruit group by name having avg(flo_price);
注意:GROUP BY 子句可用于 CREATE VIEW 语句里进行排序,而ORDER BY子句不行!!
例:查询除了石家庄之外,所有城市的平均工作小时和薪水,并且薪水超过20000的分组,结果按CITY进行分组,并按平均薪水进行降序排序。
select city , avg(flo_workTime) , avg(salary)
from t_pay
where city != '石家庄'
group by city
having avg(salary) > 2000
order by avg(salary) DESC;
OK,经过四篇文章的学习,你是否已经掌握了SQL的基础知识了呢,希望你能再从中有所收获。再见...
尊重原创,写博不易,转载请注