介绍
MAX() 是 MySQL 中的聚合函数,用于从指定列或表达式中返回最大值。它可以作用于数值类型、字符串类型或日期时间类型的数据,根据相应的比较规则找出最大值。
使用方法
数据比较规则:
- 数值类型:按数值大小比较(如
100 > 99) - 字符串类型:按字符的 ASCII 码值逐字符比较(如
'apple' < 'banana') - 日期时间类型:按时间先后比较(如
'2024-01-01' < '2024-12-31')
NULL 值处理:
MAX()函数会自动忽略 NULL 值- 如果该列所有值都是 NULL,
MAX()返回 NULL
索引优化:
- 如果查询的列上有索引,MySQL 可以直接使用索引找到最大值,无需全表扫描
- 这是性能优化的关键
返回值
返回一行一列数据,该数据是最大值
如果该列所有值都是
NULL,返回NULL
查询最高工资
select max(sal) from emp
注意: 此时不能查询其他的列,下面查询不正确
select ename,max(sal) from emp
案例
1. 基本用法
-- 创建示例表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
price DECIMAL(10, 2),
stock INT,
create_time DATETIME
);
-- 插入示例数据
INSERT INTO products (name, price, stock, create_time) VALUES
('Laptop', 4999.99, 50, '2024-01-15 10:30:00'),
('Smartphone', 2999.99, 100, '2024-02-20 09:15:00'),
('Tablet', 1999.99, 75, '2024-03-10 14:20:00'),
('Headphones', 399.99, 200, '2024-01-05 16:45:00'),
('Charger', 89.99, NULL, '2024-04-01 11:00:00');
2. 获取单列最大值
-- 获取最高价格
SELECT MAX(price) AS max_price FROM products; -- 返回 4999.99
-- 获取最大库存量
SELECT MAX(stock) AS max_stock FROM products; -- 返回 200(自动忽略 NULL)
-- 获取最新创建时间
SELECT MAX(create_time) AS latest_create_time FROM products; -- 返回 '2024-04-01 11:00:00'
-- 获取名称的最大值(按字符串比较)
SELECT MAX(name) AS max_name FROM products; -- 返回 'Tablet'
3. 结合 WHERE 条件
-- 获取2024年2月之后创建的产品的最高价格
SELECT MAX(price) AS max_price
FROM products
WHERE create_time >= '2024-02-01'; -- 返回 2999.99
-- 获取库存量大于50的产品的最高价格
SELECT MAX(price) AS max_price
FROM products
WHERE stock > 50; -- 返回 2999.99
4. 结合 GROUP BY
-- 假设添加了 category 列
ALTER TABLE products ADD COLUMN category VARCHAR(50);
UPDATE products SET category = CASE
WHEN name IN ('Laptop', 'Smartphone', 'Tablet') THEN 'Electronics'
ELSE 'Accessories'
END;
-- 按类别分组获取每组的最高价格
SELECT
category,
MAX(price) AS max_price,
MAX(stock) AS max_stock
FROM products
GROUP BY category;
5. 结合子查询
-- 获取价格最高的产品信息
SELECT *
FROM products
WHERE price = (SELECT MAX(price) FROM products);
6. 与其他聚合函数结合
-- 获取价格的统计信息
SELECT
MAX(price) AS max_price,
MIN(price) AS min_price,
AVG(price) AS avg_price,
COUNT(*) AS product_count
FROM products;
7. 使用表达式
-- 获取价格加税(10%)后的最大值
SELECT MAX(price * 1.1) AS max_price_with_tax FROM products; -- 返回 5499.989
-- 获取名称长度的最大值
SELECT MAX(LENGTH(name)) AS max_name_length FROM products; -- 返回 10
性能优化要点
索引优化:
-- 为经常查询最大值的列创建索引 CREATE INDEX idx_products_price ON products(price); CREATE INDEX idx_products_create_time ON products(create_time);避免在表达式中使用函数:
```sql
— 不推荐(无法使用索引)
SELECT MAX(YEAR(create_time)) FROM products;
— 推荐(可以使用索引)
SELECT YEAR(MAX(create_time)) FROM products;
3. **使用 LIMIT 替代(特定场景)**:
```sql
-- 获取价格最高的产品(两种方法)
SELECT * FROM products ORDER BY price DESC LIMIT 1; -- 可能使用索引
SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products); -- 通常更快
注意事项
- 数据类型一致性:确保比较的数据类型一致,避免隐式转换影响结果。
- NULL 值处理:
MAX()忽略 NULL 值,如果需要考虑 NULL,可以使用COALESCE:SELECT MAX(COALESCE(stock, 0)) FROM products; -- 将 NULL 视为 0 - 字符串比较:字符串的最大值可能不是直观的”最后一个”值,取决于字符编码。
总结
MAX()函数用于获取指定列或表达式的最大值,支持数值、字符串和日期时间类型。- 它会自动忽略 NULL 值,可以结合
WHERE、GROUP BY等子句使用。 - 在经常查询最大值的列上创建索引可以显著提升性能,这是最重要的优化手段。