GROUP BY - 不对 NULL 进行分组
在SQL语言中,GROUP BY是一种常用的操作,用于按照一个或多个列的值对结果进行分组。通常情况下,GROUP BY会将相同值的行分为一组,并对每组进行聚合计算。然而,在实际应用中,我们可能会遇到一些特殊情况,即某些列存在NULL值,而我们又不希望将NULL值作为一组进行分组。这时候,我们可以使用在GROUP BY中使用NULLS FIRST或NULLS LAST来控制对NULL值的处理。NULLS FIRST和NULLS LAST的区别在进行GROUP BY操作时,默认情况下,NULL值会被作为一组进行分组。但是,在某些情况下,我们可能希望将NULL值放在分组的最前面或最后面。这时候,我们可以使用NULLS FIRST或NULLS LAST来实现。NULLS FIRST表示将NULL值放在分组的最前面,而NULLS LAST表示将NULL值放在分组的最后面。通过在GROUP BY子句中使用这两个关键字,我们可以控制对NULL值的排序和分组。案例代码假设我们有一个员工表,其中包含员工的姓名和所在部门。现在我们想要按照部门对员工进行分组,但是不希望将NULL值作为一组进行分组。首先,我们创建一个名为"employees"的表,并插入一些示例数据:sqlCREATE TABLE employees ( id INT, name VARCHAR(50), department VARCHAR(50));INSERT INTO employees (id, name, department)VALUES (1, 'John', 'Sales'), (2, 'Jane', 'Marketing'), (3, 'Mike', NULL), (4, 'Sarah', 'Sales'), (5, 'David', NULL);
接下来,我们可以使用NULLS LAST关键字将NULL值放在分组的最后面:sqlSELECT department, COUNT(*) as countFROM employeesGROUP BY departmentORDER BY department NULLS LAST;
运行以上代码,我们将得到如下结果:department | count------------|-------Marketing | 1Sales | 2NULL | 2
可以看到,部门为NULL的员工被放在了分组的最后面。如果我们想要将NULL值放在分组的最前面,可以使用NULLS FIRST关键字:sqlSELECT department, COUNT(*) as countFROM employeesGROUP BY departmentORDER BY department NULLS FIRST;
运行以上代码,我们将得到如下结果:department | count------------|-------NULL | 2Marketing | 1Sales | 2
可以看到,部门为NULL的员工被放在了分组的最前面。通过在GROUP BY子句中使用NULLS FIRST或NULLS LAST关键字,我们可以控制对NULL值的处理。这在实际应用中非常有用,特别是当我们希望将NULL值放在分组的最前面或最后面时。通过合理使用这两个关键字,我们可以更灵活地进行数据分析和聚合计算。