Mysql GROUP BY 排除null数据

最近在Mysql发现一个问题,当我们如果使用GROUP BY如果出现NULL值,MYSQL会怎样处理。而且如果我需要把每个NULL值都打印出来而不是分组,那该怎么办?

下面我们做个试验:

    CREATE TABLE IF NOT EXISTS A(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10)) ;  
    CREATE TABLE IF NOT EXISTS B(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10) ,aid INT NOT NULL) ;  
      
    INSERT INTO A(NAME) VALUES('a') ;  
    INSERT INTO A(NAME) VALUES('a') ;  
    INSERT INTO A(NAME) VALUES('a') ;  
    INSERT INTO A(NAME) VALUES('a') ;  
    INSERT INTO A(NAME) VALUES('b') ;  
    INSERT INTO A(NAME) VALUES('b') ;  
    INSERT INTO A(NAME) VALUES('a') ;  
    INSERT INTO A(NAME) VALUES('a') ;  
    INSERT INTO A(NAME) VALUES('b') ;  
    INSERT INTO A(NAME) VALUES('a') ;  
    INSERT INTO A(NAME) VALUES('b') ;  
    INSERT INTO A(NAME) VALUES('a') ;  
      
    INSERT INTO B(NAME ,aid) VALUES('d' , 3) ;  
    INSERT INTO B(NAME ,aid) VALUES('f' , 5) ;  
    INSERT INTO B(NAME ,aid) VALUES('f' , 6) ;  
    INSERT INTO B(NAME ,aid) VALUES('f' , 7) ;  
    INSERT INTO B(NAME ,aid) VALUES('d' , 8) ;  

结果:
在这里插入图片描述在这里插入图片描述

我们用GROUP BY 在A表查询,以name作为分组,比如:

SELECT a.name FROM A GROUP BY a.name ;

结果:
在这里插入图片描述

然后我们使用连接查询:

    SELECT a.id ,a.name ,b.name FROM A a   
    LEFT JOIN B b  
    ON(a.id = b.aid) ;  

结果:
在这里插入图片描述

但我们现在需要用GROUP对上面的进行查询:

    SELECT a.id ,a.name ,b.name FROM A a   
    LEFT JOIN B b  
    ON(a.id = b.aid) GROUP BY b.name;  

结果
在这里插入图片描述
从上面可以看出,当group by这列有null值时,group会把他们当成是同一个直接聚合。

但我现在需要把b.name=NULL的情况都查询出来,而不是聚合,那么怎么办?

后来在网上:http://stackoverflow.com/questions/4588935/group-by-do-not-group-null找到了方法。

我们可以使用一个UUID来对null值进行转换,这样每个b.name=null的行都会被查询出来而不是被分到同一组。

对于UUID我们可以查询MYSQL的技术文档http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

下面来尝试下:

#--增加一个UUID(),把b.name的NULL的值都转化为具有专一性的uuid,这样每个b.name都会不同,GROUP就不会对他们进行分组  
    SELECT a.id ,a.name ,b.name FROM A a   
    LEFT JOIN B b  
    ON(a.id = b.aid)   
    GROUP BY IFNULL(b.name,UUID());  

运行结果:

在这里插入图片描述

这样可以实现Mysql Group by NULL值。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果要排除分组后存在的 NULL 数据,可以在 SQL 语句中使用 IS NOT NULL 运算符。 例如: ``` SELECT column1, SUM(column2) FROM table_name WHERE column1 IS NOT NULL GROUP BY column1; ``` 这将确保在分组时不包括任何 NULL 值,因为它们不满足 IS NOT NULL 的条件。 ### 回答2: 在使用MySQL进行分组操作时,遇到分组后存在null数据的情况,可以通过在查询语句中添加条件来排除这些数据。 常见的方法有两种: 1. 使用HAVING子句:在查询语句的末尾添加HAVING子句,并在其中指定排除null数据的条件。例如,假设有一个名为score的列,我们只想统计非null值的分组结果,可以使用以下语句: ``` SELECT column1, column2, COUNT(score) FROM table GROUP BY column1, column2 HAVING score IS NOT NULL; ``` 这样就能排除分组后score为null数据。 2. 使用WHERE子句:如果想要排除null数据,也可以在WHERE子句中添加条件来实现。例如,假设有一个名为score的列,我们只想统计非null值的分组结果,可以使用以下语句: ``` SELECT column1, column2, COUNT(score) FROM table WHERE score IS NOT NULL GROUP BY column1, column2; ``` 这样就能排除分组前score为null数据。 无论是使用HAVING子句还是WHERE子句,都能达到排除null数据的效果,具体选择哪种方法取决于需求和语句的结构。通过添加条件来排除null数据,能够提高分组的准确性和结果的可靠性。 ### 回答3: 在MySQL中,如果存在NULL数据,在进行分组操作时,可以使用GROUP BY子句结合HAVING子句来排除NULL数据。 首先,使用GROUP BY子句根据某个列进行分组,将相同值的数据进行分组。然后,使用HAVING子句来对分组后的数据进行筛选,排除包含NULL值的分组。 具体操作如下: SELECT 列1, 列2, ... FROM 表名 GROUP BY 列1, 列2, ... HAVING 列1 IS NOT NULL 上述语句中的列1和列2是指要进行分组操作的列名,可以根据实际情况进行修改。 使用上述语句,将排除包含NULL值的分组,只返回分组后的非NULL数据。 举个例子,假设有一个表名为students,包含两列:name和score。现在要根据name进行分组排除包含NULL值的分组,可以使用以下语句: SELECT name, AVG(score) as avg_score FROM students GROUP BY name HAVING name IS NOT NULL 上述语句将根据name列进行分组,计算每个分组的平均分数(使用AVG函数),并排除包含NULL值的分组。最终返回每个分组的name和平均分数。 总结:通过使用GROUP BY子句和HAVING子句,可以在MySQL排除分组后存在NULL数据的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值