Các lệnh thao tác dữ liệu trong PostgreSQL là nhóm lệnh cho phép chúng ta làm việc trực tiếp với dữ liệu bên trong các bảng. Sau khi đã thiết kế cấu trúc cơ sở dữ liệu bằng các lệnh DDL như CREATE TABLE, ALTER TABLE và DROP TABLE, bước tiếp theo là thêm, chỉnh sửa hoặc xóa dữ liệu trong hệ thống.
Trong SQL, các thao tác liên quan đến dữ liệu được thực hiện thông qua nhóm lệnh DML (Data Manipulation Language). Nhóm lệnh này cho phép hệ thống xử lý các thay đổi phát sinh trong quá trình vận hành.
Các lệnh DML phổ biến nhất gồm:
- INSERT – thêm dữ liệu mới vào bảng
- UPDATE – cập nhật dữ liệu đã tồn tại
- DELETE – xóa dữ liệu khỏi bảng

Việc hiểu và sử dụng đúng các lệnh thao tác dữ liệu giúp hệ thống quản lý dữ liệu chính xác, đảm bảo tính nhất quán và hỗ trợ các hoạt động xử lý dữ liệu trong thực tế.
1. INSERT – Thêm dòng dữ liệu vào bảng
Lệnh INSERT được sử dụng để thêm một hoặc nhiều dòng dữ liệu mới vào bảng.
Cú pháp như sau:
INSERT INTO ten_bang (cot1, cot2, …)
(value1, value2, …),
(…, …., …)
Trong đó:
- ten_bang: tên bảng được thêm dữ liệu
- cot1, cot2 : tên các cột cần thêm, bắt buộc liệt kê nếu:
- Cột đó được khai báo NOT NULL và không có giá trị mặc định (DEFAULT).
- Cột là PRIMARY KEY (nếu không tự sinh).
- value1, value2: là các giá trị tương ứng với thứ tự các cột khai báo
Lưu ý: dữ liệu phải đúng kiểu dữ liệu và đúng thứ tự cột.
Sau đây là một vài ví dụ:
Chèn 10 khách hàng cho bảng customers
INSERT INTO customers (first_name, last_name, email, phone, address, ngay_gia_nhap, is_active) VALUES
('Nguyễn', 'Văn An', 'an.nguyen@email.com', '0901234567', '123 Đường Lê Lợi, Quận 1, TP.HCM', '2023-01-15', true),
('Trần', 'Thị Bình', 'binh.tran@email.com', '0912345678', '456 Đường Nguyễn Huệ, Quận 3, TP.HCM', '2023-02-20', true),
('Lê', 'Minh Cường', 'cuong.le@email.com', '0923456789', '789 Đường Hai Bà Trưng, Quận 1, TP.HCM', '2023-03-10', true),
('Phạm', 'Thu Dương', 'duong.pham@email.com', '0934567890', '321 Đường Võ Văn Tần, Quận 3, TP.HCM', '2022-12-05', true),
('Hoàng', 'Văn Em', 'em.hoang@email.com', '0945678901', '654 Đường Pasteur, Quận 1, TP.HCM', '2023-04-18', true),
('Võ', 'Thị Phương', 'phuong.vo@email.com', '0956789012', '987 Đường Côn Quyền, Quận 1, TP.HCM', '2022-11-22', false),
('Đỗ', 'Minh Giang', 'giang.do@email.com', '0967890123', '147 Đường Điện Biên Phủ, Quận 10, TP.HCM', '2023-05-30', true),
('Bùi', 'Thị Hoa', 'hoa.bui@email.com', '0978901234', '258 Đường Trần Hưng Đạo, Quận 5, TP.HCM', '2023-06-12', true),
('Lý', 'Văn Ich', 'ich.ly@email.com', '0989012345', '369 Đường Nguyễn Thái Học, Quận 1, TP.HCM', '2023-07-08', true),
('Mai', 'Thị Kim', 'kim.mai@email.com', '0990123456', '741 Đường Nam Kỳ Khởi Nghĩa, Quận 3, TP.HCM', '2023-08-25', true);

Tạo 10 sản phẩm cho bảng products
INSERT INTO products (product_name, description, price, brand, stock_quantity) VALUES
('iPhone 15 Pro Max', 'Điện thoại flagship mới của Apple với chip A17 Pro, camera 48MP', 34990000.00, 'Apple', 25),
('Samsung Galaxy S24 Ultra', 'Flagship Android với S Pen, camera zoom 100x, màn hình Dynamic AMOLED', 31990000.00, 'Samsung', 30),
('iPhone 14', 'iPhone thế hệ trước với hiệu năng ổn định, camera kép 12MP', 22990000.00, 'Apple', 40),
('Xiaomi 14 Ultra', 'Camera Leica cao cấp, chip Snapdragon 8 Gen 3, sạc nhanh 90W', 26990000.00, 'Xiaomi', 20),
('OPPO Find X7 Pro', 'Thiết kế cao cấp, camera Hasselblad, màn hình cong 120Hz', 24990000.00, 'OPPO', 15),
('Vivo X100 Pro', 'Camera chụp đêm vượt trội, chip MediaTek Dimensity 9300', 23990000.00, 'Vivo', 18),
('Samsung Galaxy A55', 'Tầm trung cao cấp, pin 5000mAh, màn hình Super AMOLED', 10990000.00, 'Samsung', 50),
('iPhone 13 Mini', 'Kích thước nhỏ gọn, hiệu năng mạnh mẽ với chip A15 Bionic', 17990000.00, 'Apple', 12),
('Xiaomi Redmi Note 13 Pro', 'Giá tốt, camera 200MP, sạc nhanh 67W, màn hình AMOLED', 7990000.00, 'Xiaomi', 60),
('Google Pixel 8', 'Camera AI thông minh, Android gốc, chip Tensor G3 tự phát triển', 18990000.00, 'Google', 22);

