LEAST()¶
LEAST(value1, value2, …) 返回参数列表中的最小值(至少两个参数)。混合数值类型会隐式提升为公共类型后再比较。若任一参数为 NULL,则结果返回 NULL。
函数说明¶
LEAST() 返回参数列表中的最小值。它比较两个或更多值并返回其中最小的值。
自 v4.1.0 起,LEAST() 会对混合数值参数类型进行隐式类型提升,而不是直接拒绝。例如,将 BIGINT 与 DOUBLE 进行比较时,两者会自动提升为 DOUBLE 后再比较。
当任一参数为 NULL 时,函数返回 NULL,与 MySQL 行为一致。
语法¶
> LEAST(value1, value2, ...)
参数释义¶
Arguments |
Description |
|---|---|
value1, value2, … |
必选。两个或更多待比较的值。支持的类型包括整数、浮点数、小数、字符串和时间类型。 |
类型提升规则¶
当参数具有不同的数值类型时,LEAST() 会将它们提升到最宽泛的公共类型:
TINYINT+INT提升为INT(或更宽的整数类型)。BIGINT+DOUBLE提升为DOUBLE。BIGINT+DECIMAL提升为适当精度的DECIMAL。有符号
BIGINT+ 超出INT64范围的无符号BIGINT UNSIGNED提升为DECIMAL128(无损)。不同精度的小数提升到更宽的精度/标度。
全部无符号的参数提升到最宽的无符号类型。
同类型比较不触发提升。
示例¶
DROP DATABASE IF EXISTS dbfuncs;
CREATE DATABASE dbfuncs;
USE dbfuncs;
-- 基本比较
SELECT LEAST(1, 2.0) AS result;
-- result: 1.0
-- 混合整数与浮点类型
SELECT LEAST(CAST(1 AS BIGINT), CAST(2.0 AS DOUBLE)) AS result;
-- result: 1.0
SELECT LEAST(CAST(5 AS BIGINT), CAST(2.5 AS DECIMAL(10,2))) AS result;
-- result: 2.50
-- 不同宽度整数类型
SELECT LEAST(CAST(1 AS TINYINT), CAST(2000 AS INT)) AS result;
-- result: 1
-- NULL 处理:任一参数为 NULL 时结果即为 NULL
SELECT LEAST(1, NULL, 2.0) AS result;
-- result: NULL
-- 表驱动:聚合函数比较(BIGINT vs DOUBLE)
CREATE TABLE toll_transactions(id INT, gate_processing_sec DOUBLE, lanes INT);
INSERT INTO toll_transactions VALUES
(1, 3.5, 2), (2, 7.0, 2), (3, 1.0, 4), (4, 12.5, 3);
SELECT LEAST(COUNT(*), AVG(gate_processing_sec)) AS result FROM toll_transactions;
-- result: 4.0
-- 逐行混合列类型比较
CREATE TABLE mixed_num(a BIGINT, b DOUBLE, c DECIMAL(20,4));
INSERT INTO mixed_num VALUES (10, 2.5, 7.25), (3, 9.0, 4.5), (-5, -1.0, 100.0);
SELECT a, b, LEAST(a, b) AS lab FROM mixed_num ORDER BY a;
SELECT a, b, c, LEAST(a, b, c) AS l3 FROM mixed_num ORDER BY a;
-- 无符号整数比较
CREATE TABLE uns(u1 TINYINT UNSIGNED, u2 INT UNSIGNED, u3 BIGINT UNSIGNED);
INSERT INTO uns VALUES (1, 300, 5000000000), (200, 50, 1), (100, 70000, 9000000000);
SELECT LEAST(u1, u2) AS l_u FROM uns ORDER BY u1;
SELECT LEAST(u1, u2, u3) AS l3u FROM uns ORDER BY u1;
-- 有符号 + 超出 int64 范围的无符号,提升为 decimal128
SELECT LEAST(CAST(-3 AS BIGINT), CAST(9000000000000000000 AS BIGINT UNSIGNED)) AS result;
-- result: -3
-- 取上限模式配合:GREATEST(0, expr) 的对偶用法
SELECT LEAST(0, COUNT(*) - lanes * (3600.0 / AVG(gate_processing_sec))) AS est
FROM toll_transactions GROUP BY lanes ORDER BY lanes;
DROP DATABASE dbfuncs;