SQL làm việc với dữ liệu quan hệ như thế nào?
- SQL làm việc trên mô hình bảng và quan hệ ra sao?
- SQL truy vấn dữ liệu với SELECT như thế nào?
- JOIN kết nối dữ liệu giữa các bảng bằng khóa ra sao?
- SQL cập nhật dữ liệu bằng INSERT, UPDATE và DELETE
- Ràng buộc và giao dịch giữ dữ liệu nhất quán thế nào?
- SQL được DBMS thực thi và nên dùng trong thực tế ra sao?
Trong cơ sở dữ liệu quan hệ, dữ liệu thường được tổ chức thành các bảng gồm hàng và cột. Các bảng liên kết với nhau qua khóa, chẳng hạn khóa chính và khóa ngoại. SQL khai thác chính cấu trúc này: SELECT để truy vấn, JOIN để kết hợp bảng, INSERT/UPDATE/DELETE để thay đổi dữ liệu, còn ràng buộc và giao dịch giúp duy trì tính nhất quán. Vì vậy, hiểu SQL không chỉ là nhớ cú pháp mà còn phải hiểu dữ liệu quan hệ được tổ chức và liên kết như thế nào.
SQL làm việc trên mô hình bảng và quan hệ ra sao?
Trong mô hình quan hệ, một tập dữ liệu được biểu diễn dưới dạng quan hệ và trong DBMS thường được thể hiện thành bảng. Mỗi cột mô tả một thuộc tính, còn mỗi hàng đại diện cho một bản ghi.
Ví dụ một hệ thống bán hàng có hai bảng:
customers
|
customer_id |
name |
|
|
101 |
An |
|
|
102 |
Bình |
orders
|
order_id |
customer_id |
total_amount |
status |
|
5001 |
101 |
1200000 |
paid |
|
5002 |
101 |
850000 |
pending |
|
5003 |
102 |
400000 |
paid |
customer_id trong bảng customers có thể là khóa chính để nhận diện duy nhất từng khách hàng. Trong bảng orders, customer_id có thể là khóa ngoại tham chiếu đến khách hàng đã tạo đơn.
Cấu trúc này giúp tránh việc phải lặp lại toàn bộ tên, email và thông tin khách hàng trong mỗi đơn hàng. SQL có thể dựa vào quan hệ giữa hai bảng để tìm lại thông tin khi cần.
Một điểm quan trọng là SQL có tính khai báo. Với câu lệnh:
SQL
SELECT name
FROM customers
WHEREcustomer_id=101;
người viết mô tả kết quả cần lấy: tên của khách hàng có mã 101. Người viết không cần chỉ định DBMS phải đọc tệp dữ liệu nào trước, duyệt từng hàng ra sao hay sử dụng cấu trúc lưu trữ nào. Bộ tối ưu truy vấn của DBMS có thể tự xây dựng kế hoạch thực thi dựa trên cấu trúc bảng, chỉ mục và các điều kiện truy vấn.
SQL cũng thiên về xử lý tập hợp dữ liệu. Một câu lệnh có thể tác động lên một hàng, hàng nghìn hàng hoặc nhiều hơn tùy điều kiện. Đây là lý do WHERE đặc biệt quan trọng khi truy vấn hay cập nhật dữ liệu.

