zoukankan      html  css  js  c++  java
  • mysql中sum和count的区别

    sum()函数和count()函数的区别

    其实两者很好容易区分,sum,即求和,多个列相加的和; count计数,一共有多少条数据

    sum()函数求累加; 对符合条件的记录的数值列求和;

    count()函数求个数; 对查询中符合条件的结果(或记录)的个数

    数据库中对空值的处理:sum()不计算,count()认为没有此项;

    可以使用 IfNull(cloumn,0)对空值处理

    sum()函数相加时,如果有一列的值为null,则结果为null
    页面数据字段显示为null, 数据库中默认为null, 怎么处理显示问题?

    1. 修改数据库, 默认为null改为empty String 或者 "",但这种方式对于新增的数据有效,对于已存在的数据无效, 这种在创建数据库时最好设置好

    2. 后台查询时sql语句修改, 如果是varchar类型的,则 IFNULL(column,""),若是int类型,则IFNULL(colum,0),这样既可以修改显示, (推荐)

    3. jsp页面做判断, 做为null处理

    4. 后台写个方法,循环遍历做为null处理(不建议,数据量大时,效率低)
    数据库版本问题对group by函数的影响

    select 选取分组中的列+聚合函数 from 表名称 group by 分组的列

    从语法格式来看,是先有分组,再确定检索的列,检索的列只能在参加分组的列中选。

    所以问题中的,group by 后的 a,b,c是先确定的。select后的a,b,c才是可以变的。即

    以下语句都是正确的:

    select a,b,c from table_name group by a,b,c,d;

    select a,b from table_name group by a,b,c;

    select a,max(a) from table_name group by a,b,c;

    以下语句则是错误的:

    select a,b,c from table_name group by a,b;

    select a,b,c from table_name group by a;

    而因为MySQL的强大,它兼容了这个错误!!!

    但是在DOS是不能的。所以出现了DOS下报错,而在MySQL中能够查找的情况(其实这个查找的结果是不对的)。(MySQL5.5能够兼容,5.7不能兼容)

    this is incompatible with sql_mode=only_full_group_by

    看一下ONLY_FULL_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,也就是说查出来的列必须在group by后面出现否则就会报错,或者这个字段出现在聚合函数里面。

    例如,但是在5.5中可以正常运行,但是在5.7就不行

        select id,name,age,sex from user group by sex (yes)
        select id,name,age from user group by sex

    解决方式:

    一:在sql查询语句中不需要group by的字段上使用any_value()函数

    这种对于已经开发了不少功能的项目不太合适,毕竟要把原来的sql都给修改一遍

     

    3.1. 二:修改my.cnf(windows下是my.ini)配置文件,删掉only_full_group_by这一项

    若我们项目的mysql安装在ubuntu上面,找到这个文件打开一看,里面并没有sql_mode这一配置项,想删都没得删。

    当然,还有别的办法,打开mysql命令行,执行命令

    1 select @@sql_mode;

    这样就可以查出sql_mode的值,复制这个值,在my.cnf中添加配置项(把查询到的值删掉only_full_group_by这个选项,其他的都复制过去):

    1 sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;

    如果 [mysqld] 这行被注释掉的话记得要打开注释。然后重重启mysql服务

    注:使用命令

    1 set sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    这样可以修改一个会话中的配置项,在其他会话中是不生效的。

    注:以上情况为操作数据库配置解决问题,如果项目已经运行一段时间后(除非刚搭好框架,刚开始运行),不建议修改数据库配置,可以修改代码

    group by()的字段和要查询的字段一致,或者少于group by后的字段

  • 相关阅读:
    [linux内存]伙伴系统学习笔记(二)--内存系统初始化
    [linux内存]伙伴系统学习笔记(一)——概念
    Android 快速开发框架Afinal
    微信公众平台搭建
    Web Eclipse不识别HttpServlet
    Android 监听来电和去电状态
    Android 监听程序的安装和卸载
    Android 被忽略的UI检视利器:Hierarchy Viewer .
    Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
    Android 系统手机端抓包方法
  • 原文地址:https://www.cnblogs.com/interdrp/p/15778336.html
Copyright © 2011-2022 走看看