MySQL-sql聚合(多行)函数-max()

介绍

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

性能优化要点

  1. 索引优化:

    -- 为经常查询最大值的列创建索引
    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:
    SELECT MAX(COALESCE(stock, 0)) FROM products;  -- 将 NULL 视为 0
    
  3. 字符串比较:字符串的最大值可能不是直观的”最后一个”值,取决于字符编码。

总结

  1. MAX() 函数用于获取指定列或表达式的最大值,支持数值、字符串和日期时间类型。
  2. 它会自动忽略 NULL 值,可以结合 WHERE、GROUP BY 等子句使用。
  3. 在经常查询最大值的列上创建索引可以显著提升性能,这是最重要的优化手段。