Hôm nay tụi mình sẽ nói chút về mảng — một trong những công cụ mạnh mẽ của PostgreSQL, cho phép lưu danh sách các giá trị cùng kiểu trong một cột. Chi tiết hơn về mảng sẽ có ở các level sau nha.
Nói tới "mảng" là nghĩ ngay tới danh sách. Nhớ lại lúc ghi list đồ cần mua trước khi đi chợ: táo, chuối, sữa, bánh mì. Trong PostgreSQL, mảng cũng kiểu như vậy, cho phép lưu nhiều giá trị trong một trường, mà tất cả đều cùng kiểu dữ liệu. Ví dụ: mảng số, mảng text, mảng ngày tháng, v.v.
Lấy vài ví dụ cho dễ hình dung nha.
Mảng số:
{1, 2, 3, 4}
Mảng chuỗi:
{"apple", "banana", "cherry"}
Mảng ngày tháng:
{2024-10-01, 2024-10-02, 2024-10-03}
Mảng giúp lưu nhiều giá trị vào một trường, tiết kiệm chỗ trong bảng và tăng độ linh hoạt khi query.
Mảng để làm gì? Ưu điểm chính
Lưu trữ dữ liệu gọn nhẹ: lưu nhiều giá trị trong một trường. Cực kỳ tiện cho dữ liệu có liên quan logic với nhau. Ví dụ: danh sách tag cho bài viết hoặc danh sách điểm của sinh viên. Tạo riêng một bảng chỉ để lưu vài tag thôi á?
Dễ lấy dữ liệu: mảng cho phép lấy nguyên list giá trị từ một trường, và cũng dễ thao tác với từng phần tử trong mảng.
Hiệu năng: trong một số trường hợp, mảng giúp khỏi phải tạo thêm bảng phụ cho dữ liệu liên quan, làm đơn giản kiến trúc database và tăng tốc độ dev. Ai mà không thích chứ!
Làm việc với mảng trong PostgreSQL như nào?
Tạo mảng trong SELECT
Để tạo mảng, dùng constructor ARRAY[]. Ví dụ nè:
-- Ví dụ mảng số
SELECT ARRAY[1, 2, 3, 4];
-- Ví dụ mảng chuỗi
SELECT ARRAY['apple', 'banana', 'cherry'];
Dễ quá ha. Giờ tạo bảng rồi thử select gì đó trong bảng luôn.
Tạo bảng có mảng
Đầu tiên tạo bảng, trong đó một cột sẽ là mảng.
| id | name - VARCHAR(50) | subjects - TEXT[] |
|---|---|---|
| 1 | Alex | {Toán học,Vật lý} |
| 2 | Maria | {Hóa học,Sinh học,Tiếng Anh} |
| 3 | Peter | {Tin học} |
Xem thử kết quả nè:
SELECT * FROM students;
| id | name | subjects |
|---|---|---|
| 1 | Alex | {Toán học,Vật lý} |
| 2 | Maria | {Hóa học,Sinh học,Tiếng Anh} |
| 3 | Peter | {Tin học} |
Lấy dữ liệu từ mảng
Để lấy dữ liệu từ mảng, PostgreSQL có nhiều hàm và toán tử hỗ trợ.
Lấy phần tử trong mảng
Muốn lấy phần tử theo index, dùng dấu ngoặc vuông []. Lưu ý là đánh số từ 1 nha (không phải từ 0 như đa số ngôn ngữ lập trình đâu).
-- Lấy môn đầu tiên của mỗi sinh viên
SELECT name, subjects[1] AS mon_dau_tien FROM students;
Kết quả như này nè:
| name | mon_dau_tien |
|---|---|
| Alex | Toán học |
| Maria | Hóa học |
| Peter | Tin học |
Lấy nguyên dòng mảng
Muốn lấy hết các phần tử trong mảng thì dùng SELECT bình thường thôi:
SELECT name, subjects FROM students;
Tìm giá trị trong mảng
Đôi khi cần kiểm tra mảng có chứa giá trị nào đó không. Dùng toán tử ANY nha.
-- Chọn sinh viên học "Toán học"
SELECT name
FROM students
WHERE 'Toán học' = ANY(subjects);
Kết quả query:
| name |
|---|
| Alex |
Trong PostgresQL còn nhiều hàm và toán tử cho mảng lắm, nhưng để dành cho các level sau nghen :P
Lỗi thường gặp khi làm việc với mảng
Lẫn lộn index 0 và 1.
Trong PostgreSQL, index của mảng bắt đầu từ 1. Nếu quen với Python hay JavaScript thì dễ bị nhầm lắm á.
Mảng rỗng.
Mảng rỗng {} và NULL là hai thứ khác nhau trong PostgreSQL. Khi so sánh mảng, đừng nhầm lẫn hai khái niệm này nha.
Làm việc với mảng lớn.
Lưu quá nhiều dữ liệu trong một mảng có thể làm chậm query. Dùng mảng cho dữ liệu nhỏ nhỏ thôi nhé.
GO TO FULL VERSION