Chèn 10 đơn hàng cho bảng orders
INSERT INTO orders (customer_id, order_date, status) VALUES
(1, '2024-01-15 10:30:00', 'Delivered'),
(1, '2024-02-20 14:45:00', 'Delivered'),
(2, '2024-01-22 09:15:00', 'Shipped'),
(3, '2024-02-05 16:20:00', 'Delivered'),
(3, '2024-03-10 11:30:00', 'Processing'),
(4, '2024-02-28 13:45:00', 'Delivered'),
(5, '2024-01-08 08:20:00', 'Canceled'),
(5, '2024-03-15 15:10:00', 'Shipped'),
(7, '2024-03-20 12:00:00', 'Pending'),
(8, '2024-03-25 17:30:00', 'Processing');

Chèn các dòng dữ liệu cho bảng order_details
INSERT INTO order_details (order_id, product_id, quantity) VALUES
(1, 1, 1),
(1, 5, 1),
(1, 8, 1),
(2, 2, 1),
(3, 3, 1),
(4, 9, 3),
(4, 7, 2),
(5, 4, 1),
(6, 7, 2),
(6, 9, 1),
(7, 10, 1),
(8, 6, 1),
(8, 3, 1),
(9, 9, 1),
(10, 1, 1),
(10, 2, 1),
(10, 4, 1);

2. UPDATE – Cập nhật dữ liệu
Lệnh UPDATE cho phép thay đổi giá trị của một hoặc nhiều cột trên các dòng thỏa điều kiện. Cú pháp như sau:
UPDATE ten_bang
SET cot1 = value1, cot2 = value2
WHERE dieu_kien;
Trong đó:
- ten_bang: tên bảng được cập nhật dữ liệu
- cot1 = value1: cập nhật giá trị cho cot1 bằng value1
- dieu_kien: điều kiện xác định dòng nào được cập nhật
Lưu ý: nếu không có WHERE, toàn bộ dữ liệu trong bảng sẽ bị cập nhật.
Sau đây là một vài ví dụ:
Cập nhật số điện thoại của khách hàng có ID = 1
UPDATE customers
SET phone = '9876543210', updated_at = CURRENT_TIMESTAMP
WHERE id = 1;
Sửa giá sản phẩm cho các sản phẩm của Samsung (giảm 10%)
UPDATE products
SET price = price * 0.9, updated_at = CURRENT_TIMESTAMP
WHERE brand = 'Samsung';
Điều chỉnh toàn bộ số lượng tồn kho
UPDATE products
SET stock_quantity = stock_quantity - od.total_sold,
updated_at = CURRENT_TIMESTAMP
FROM (
SELECT product_id, SUM(quantity) AS total_sold
FROM order_details od
JOIN orders o ON od.order_id = o.id
WHERE o.status IN ('Shipped', 'Delivered')
GROUP BY product_id
) od
WHERE products.id = od.product_id;
3. DELETE – Xóa các dòng dữ liệu
Lệnh DELETE dùng để xóa một hoặc nhiều dòng khỏi bảng.
DELETE FROM ten_bang
WHERE dieu_kien;
Trong đó:
- ten_bang: tên bảng bị xóa dữ liệu
- dieu_kien: điều kiện xác định dòng nào bị xóa
Lưu ý: nếu không có WHERE, toàn bộ dữ liệu trong bảng sẽ bị xóa.
Sau đây là một vài ví dụ:
Xóa sản phẩm hết hàng và không có trong đơn hàng nào
DELETE FROM products
WHERE stock_quantity = 0 AND id NOT IN (SELECT DISTINCT product_id FROM order_details);
Xóa khách hàng đã đăng ký quá 2 năm 6 tháng nhưng không có đơn hàng nào
DELETE FROM customers
WHERE ngay_gia_nhap < CURRENT_DATE - INTERVAL '2 years 6 months'
AND id NOT IN ( SELECT DISTINCT customer_id FROM orders);
KẾT LUẬN
Các lệnh thao tác dữ liệu trong PostgreSQL giúp chúng ta làm việc trực tiếp với dữ liệu bên trong các bảng của cơ sở dữ liệu. Thông qua các lệnh như INSERT, UPDATE và DELETE, chúng ta có thể thêm dữ liệu mới, cập nhật thông tin hoặc xóa dữ liệu không còn cần thiết.
Việc nắm vững các lệnh thao tác dữ liệu trong PostgreSQL giúp đảm bảo hệ thống dữ liệu luôn được cập nhật chính xác, hỗ trợ quá trình quản lý và xử lý dữ liệu trong các ứng dụng thực tế.


