zoukankan      html  css  js  c++  java
  • MySQL中的函数使用

    有三张表,学生表(t_student),班级表(t_class),成绩表(t_grade),三张表的字段设计如下

                                          

    查询大竹峰班级里语文成绩前三名的女同学的id,姓名,班级,语文成绩:
    SELECT
           t_student.id,
           t_student.sname,
           t_student.sex,
           t_class.cname,
           t_grade.chinese
    FROM
           t_student
    JOIN t_class ON t_class.id = t_student.cid
    JOIN t_grade ON t_grade.sid = t_student.id
    WHERE
           t_student.sex = '女'
    AND t_class.cname = '大竹峰'
    ORDER BY
           t_grade.chinese DESC
    LIMIT 3  

    聚合函数

    1、求和:sum()

    2、平均值:avg()

    3、计数:count()

    4、最大:max()

    5、最小:min()

    聚合函数特点:

        ①每个组函数接收一个参数(字段名或者表达式) 统计结果中默认忽略字段为NULL的记录

       ②要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。

       ③不允许出现嵌套,比如sum(max(xx))

    求学生表中最大年龄,最小年龄,年龄的平均值,年龄之和:
    select max(age),min(age),avg(age),sum(age) from t_student;  
    查询学生表有多少条数据:
    select count(*) from t_student;
    

     count()在计算某一字段有多少行的时候,可能会不准确,因为为空的时候(null值),count()不会计算进去,所以一般要计算有多少行的时候,都是用的*代替,一行里边不可能所有数据都是空的嘛! 

        avg()在计算的时候,也不会考虑为空的时候

    分组:分组必须和聚合函数配合使用,不然会出问题,但是聚合函数可以简单的单独使用(即查询表中某一字段时可以单独使用)

    分组的时候会改变原来的表结构,所以不能再继续用select * 了,修改:以什么字段进行分组,这个字段就不能和聚合函数使用了,别的字段要查询出来都要和聚合函数配合使用

    统计不同地区的人男女人数情况:
    SELECT
    	sex,
    	address,
    	count(*)
    FROM
    	t_student
    GROUP BY
    	sex,
    	address;  
    统计每个班级的男女成绩的平均分:
    SELECT
    	a.sex,
    	b.cname,
    	avg(c.chinese + c.math + c.english) pjf
    FROM
    	t_student a
    JOIN t_class b ON a.cid = b.id
    JOIN t_grade c ON c.sid = a.id
    GROUP BY
    	a.sex,
    	b.cname;  

    起别名,可以对表,字段起别名,起了别名之后,就只能用别名了,不能再用原表名,原字段名

    起别名,关键字as,as可以省略不写

    统计每个班级的男女成绩的平均分,北京的人不纳入统计:
    SELECT
    	a.sex,
    	b.cname,
    	avg(c.chinese + c.math + c.english) pjf
    FROM
    	t_student a
    JOIN t_class b ON a.cid = b.id
    JOIN t_grade c ON c.sid = a.id
    where a.address!='北京'
    GROUP BY
    	a.sex,
    	b.cname;
    

     

    统计每个班级的男女成绩的平均分,北京的人不纳入统计,并且不显示平均分低于320分的:
    SELECT
    	a.sex,
    	b.cname,
    	avg(c.chinese + c.math + c.english) pjf
    FROM
    	t_student a
    JOIN t_class b ON a.cid = b.id
    JOIN t_grade c ON c.sid = a.id
    WHERE
    	a.address != '北京'
    GROUP BY
    	a.sex,
    	b.cname
    HAVING
    	pjf >= 320  

    分析:此处只需要再来一个查询条件即可,但是pjf这个值其实是分组后聚合函数的使用得出的结果

    having和where作用和用法一致,但是where是对分组前的数据的查询,having是对分组后的数据做查询 

    统计每个班级的男女成绩的平均分,北京的人不纳入统计,并且不显示平均分低于320分的,并且只显示成绩最高的两条数据:
    SELECT        
                a.sex,
                b.cname,
                avg(c.chinese + c.math + c.english) pjf
    FROM
    	t_student a
    JOIN t_class b ON a.cid = b.id
    JOIN t_grade c ON c.sid = a.id
    WHERE
    	a.address != '北京'
    GROUP BY
    	a.sex,
    	b.cname
    HAVING
    	pjf >= 320
    ORDER BY
    	pjf DESC
    LIMIT 2  
    

      

    注意:这些顺序是固定的,可以不写,但是顺序不能改变

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/bzbz/p/13812587.html
Copyright © 2011-2022 走看看