筛选(HAVING)

Exisi 2023-02-17 14:32:55
Categories: Tags:
  • SQL 中,WHERE子句指定选择列表中列的条件,但不能引用聚合函数

 

  • HAVING子句与WHERE子句一样,指定选择条件。并且HAVING子句可以使用聚合函数对数据进行处理

 

  • HAVING子句指定组的条件,通常包含在GROUP by子句之后构成。查询结果仅包括满足HAVING条件的组。(如果不存在GROUP BY,则所有行隐式地形成一个聚合组。)

语法

SELECT select_expr [, select_expr] ...

FROM table_references  [PARTITION partition_list]

[WHERE where_condition]

[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]

HAVING where_condition;

 

参数

说明

select_expr

包含选择列表,该列表指示要检索的列。指定列或表达式,或者可以使用 *

必须至少有一个select_expr

[FROM table_references

[PARTITION

partition_name[partition_name]

]

]

指定语句作用到的数据表名

参数

描述

table_references

数据表名

[PARTITION

partition_name

[partition_name]

]

SELECT 支持使用 PARTITION 子句的显式分区选择,其中包含分区或子分区(或两者)列表,跟在 table_reference 中的表名之后。在这种情况下,仅从列出的分区中选择行,而忽略表的任何其他分区

属性

描述

partition_name

要使用的分区或子分区的逗号分隔列表。此列表中的每个名称必须是指定表的现有分区或子分区的名称;如果未找到任何分区或子分区,则语句将失败并返回错误(分区'partition_name'不存在)。partition_names中命名的分区和子分区可以按任何顺序列出,并且可能重叠

 

 

[WHERE where_condition]

WHERE子句(如果给定)指示行必须满足的条件才能被选择。

如果没有WHERE子句,语句将选择所有行

参数

描述

where_condition

其中condition是一个表达式,对于要选择的每一行,其计算结果为true

 

[GROUP BY {col_name | expr | position}, ...

[WITH ROLLUP]]

使用GROUPBY时对任意列进行排序,可以使用列名、列别名或列位置在ORDER BYGROUP BY子句中引用为输出选择的列。列位置为整数,以1开头:

参数

描述

col_name

数据列名

expr

数据列别名

position

数据列索引

[WITH ROLLUP]

WITH ROLLUP修饰符添加到GROUP BY子句会导致查询生成另一个(超级聚合)行,添加了ROLLUP后,查询将生成多行

 

HAVING where_condition

HAVING子句与WHERE子句一样,指定选择条件。WHERE子句指定选择列表中列的条件,但不能引用聚合函数。

 

HAVING子句指定组的条件,通常由GROUP by子句构成。查询结果仅包括满足HAVING条件的组。(如果不存在GROUP BY,则所有行隐式地形成一个聚合组。)

参数

描述

where_condition

其中condition是一个表达式,对于要选择的每一行,其计算结果为true

 

HAVING子句必须位于任何GROUP BY子句之后和任何ORDER BY子句之前

如果HAVING子句引用的列不明确,则会出现警告

示例

mysql> SELECT name,sex,height

    -> FROM tb_student

    -> GROUP BY height

    -> HAVING AVG(height)>170;

 

运行结果如下:

+----------+------+---------+

| name      | sex  | height |

+----------+------+---------+

| John      |     |    172   |

| Jim        |     |    175   |

| Thomas  |     |    178   |

| Henry    |     |    185   |

+----------+------+---------+

4 rows in set (0.00 sec)