LEAST()

LEAST(value1, value2, …) 返回参数列表中的最小值(至少两个参数)。混合数值类型会隐式提升为公共类型后再比较。若任一参数为 NULL,则结果返回 NULL。

函数说明

LEAST() 返回参数列表中的最小值。它比较两个或更多值并返回其中最小的值。

自 v4.1.0 起,LEAST() 会对混合数值参数类型进行隐式类型提升,而不是直接拒绝。例如,将 BIGINTDOUBLE 进行比较时,两者会自动提升为 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;