CodeGym /Các khóa học /SQL SELF /Sử dụng mảng (`ARRAY`)

Sử dụng mảng (`ARRAY`)

SQL SELF
Mức độ, Bài học
Có sẵn

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é.

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tìm kiếm giá trị trong mảng
Tìm kiếm giá trị trong mảng
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Trích xuất phần tử đầu tiên của mảng
Trích xuất phần tử đầu tiên của mảng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION