最常見的資料庫應用場景之一,就是為報表準備資料。想像一下:你在大學工作,你老闆(當然完全不懂 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 不只是資料而已,還是讓資料變得有意義又實用的工具。
把這些技巧用起來,不只是寫查詢,還能做出 SQL 藝術品!下堂課我們會繼續深入 PostgreSQL 的魔法世界。
GO TO FULL VERSION