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的基础知识了呢,希望你能再从中有所收获。再见...

尊重原创,写博不易,转载请注