数据排序和格式化是很重要的技能,可以帮你准备易读的报告、优化数据分析,还能让和用户的交互更顺畅。这些知识在你做分析报告、准备导出数据,或者日常和数据库打交道时都很有用。实际工作中你经常会遇到需要把数据格式化得好看点、去掉重复记录、把信息排好序让人更容易看懂。今天我们就来搞这些!
例子1:创建唯一客户列表,把名字和姓氏合并,并按姓氏排序
我们有个customers表,里面存着客户的数据:
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Alex | Lin | New York |
| 2 | Maria | Chi | Los Angeles |
| 3 | Alex | Lin | New York |
| 4 | Anna | Song | Chicago |
我们的目标:
- 把
first_name和last_name合并成一个full_name列。 - 只提取唯一的客户。
- 按姓氏(
last_name)排序。
SQL查询
SELECT DISTINCT
CONCAT(first_name, ' ', last_name) AS full_name,
city
FROM customers
ORDER BY last_name;
| full_name | city |
|---|---|
| Maria Chi | Los Angeles |
| Alex Lin | New York |
| Anna Song | Chicago |
注意,重复的Alex Lin被DISTINCT去掉了,整个列表也按姓氏字母顺序排好了。
例子2:订单数据的格式化和排序
orders表里存着订单数据:
| order_id | customer_name | order_date | total_amount |
|---|---|---|---|
| 1 | Alex Lin | 2023-10-01 | 1500 |
| 2 | Maria Chi | 2023-10-02 | 2000 |
| 3 | Alex Lin | 2023-10-03 | 1500 |
| 4 | Anna Song | 2023-10-04 | 3000 |
我们的目标:
- 创建
formatted_order_date列,把订单日期格式变成DD-MM-YYYY。 - 去掉客户和日期重复的记录(只保留
customer_name和order_date的唯一组合)。 - 按日期降序排序订单。
- SQL查询
SELECT DISTINCT
customer_name,
TO_CHAR(order_date, 'DD-MM-YYYY') AS formatted_order_date,
total_amount
FROM orders
ORDER BY order_date DESC;
结果:
| customer_name | formatted_order_date | total_amount |
|---|---|---|
| Anna Song | 04-10-2023 | 3000 |
| Alex Lin | 03-10-2023 | 1500 |
| Maria Chi | 02-10-2023 | 2000 |
注意我们用TO_CHAR()把日期转成DD-MM-YYYY格式,用DISTINCT去掉了重复记录。
例子3:提取学生“名字+姓氏”的唯一组合,并按姓氏和生日排序
students表里有学生的数据:
| student_id | first_name | last_name | birth_date |
|---|---|---|---|
| 1 | Alex | Lin | 2001-03-15 |
| 2 | Maria | Chi | 2000-06-20 |
| 3 | Alex | Lin | 2001-03-15 |
| 4 | Anna | Song | 1999-10-10 |
我们的目标:
- 把名字和姓氏合并成
full_name列。 - 提取“名字+姓氏”的唯一组合。
- 按姓氏排序,再按生日排序。
SELECT DISTINCT
CONCAT(first_name, ' ', last_name) AS full_name,
birth_date
FROM students
ORDER BY last_name, birth_date;
结果:
| full_name | birth_date |
|---|---|
| Maria Chi | 2000-06-20 |
| Alex Lin | 2001-03-15 |
| Anna Song | 1999-10-10 |
特别注意:两个“Alex Lin”的重复记录被合并成一行,排序先按姓氏,再按生日。
实战练习
用你今天学到的知识来搞定下面这个任务:
任务:你有个products表,里面有这些数据:
| product_id | category | product_name | price |
|---|---|---|---|
| 1 | 电子产品 | 手机 | 50000 |
| 2 | 服装 | 夹克 | 8000 |
| 3 | 电子产品 | 笔记本 | 70000 |
| 4 | 服装 | 夹克 | 8000 |
- 创建
formatted_product列,把product_name和类别用短横线拼起来,比如:手机 - 电子产品。 - 去掉
product_name和category重复的组合。 - 按类别排序,再按价格从低到高排序。
下面是完成任务的查询结构:
SELECT DISTINCT
CONCAT(product_name, ' - ', category) AS formatted_product,
price
FROM products
ORDER BY category, price ASC;
你可以自己想象一下这个查询的结果会是什么样!
用CONCAT()、DISTINCT和ORDER BY这些函数,可以让数据更易读、更有结构,这在实际项目和任务里真的很重要。多练练,搞清楚怎么组合用它们!
GO TO FULL VERSION