Một trong những kịch bản phổ biến nhất khi làm việc với database là chuẩn bị dữ liệu cho báo cáo. Hãy tưởng tượng thế này: bạn làm ở trường đại học, và sếp của bạn (người chắc chắn không biết gì về SQL) nhờ bạn tạo danh sách sinh viên với tên và họ được nối lại, đồng thời hiển thị ngày sinh theo định dạng DD-MM-YYYY. Nhiệm vụ rõ ràng: cần trình bày dữ liệu cho đẹp mắt. Và SQL chính là trợ thủ đắc lực của chúng ta trong vụ này.
Ví dụ 1: Nối tên và họ
Bắt đầu bằng việc nối tên (first_name) và họ (last_name) của sinh viên từ bảng students của chúng ta.
SELECT
CONCAT(first_name, ' ', last_name) AS full_name
FROM
students;
Ở đây có gì?
CONCAT()dùng để nối chuỗi. Mình thêm dấu cách giữa tên và họ cho dễ nhìn.- Kết quả được lưu vào cột mới
full_name.
Kết quả có thể như sau:
| full_name |
|---|
| Otto Art |
| Anna Song |
| Pol Mac |
Ví dụ 2: Định dạng ngày tháng
Bây giờ mình thêm định dạng ngày sinh vào truy vấn.
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students;
Có gì mới ở đây:
- Mình dùng hàm
TO_CHAR()cho trườngbirth_date. - Định dạng
'DD-MM-YYYY'chuyển ngày thành dạng dễ nhìn (ví dụ:25-12-2001).
Kết quả:
| full_name | formatted_birth_date |
|---|---|
| Otto Art | 12-04-1995 |
| Anna Song | 03-08-1996 |
| Pol Mac | 21-11-1997 |
Voilà! Bạn vừa tạo ra một báo cáo đẹp mắt rồi đó.
Định dạng để xuất dữ liệu
Giả sử một đồng nghiệp của bạn muốn xuất dữ liệu đơn hàng ra file CSV để làm việc tiếp trên Excel. Nhưng dữ liệu trong database lại lưu ở dạng không tiện cho họ, còn team sales thì đòi hỏi một kiểu hiển thị cụ thể. Ví dụ, thay vì trường total_price chỉ có giá trị số, họ muốn thấy nó ở dạng: $100.00.
Ví dụ 3: Chuyển số thành định dạng tiền tệ
Trình bày dữ liệu đơn hàng từ bảng orders để xuất ra:
SELECT
order_id,
TO_CHAR(total_price, 'FM$999,999.00') AS formatted_price
FROM
orders;
Hàm TO_CHAR() làm gì ở đây?
FM(Fill Mode) loại bỏ khoảng trắng thừa.$thêm ký hiệu tiền tệ.999,999.00định dạng số với dấu phân cách hàng nghìn và hai số sau dấu phẩy.
Kết quả:
| order_id | formatted_price |
|---|---|
| 1 | $1,000.00 |
| 2 | $2,500.50 |
| 3 | $10.00 |
Bây giờ đồng nghiệp của bạn có thể dễ dàng import dữ liệu vào Excel và khen bạn trong buổi họp rồi nhé.
Bài tập cuối cùng
Đây mới là phần thú vị nhất. Hãy kết hợp tất cả kỹ năng bạn đã học.
Bài toán
Tạo truy vấn cho bảng students mà:
- Nối tên và họ thành một cột
full_name. - Chuyển ngày sinh sang định dạng
DD-MM-YYYY. - Hiển thị tuổi của sinh viên tính đến ngày hiện tại.
Truy vấn sẽ trông như sau:
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;
Các thành phần mới:
AGE(birth_date)trả về khoảng cách giữa ngày hiện tại và ngày sinh, nhưng ở dạng năm, tháng, ngày.DATE_PART('year', AGE(birth_date))lấy ra số năm từ khoảng cách đó.
Kết quả:
| full_name | formatted_birth_date | age |
|---|---|---|
| Otto Art | 12-04-1995 | 28 |
| Anna Song | 03-08-1996 | 27 |
| Pol Mac | 21-11-1997 | 25 |
Báo cáo như vậy sẽ làm hài lòng cả những đồng nghiệp khó tính nhất.
Định dạng cho điều kiện đặc biệt
Đôi khi định dạng dữ liệu là để tạo điều kiện hoặc lọc. Ví dụ, lấy ra các sinh viên có sinh nhật trong tháng hiện tại.
Ví dụ 4: Lọc theo tháng
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);
Nó hoạt động thế nào?
DATE_PART('month', birth_date)lấy ra tháng từ ngày sinh.CURRENT_DATElà ngày hiện tại. Mình lấy tháng từ đó bằngDATE_PART().
Kết hợp định dạng và sắp xếp
Bây giờ kết hợp tất cả những gì đã học và thêm sắp xếp nữa. Ví dụ, tạo danh sách sinh viên được sắp xếp theo ngày sinh.
Ví dụ 5: Sắp xếp theo ngày sinh
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;
Sắp xếp tăng dần ASC sẽ cho thấy sinh viên lớn tuổi nhất trước, còn giảm dần DESC thì ngược lại, sinh viên trẻ nhất lên đầu.
Kết hợp với giá trị duy nhất
Cuối cùng là bài toán có dấu sao. Giả sử trường đại học của bạn có nhiều chi nhánh ở các thành phố khác nhau, và bạn cần tạo danh sách các thành phố duy nhất mà sinh viên đang học, sắp xếp theo thứ tự chữ cái.
Ví dụ 6: Giá trị duy nhất và sắp xếp
SELECT DISTINCT
city
FROM
students
ORDER BY
city ASC;
DISTINCT làm gì?
Nó loại bỏ các giá trị trùng lặp, để mỗi thành phố chỉ xuất hiện một lần trong kết quả.
Tại sao cần làm vậy?
Tiện lợi và đẹp mắt. Khi dữ liệu được trình bày đẹp, làm việc với nó dễ hơn, sếp cũng ít hỏi hơn.
Sẵn sàng cho thực tế. Bạn sẽ tự động tạo báo cáo, làm việc với xuất dữ liệu và chuẩn bị các slide đẹp.
Tăng giá trị bản thân. SQL không chỉ là về dữ liệu. Nó là về cách làm cho dữ liệu trở nên dễ hiểu và hữu ích.
Hãy dùng những kỹ năng vừa học để không chỉ viết truy vấn, mà còn tạo ra những tuyệt tác! Ở các bài giảng tiếp theo, tụi mình sẽ tiếp tục khám phá phép thuật của PostgreSQL nhé.
GO TO FULL VERSION