数据库最常见的用法之一就是为报表准备数据。想象下:你在大学工作,你老板(当然他对SQL一窍不通)让你搞个学生名单,把名字和姓合并,还要把生日显示成DD-MM-YYYY格式。任务很明确:数据要整得漂漂亮亮的。SQL就是我们最靠谱的帮手。
例子1:合并名字和姓
先来把学生表students里的名字(first_name)和姓(last_name)合起来。
SELECT
CONCAT(first_name, ' ', last_name) AS full_name
FROM
students;
这里发生了啥?
CONCAT()把字符串拼起来。我们中间加了个空格,看起来更直观。- 结果存在新列
full_name里。
结果可能长这样:
| full_name |
|---|
| Otto Art |
| Anna Song |
| Pol Mac |
例子2:日期格式化
现在我们再给查询加上生日的格式化。
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students;
新东西:
- 我们对
birth_date字段用了TO_CHAR()函数。 - 格式
'DD-MM-YYYY'把日期变成好看的样子(比如:25-12-2001)。
结果:
| full_name | formatted_birth_date |
|---|---|
| Otto Art | 12-04-1995 |
| Anna Song | 03-08-1996 |
| Pol Mac | 21-11-1997 |
搞定!你刚刚做出了一个漂亮的报表。
为数据导出做格式化
假设你有个同事想把订单数据导出成CSV文件,方便在Excel里用。但数据库里的数据格式他用着不顺手,销售部的人还非要指定格式。比如,他们不想看到total_price字段的原始数字,而是要像$100.00这样的格式。
例子3:把数字转成货币格式
我们把orders表里的订单数据整一下,方便导出:
SELECT
order_id,
TO_CHAR(total_price, 'FM$999,999.00') AS formatted_price
FROM
orders;
TO_CHAR()这次干了啥?
FM(Fill Mode)去掉多余的空格。$加上货币符号。999,999.00设定千分位和两位小数。
结果:
| order_id | formatted_price |
|---|---|
| 1 | $1,000.00 |
| 2 | $2,500.50 |
| 3 | $10.00 |
现在你同事可以轻松导入Excel,还能在会上夸你两句。
最终任务
这才是最有意思的。我们把你学到的技能都用上。
任务
写个查询,针对students表:
- 把名字和姓合成一列
full_name。 - 把生日转成
DD-MM-YYYY格式。 - 显示学生到今天的年龄。
查询大概长这样:
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date,
DATE_PART('year', AGE(birth_date)) AS age
FROM
students;
新知识点:
AGE(birth_date)返回当前日期和生日之间的间隔(年、月、日)。DATE_PART('year', AGE(birth_date))只取出间隔里的年数。
结果:
| full_name | formatted_birth_date | age |
|---|---|---|
| Otto Art | 12-04-1995 | 28 |
| Anna Song | 03-08-1996 | 27 |
| Pol Mac | 21-11-1997 | 25 |
这样的报表能让最挑剔的同事都满意。
针对特定条件的格式化
有时候格式化是为了做条件或过滤。比如,查出生日在本月的学生。
例子4:按月份过滤
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
WHERE
DATE_PART('month', birth_date) = DATE_PART('month', CURRENT_DATE);
怎么回事?
DATE_PART('month', birth_date)从生日里取出月份。CURRENT_DATE给出今天的日期。我们用DATE_PART()取出月份。
格式化和排序结合
现在把学到的都用上,再加个排序。比如,做个按生日排序的学生名单。
例子5:按生日排序
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
ORDER BY
birth_date ASC;
升序ASC会先显示年纪最大的,降序DESC会先显示最年轻的。
结合唯一值
最后来个加星号的任务。假设我们大学在好几个城市有分校,你要做个只显示学生所在城市(唯一值)的名单,还要按字母排序。
例子6:唯一值和排序
SELECT DISTINCT
city
FROM
students
ORDER BY
city ASC;
DISTINCT干嘛用的?
它去掉重复的,只保留每个城市一次。
为啥要这么做?
方便又好看。 数据整得美观,操作起来更顺手,老板也少问问题。
贴近真实工作。 你能自动生成报表、做导出、做漂亮的展示。
让你更值钱。 SQL不只是数据本身,更是让数据变得清晰有用的工具。
用这些技能,不只是写查询,还能做出作品!下节课我们继续深入PostgreSQL的魔法世界。
GO TO FULL VERSION