来吧,咱们一起 dive 进数据的极值世界——找最小值和最大值。别担心,SQL 不会让你学啥特别难的新东西,但你会学会怎么在表里找出最大和最小的数据。这些函数到处都用得上:比如分析 IMDb 电影评分,或者算火星上的最低温度。
MIN() 和 MAX() 是聚合函数,会从一堆数据里返回最小值和最大值。它们就像极值猎人一样:MIN() 找最小的,MAX() 找最大的。不光能查数字,字符串和日期也能查最小最大。
-- MIN 和 MAX 的通用写法
SELECT
MIN(column_name) AS min_value,
MAX(column_name) AS max_value
FROM table_name;
是不是很简单!现在咱们看看这些魔法在不同场景下怎么用。
语法和基础例子
数字数据
假设有个 employees 表,里面有个员工工资的列(salary)。
我们想知道最低工资和最高工资。
表 employees
| id | name | salary |
|---|---|---|
| 1 | Anna Song | 45000 |
| 2 | Otto Art | 30000 |
| 3 | Maria Chi | 120000 |
| 4 | Alex Lin | 90000 |
| 5 | Eva Tan | 60000 |
-- 数字数据的例子
SELECT
MIN(salary) AS min_salary,
MAX(salary) AS max_salary
FROM employees;
结果
| min_salary | max_salary |
|---|---|
| 30000 | 120000 |
文本数据
你也可以用 MIN() 和 MAX() 查文本数据。
它们是按字母顺序比的(没错,字母也有“最小”和“最大”)。
假设有个 students 表,name 列存着学生名字。
表 students
| id | name |
|---|---|
| 1 | Anna |
| 2 | Otto |
| 3 | Maria |
| 4 | Ben |
| 5 | Zoe |
-- 文本数据的例子
SELECT
MIN(name) AS first_name_in_order,
MAX(name) AS last_name_in_order
FROM students;
结果
| first_name_in_order | last_name_in_order |
|---|---|
| Anna | Zoe |
日期和时间
来找下 events 表里最早和最晚的日期。
表 events
| id | event_name | event_date |
|---|---|---|
| 1 | New Year Party | 2023-01-01 |
| 2 | Summer Fest | 2023-06-15 |
| 3 | Halloween Bash | 2023-10-31 |
| 4 | Year End Gala | 2023-12-31 |
-- 日期数据的例子
SELECT
MIN(event_date) AS earliest_date,
MAX(event_date) AS latest_date
FROM events;
结果
| earliest_date | latest_date |
|---|---|
| 2023-01-01 | 2023-12-31 |
在有 NULL 的表里用 MIN() 和 MAX()
如果某列有 NULL,你可以放心睡觉:SQL 算的时候会自动忽略它们。
也就是说,MIN() 和 MAX() 只会看“正常”值。
表 employees_with_null
| id | name | salary |
|---|---|---|
| 1 | Otto | 30000 |
| 2 | Maria | NULL |
| 3 | Anna | 120000 |
| 4 | John | NULL |
-- 有 NULL 的表
SELECT
MIN(salary) AS min_salary,
MAX(salary) AS max_salary
FROM employees_with_null;
如果 salary 列里有 NULL,它们会被直接无视。
| min_salary | max_salary |
|---|---|
| 30000 | 120000 |
但如果整列都是 NULL,结果就是 NULL。
MIN() 和 MAX() 在实际问题里的用法例子
找最老和最年轻的员工
表 employees
| id | name | birth_date |
|---|---|---|
| 1 | Otto | 1980-05-10 |
| 2 | Maria | 1990-11-20 |
| 3 | Anna | 1975-03-15 |
| 4 | John | 2000-08-01 |
employees 表有个 birth_date 字段,存员工生日。来找最老和最年轻的员工。
SELECT
MIN(birth_date) AS oldest_employee,
MAX(birth_date) AS youngest_employee
FROM employees;
结果:
| oldest_employee | youngest_employee |
|---|---|
| 1975-03-15 | 2000-08-01 |
销售分析
| id | amount |
|---|---|
| 1 | 150.00 |
| 2 | 75.50 |
| 3 | 200.00 |
| 4 | 120.00 |
| 5 | 500.00 |
| 6 | 90.00 |
sales 表有个 amount 字段,存销售金额。来找最小和最大销售额。
SELECT
MIN(amount) AS smallest_sale,
MAX(amount) AS largest_sale
FROM sales;
查询结果
| smallest_sale | largest_sale |
|---|---|
| 75.50 | 500.00 |
找最早和最晚的订单
如果你有个 orders 表,order_date 字段存下单时间,就能很容易查到第一单和最后一单的日期。
原始表 orders
| order_id | customer_id | order_date | amount |
|---|---|---|---|
| 101 | 1 | 2023-01-15 10:23:00 | 250.00 |
| 102 | 2 | 2023-02-10 14:45:00 | 150.00 |
| 103 | 3 | 2023-01-05 09:10:00 | 300.00 |
| 104 | 1 | 2023-03-22 16:30:00 | 500.00 |
| 105 | 4 | 2023-01-25 11:00:00 | 120.00 |
SELECT
MIN(order_date) AS first_order,
MAX(order_date) AS last_order
FROM orders;
查询结果:
| first_order | last_order |
|---|---|
| 2023-01-05 09:10:00 | 2023-03-22 16:30:00 |
MIN() 和 MAX() 的注意点
字符串比较: 用在字符串时,MIN() 和 MAX() 是按字母顺序比的。
和 NULL 一起用: 如果有别的值,NULL 会被忽略。但如果全是 NULL,结果就是 NULL。
日期比较: SQL 不只看年份,还会看月份、天、小时、分钟。
GO TO FULL VERSION