[toc] # 第九章 SQL聚合函数 MIN 返回指定列中的最小数据值的聚合函数。 # 大纲 ```sql MIN([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [%AFTERHAVING]) ``` # 参数 - `ALL` - 可选-将聚合函数应用于所有值。`ALL`对`MIN`返回的值没有影响。提供它是为了与`SQL-92`兼容。 - `DISTINCT` - 可选-指定考虑每个唯一值。`DISTINCT`对`MIN`返回的值没有影响。它是为`SQL-92`兼容性提供的。 - `expression` - 任何有效的表达式。通常是包含要从中返回最小值的值的列的名称。 - `%FOREACH(col-list)` - 可选-列名或逗号分隔的列名列表。 - `%AFTERHAVING` - 可选-应用`HAVING`子句中的条件。 `MIN`返回与表达式相同的数据类型。 # 描述 `MIN`聚合函数返回表达式的最小值(最小值)。通常,表达式是查询返回的多行中的字段名称(或包含一个或多个字段名称的表达式)。 `MIN`可以在引用表或视图的`SELECT`查询或子查询中使用。`MIN`可以出现在选择列表或`HAVING`子句中,与普通字段值一起出现。 `MIN`不能在`WHERE`子句中使用。除非`SELECT`是子查询,否则不能在联接的`ON`子句中使用`MIN`。 与大多数其他聚合函数一样,`min`不能应用于流字段。尝试这样做会生成`SQLCODE-37`错误。 与大多数其他聚合函数不同,`ALL`和`DISTINCT`关键字(包括`MIN(DISTINCT BY(Col2)col1))`在MIN中不执行任何操作。它们是为了与SQL-92兼容而提供的。 # 数据值 `MIN`使用的指定字段可以是数字或非数字。对于数字数据类型字段,最小值定义为数值中的最低值;因此`-7`低于`-3`。对于非数字数据类型字段,最小值定义为字符串整理顺序中的最低值;因此`'-3'`低于`'-7'`。 空字符串(`‘’`)值被视为`CHAR(0)`。 谓词使用为字段定义的排序规则类型。默认情况下,字符串数据类型字段使用`SQLUPPER`排序规则定义,该排序规则不区分大小写。 当字段定义的排序规则类型为`SQLUPPER`时,`MIN`将返回全部大写字母的字符串。因此,不管数据的原始字母是什么,`SELECT MIN(Name)`都会返回`‘Aaron’`。但是,因为比较是使用大写排序执行的,所以`name=min(Name)`子句选择名称值为`'Aaron', 'AARON', and 'aaron'`的行。 对于数值,返回的小数位数与表达式小数位数相同。 在派生最小聚合函数值时,数据字段中的空值将被忽略。如果查询没有返回任何行,或者返回的所有行的数据字段值为`NULL`,则`MIN`返回`NULL`。 # 在当前事务期间所做的更改 与所有聚合函数一样,MIN始终返回数据的当前状态,包括未提交的更改,而不考虑当前事务的隔离级别。 # 示例 在下面的示例中,美元符号(`$`)连接到工资金额。 以下查询返回`Sample.Employee`数据库中的最低(最低)工资: ```sql SELECT '$' || MIN(Salary) AS LowSalary FROM Sample.Employee ``` 下面的查询为每个州返回一行,每个州至少包含一名薪资大于`75,000`美元的员工。使用`%AFTERHAVING`关键字,每行返回大于`75,000`美元的最低员工工资。每行还返回该状态下所有员工的最低工资和最高工资: ```sql SELECT Home_State, '$' || MIN(Salary %AFTERHAVING) AS MinSalaryAbove75K, '$' || MIN(Salary) AS MinSalary, '$' || MAX(Salary) AS MaxSalary FROM Sample.Employee GROUP BY Home_State HAVING Salary > 75000 ORDER BY MinSalaryAbove75K ``` 以下查询返回在`Sample.Employee`数据库中找到的排序规则序列中最小(最小)和最高(最大)的名称: ```sql SELECT Name,MIN(Name),MAX(Name) FROM Sample.Employee ``` 请注意,在比较之前,`MIN`和`MAX`会将`NAME`值转换为大写。 以下查询返回`Sample.Employee`数据库中`Home_State`为`‘VT’`的员工的最低(最低)工资: ```sql SELECT MIN(Salary) FROM Sample.Employee WHERE Home_State = 'VT' ``` 以下查询返回`Sample.Employee`数据库中每个`Home_State`的员工数量和最低(最低)员工工资: ```sql SELECT Home_State, COUNT(Home_State) As NumEmployees, MIN(Salary) As LowSalary FROM Sample.Employee GROUP BY Home_State ORDER BY LowSalary ```