SQL truy vấn dữ liệu với SELECT như thế nào?
SELECT là nhóm câu lệnh trung tâm khi cần đọc dữ liệu. Một truy vấn có thể lựa chọn cột, lọc hàng, sắp xếp, tổng hợp hoặc nhóm dữ liệu mà không làm thay đổi dữ liệu gốc.
Ví dụ:
SQL
SELECT order_id, total_amount
FROM orders
WHEREstatus='paid'
ORDERBYtotal_amountDESC;
Truy vấn yêu cầu lấy mã đơn và giá trị đơn hàng của các đơn đã thanh toán, sau đó sắp xếp từ giá trị lớn xuống thấp.
Các thành phần thường phối hợp trong truy vấn gồm:
· SELECT xác định dữ liệu cần trả về
· FROM xác định bảng nguồn
· WHERE lọc các hàng thỏa điều kiện
· GROUP BY gom các hàng thành nhóm
· HAVING lọc kết quả sau khi nhóm
· ORDER BY sắp xếp kết quả
Khi cần tổng hợp, SQL có thể áp dụng các hàm như COUNT, SUM, AVG, MIN và MAX.
SQL
SELECTcustomer_id, SUM(total_amount)AStotal_spent
FROM orders
WHEREstatus='paid'
GROUPBYcustomer_id;
Thay vì trả từng đơn hàng riêng lẻ, câu lệnh trên tính tổng giá trị đơn đã thanh toán của mỗi khách hàng.
Một khác biệt đáng chú ý giữa lý thuyết quan hệ và SQL thực tế là kết quả SQL có thể chứa các hàng trùng nhau. Khi cần loại bỏ bản ghi trùng trong kết quả, có thể sử dụng DISTINCT:
SQL
SELECTDISTINCTstatus
FROM orders;
Ngoài ra, NULL cần được xử lý đúng. NULL biểu thị giá trị chưa biết hoặc không có giá trị theo ngữ cảnh, nên kiểm tra bằng IS NULL hoặc IS NOT NULL, không nên viết:
SQL
NULL
Mà cần dùng:
SQL
NULL
Cách SQL xử lý NULL dựa trên logic có thêm trạng thái chưa xác định, vì vậy điều kiện chứa NULL đôi khi cho kết quả khác với suy luận Boolean chỉ có đúng và sai.
JOIN kết nối dữ liệu giữa các bảng bằng khóa ra sao?
Một trong những khả năng quan trọng nhất của SQL là kết hợp dữ liệu đang nằm ở nhiều bảng.
Trong ví dụ bán hàng, orders chỉ lưu customer_id. Nếu muốn xem tên khách hàng cùng đơn hàng, SQL có thể JOIN hai bảng:
SQL
SELECT
o.order_id,
c.name,
o.total_amount,
o.status
FROMordersASo
JOINcustomersASc
ONo.customer_id=c.customer_id;
Điều kiện:
SQL
o.customer_id=c.customer_id
cho DBMS biết hàng nào của orders liên quan đến hàng nào của customers.
JOIN không có nghĩa là phải hợp nhất hai bảng thành một bảng lưu trữ mới. SQL tạo một kết quả logic từ các hàng thỏa điều kiện kết nối.
Loại JOIN cần dùng phụ thuộc vào dữ liệu muốn giữ lại. INNER JOIN chỉ trả về những hàng có kết quả khớp ở hai phía. LEFT JOIN vẫn giữ toàn bộ hàng của bảng bên trái ngay cả khi không tìm thấy hàng tương ứng ở bảng bên phải.
Ví dụ muốn liệt kê mọi khách hàng, kể cả người chưa đặt đơn:
SQL
SELECT
c.customer_id,
c.name,
o.order_id
FROMcustomersASc
LEFTJOINordersASo
ONc.customer_id=o.customer_id;
Khóa chính và khóa ngoại thường tạo nền tảng cho các phép JOIN có ý nghĩa, nhưng SQL không bắt buộc mọi phép JOIN phải sử dụng khóa. Về cú pháp, có thể JOIN theo một biểu thức phù hợp khác. Tuy nhiên, nếu điều kiện kết nối không phản ánh đúng quan hệ dữ liệu, kết quả có thể bị nhân bản, thiếu hàng hoặc tạo ra liên kết sai.
Đây cũng là lý do thiết kế dữ liệu quan hệ và viết SQL liên quan chặt chẽ với nhau: cấu trúc bảng rõ ràng giúp truy vấn dễ hiểu và giảm nguy cơ kết nối sai dữ liệu.
SQL cập nhật dữ liệu bằng INSERT, UPDATE và DELETE
SQL không chỉ đọc dữ liệu. Ba thao tác phổ biến để thay đổi dữ liệu là INSERT, UPDATE và DELETE.
Để thêm đơn hàng mới:
SQL
INSERTINTOorders (
order_id,
customer_id,
total_amount,
status
)
VALUES (
5004,
102,
950000,
'pending'
);
Để thay đổi trạng thái đơn:
SQL
UPDATE orders
SETstatus='paid'
WHEREorder_id=5004;
Và để xóa một hàng:
SQL
DELETEFROMorders
WHEREorder_id=5004;
Điểm cần chú ý là UPDATE và DELETE hoạt động trên mọi hàng thỏa điều kiện, không mặc định chỉ tác động một bản ghi.
Ví dụ:
SQL
UPDATE orders
SETstatus='paid';
không có WHERE nên có thể thay đổi trạng thái của toàn bộ hàng trong bảng. Tương tự:
SQL
DELETEFROMorders;
có thể xóa toàn bộ dữ liệu của bảng nhưng vẫn giữ cấu trúc bảng.
Trong thực tế, trước một thao tác cập nhật quan trọng, có thể kiểm tra tập dữ liệu mục tiêu bằng một truy vấn SELECT sử dụng cùng điều kiện:
SQL
SELECT *
FROM orders
WHEREorder_id=5004;
Sau khi xác nhận đúng phạm vi mới thực hiện UPDATE hoặc DELETE. Cách làm này đặc biệt hữu ích khi điều kiện tác động đến nhiều bản ghi.
SQL cũng có thể cập nhật theo tập hợp thay vì phải viết một câu lệnh cho từng hàng. Đây là một trong những đặc trưng quan trọng của cách làm việc với dữ liệu quan hệ.
Ràng buộc và giao dịch giữ dữ liệu nhất quán thế nào?
Việc có thể thêm hoặc sửa dữ liệu chưa đủ. Cơ sở dữ liệu còn phải ngăn những trạng thái không hợp lệ.
SQL cho phép định nghĩa các ràng buộc như:
· PRIMARY KEY yêu cầu giá trị nhận diện bản ghi phải duy nhất
· FOREIGN KEY duy trì quan hệ tham chiếu giữa các bảng
· UNIQUE ngăn các giá trị trùng theo ràng buộc được định nghĩa
· NOT NULL không cho phép cột nhận NULL
· CHECK giới hạn giá trị theo một điều kiện
Ví dụ:
SQL
CREATETABLEorders (
order_idINTEGERPRIMARYKEY,
customer_idINTEGERNOTNULL,
total_amountDECIMAL(12,2)CHECK(total_amount>=0),
statusVARCHAR(20),
FOREIGNKEY(customer_id)
REFERENCEScustomers(customer_id)
);
Nếu một câu lệnh cố thêm đơn hàng với customer_id không tồn tại trong customers, ràng buộc khóa ngoại có thể khiến DBMS từ chối thao tác, tùy cấu hình và khả năng hỗ trợ của hệ quản trị.
Khi nhiều thay đổi phải được xem như một đơn vị công việc, transaction giúp tránh trạng thái chỉ hoàn thành một phần.
Giả sử một nghiệp vụ cần trừ tiền ở tài khoản A và cộng tiền vào tài khoản B. Nếu thao tác thứ nhất thành công nhưng thao tác thứ hai thất bại, dữ liệu sẽ sai nếu hai thay đổi không được quản lý cùng nhau.
Mô hình giao dịch thường là:
SQL
STARTTRANSACTION;
UPDATE accounts
SETbalance=balance-1000000
WHEREaccount_id=1;
UPDATE accounts
SETbalance=balance1000000
WHEREaccount_id=2;
COMMIT;
Nếu phát hiện lỗi trước khi xác nhận, có thể sử dụng ROLLBACK để hủy các thay đổi chưa được commit.
Cú pháp bắt đầu giao dịch và một số hành vi cụ thể khác nhau giữa PostgreSQL, MySQL, SQL Server, Oracle và các DBMS khác. Tuy nhiên, nguyên tắc chung là gom những thao tác có quan hệ nghiệp vụ vào cùng một transaction để chúng được kiểm soát như một đơn vị.
Transaction cũng liên quan tới mức cô lập khi nhiều người hoặc nhiều tiến trình cùng truy cập dữ liệu. SQL và DBMS phải cân bằng giữa tính nhất quán và khả năng xử lý đồng thời; vì vậy một giao dịch đúng về cú pháp chưa chắc đã phù hợp nếu mức cô lập hoặc logic cạnh tranh dữ liệu không được xem xét.
SQL được DBMS thực thi và nên dùng trong thực tế ra sao?
Một câu SQL không trực tiếp tự đi tìm từng byte dữ liệu. DBMS tiếp nhận câu lệnh, phân tích cú pháp, kiểm tra đối tượng và quyền truy cập, sau đó xây dựng kế hoạch để thực hiện yêu cầu.
Với một truy vấn như:
SQL
SELECT *
FROM orders
WHEREcustomer_id=101;
DBMS có thể chọn quét bảng hoặc sử dụng chỉ mục nếu có chỉ mục phù hợp và bộ tối ưu đánh giá phương án đó có lợi. Vì vậy, hai câu SQL cho cùng kết quả logic vẫn có thể có chi phí thực thi khác nhau.
Điều này tạo ra một ranh giới quan trọng: SQL mô tả kết quả cần đạt, còn DBMS chịu trách nhiệm thực hiện. Người viết SQL vẫn cần hiểu cấu trúc dữ liệu, điều kiện lọc, phép JOIN và chỉ mục để tránh những truy vấn gây xử lý dư thừa, nhưng không cần lập trình từng bước truy xuất vật lý.
Trong thực tế, một quy trình làm việc với dữ liệu quan hệ thường diễn ra như sau:
1. Xác định bảng và quan hệ chứa thông tin cần dùng
2. Chọn các cột cần truy vấn thay vì lấy dữ liệu không cần thiết
3. Thiết lập điều kiện WHERE đúng phạm vi
4. JOIN các bảng theo quan hệ phù hợp
5. Tổng hợp bằng GROUP BY khi cần
6. Kiểm tra phạm vi trước các thao tác UPDATE hoặc DELETE
7. Sử dụng transaction khi nhiều thay đổi phải thành công hoặc thất bại cùng nhau
8. Dùng ràng buộc trong cơ sở dữ liệu để bảo vệ các quy tắc toàn vẹn quan trọng
SQL có tiêu chuẩn chung, nhưng mỗi hệ quản trị có một SQL dialect riêng. Chẳng hạn cách giới hạn số hàng, khai báo cột tự tăng, xử lý chuỗi, kiểu dữ liệu hoặc một số lệnh quản trị có thể khác nhau. Vì vậy, kiến thức về SELECT, JOIN, khóa, ràng buộc và giao dịch có tính nền tảng, còn cú pháp chi tiết cần được đối chiếu với DBMS đang sử dụng.
SQL cũng không tự đảm bảo rằng một cơ sở dữ liệu được thiết kế tốt. Một câu truy vấn đúng cú pháp vẫn có thể trả kết quả sai về nghiệp vụ nếu quan hệ giữa các bảng bị hiểu sai. Tương tự, ràng buộc cơ sở dữ liệu bảo vệ được nhiều quy tắc toàn vẹn nhưng không thể thay thế toàn bộ logic nghiệp vụ của ứng dụng.
SQL làm việc với dữ liệu quan hệ bằng cách thao tác trên các bảng và khai thác quan hệ giữa chúng. SELECT đọc dữ liệu, JOIN kết nối thông tin giữa các bảng, INSERT/UPDATE/DELETE thay đổi bản ghi, còn khóa, ràng buộc và transaction giúp bảo vệ tính nhất quán.
Điểm cốt lõi là SQL chủ yếu mô tả dữ liệu cần đạt được, thay vì quy định từng bước xử lý. Khi hiểu được bảng, khóa, quan hệ và cách các câu lệnh tác động lên tập dữ liệu, người dùng có thể chuyển từ việc chỉ nhớ cú pháp sang thực sự sử dụng SQL để truy vấn và quản lý cơ sở dữ liệu quan hệ.
Hỏi đáp về SQL
SQL có phải là một hệ quản trị cơ sở dữ liệu không?
Không. SQL là ngôn ngữ dùng để giao tiếp với cơ sở dữ liệu. PostgreSQL, MySQL, SQL Server hay Oracle Database mới là các hệ quản trị cơ sở dữ liệu có khả năng tiếp nhận và thực thi SQL.
SQL có thao tác từng dòng dữ liệu giống ngôn ngữ lập trình thủ tục không?
Không nhất thiết. Cách sử dụng SQL phổ biến là mô tả một tập dữ liệu cần truy vấn hoặc thay đổi. Một câu UPDATE có thể tác động đến nhiều hàng cùng lúc nếu nhiều hàng thỏa điều kiện.
Khóa ngoại có bắt buộc phải dùng để JOIN hai bảng không?
Không. SQL có thể JOIN theo một điều kiện khác, nhưng khóa ngoại giúp biểu diễn và bảo vệ quan hệ tham chiếu giữa các bảng. Khi JOIN theo quan hệ nghiệp vụ, khóa chính và khóa ngoại thường cung cấp cơ sở rõ ràng nhất.
Cùng một câu SQL có chạy giống nhau trên mọi hệ quản trị không?
Phần cú pháp SQL nền tảng có nhiều điểm chung, nhưng các DBMS có dialect và phần mở rộng riêng. Vì vậy, các câu lệnh liên quan đến giới hạn kết quả, kiểu dữ liệu, tự tăng, hàm hệ thống hay quản lý giao dịch cần được kiểm tra theo hệ quản trị cụ thể.
