MySQL-sql聚合(多行)函数-max() 作者:马育民 • 2025-11-29 22:58 • 阅读:10001 # 介绍 `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. 基本用法 ```sql -- 创建示例表 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. 获取单列最大值 ```sql -- 获取最高价格 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 条件 ```sql -- 获取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 ```sql -- 假设添加了 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. 结合子查询 ```sql -- 获取价格最高的产品信息 SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products); ``` #### 6. 与其他聚合函数结合 ```sql -- 获取价格的统计信息 SELECT MAX(price) AS max_price, MIN(price) AS min_price, AVG(price) AS avg_price, COUNT(*) AS product_count FROM products; ``` #### 7. 使用表达式 ```sql -- 获取价格加税(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 ``` ### 性能优化要点 1. **索引优化**: ```sql -- 为经常查询最大值的列创建索引 CREATE INDEX idx_products_price ON products(price); CREATE INDEX idx_products_create_time ON products(create_time); ``` 2. **避免在表达式中使用函数**: ```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); -- 通常更快 ``` # 注意事项 1. **数据类型一致性**:确保比较的数据类型一致,避免隐式转换影响结果。 2. **NULL 值处理**:`MAX()` 忽略 NULL 值,如果需要考虑 NULL,可以使用 `COALESCE`: ```sql SELECT MAX(COALESCE(stock, 0)) FROM products; -- 将 NULL 视为 0 ``` 3. **字符串比较**:字符串的最大值可能不是直观的"最后一个"值,取决于字符编码。 # 总结 1. **`MAX()`** 函数用于获取指定列或表达式的最大值,支持数值、字符串和日期时间类型。 2. 它会**自动忽略 NULL 值**,可以结合 `WHERE`、`GROUP BY` 等子句使用。 3. 在经常查询最大值的列上创建**索引**可以显著提升性能,这是最重要的优化手段。 原文出处:http://www.malaoshi.top/show_1GW2JjUB7EuJ.html