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  
    

      

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

  • 相关阅读:
    自定义cell
    微信界面
    设置字体阴影
    Xcode 7新特性Lightweight Generics 轻量级泛型与__kindof修饰符
    @synchronized 是递归锁,类似NSRecursiveLock,递归调用不会引起死锁,而NSLock是非递归锁。
    Your build settings specify a provisioning profile with the UUID, no provisioning profile was
    NSOperationQueue与GCD
    Objective-C中继承和类别的比较:category&Inherit
    iOS 事件处理机制与图像渲染过程
    [iOS]用instancetype代替id作返回类型有什么好处?(转)
  • 原文地址:https://www.cnblogs.com/bzbz/p/13812587.html
Copyright © 2011-2022 走看看