SQL (Structured Query Language) là ngôn ngữ chung được hầu hết mọi cơ sở dữ liệu quan hệ nghiêm túc trên hành tinh sử dụng—từ PostgreSQL, MySQLvà SQLite đến các hệ thống thương mại như SQL Server và Oracle. Nó cho phép bạn định nghĩa cấu trúc dữ liệu, lưu trữ dữ liệu, truy vấn hiệu quả và thực thi các quy tắc về cách dữ liệu đó hoạt động.
Dưới đây là một chuyến tham quan sâu về SQL khoảng 2.500 từ: nó là gì, cách hoạt động và cách sử dụng tốt trong các hệ thống thực tế.
SQL là ngôn ngữ khai báo: bạn mô tả cái gì dữ liệu bạn muốn, và cơ sở dữ liệu quyết định cách lấy nó. Các hướng dẫn như hướng dẫn SQL trên W3Schools và loạt bài W3Schools.in SQL giới thiệu SQL như một ngôn ngữ tiêu chuẩn để lưu trữ, thao tác và truy xuất dữ liệu trên nhiều công cụ cơ sở dữ liệu.
Vì SQL được chuẩn hóa và hỗ trợ rộng rãi, bạn có thể áp dụng cùng một mô hình tinh thần trên:
Hầu hết dữ liệu kinh doanh hàng ngày—đơn hàng, người dùng, thanh toán, nhật ký, phân tích—cuối cùng được lưu trữ trong các bảng mà bạn có thể truy vấn bằng SQL.
SQL được chuẩn hóa bởi họ tiêu chuẩn ISO/IEC 9075 , định nghĩa ngôn ngữ cốt lõi và nhiều phần mở rộng tùy chọn. Tiêu chuẩn đã phát triển qua các phiên bản như SQL-86, SQL-92, SQL:1999, SQL:2003 và lên đến SQL:2023. Các bài viết như tổng quan của ANSI về tiêu chuẩn SQL ISO/IEC 9075:2023 giải thích cách các tiêu chuẩn ANSI và ISO liên kết theo thời gian.
Bản thân tiêu chuẩn được chia thành nhiều phần, chẳng hạn như:
Bạn có thể xem danh sách đầy đủ trên trang catalog ISO cho SQL và trên các tài nguyên như phân tích các phần tiêu chuẩn của Modern SQL.
Trong thực tế, mỗi cơ sở dữ liệu triển khai phương ngữ riêng:
Các khái niệm cốt lõi—bảng, hàng, cột, kết nối, tổng hợp—có thể di chuyển được, nhưng bất kỳ hệ thống không tầm thường nào sẽ liên quan đến việc học các đặc điểm và tính năng của một phương ngữ cụ thể.
Ở cốt lõi, SQL được thiết kế xung quanh mô hình quan hệ: dữ liệu sống trong bảng (quan hệ), nơi mỗi hàng đại diện cho một sự kiện và mỗi cột mô tả một thuộc tính.
Các phần tử điển hình bao gồm:
customers, ordersid, name, order_date, total_amountid)orders.customer_id → customers.id)Các hướng dẫn chuẩn hóa—như hướng dẫn DigitalOcean về chuẩn hóa hoặc giải thích của freeCodeCamp về 1NF, 2NF, 3NF—định khung thiết kế quan hệ tốt như giảm thiểu dư thừa và ngăn chặn các bất thường cập nhật bằng cách chia dữ liệu thành các bảng có cấu trúc tốt và liên kết chúng với các khóa.
Khi bạn truy vấn bằng SQL, về cơ bản bạn đang hỏi cơ sở dữ liệu: "Từ các bảng này, trong các điều kiện này, tôi nên thấy những hàng và cột nào?"
Câu lệnh SELECT là công cụ chính của SQL và có thể là lệnh phức tạp nhất của nó. Tham chiếu SQLite SELECT gọi nó là "lệnh phức tạp nhất trong ngôn ngữ SQL", và cả tài liệu MySQL SELECT và các hướng dẫn như hướng dẫn SELECT của SQLite Tutorial đi qua nhiều tùy chọn của nó.
SELECT id, name
FROM customers;Các phần chính:
SELECT liệt kê các cột (hoặc * cho tất cả các cột, mặc dù thường tốt hơn là rõ ràng).FROM chọn một hoặc nhiều bảng.WHERE lọc các hàng.ORDER BY sắp xếp kết quả.LIMIT giới hạn số hàng bạn thấy.SELECT id, name, created_at
FROM customers
WHERE active = TRUE
ORDER BY created_at DESC
LIMIT 50;Các hướng dẫn giới thiệu như hướng dẫn SQL của W3Schools và tổng quan W3Schools MySQL về các lệnh chung sử dụng SELECT để cho thấy cách bạn trích xuất dữ liệu từ các bảng trong một biểu thức duy nhất, dễ đọc.
SQL tỏa sáng khi bạn kết hợp lọc và biểu thức trực tiếp trong truy vấn:
SELECT
id,
total_amount,
total_amount * 0.1 AS tax_estimate
FROM orders
WHERE status = 'paid'
AND total_amount >= 100
ORDER BY total_amount DESC;Mệnh đề WHERE có thể sử dụng các toán tử so sánh (=, <>, >, <), toán tử logic (AND, OR, NOT), khớp mẫu (LIKE, ILIKE) và hơn thế nữa. Các cơ sở dữ liệu như MySQL tài liệu một bộ phong phú hàm và toán tử tích hợp cho số, chuỗi, ngày/giờ, JSON và các thao tác khác.
Bạn cũng có thể:
IN để khớp với một danh sách: WHERE status IN ('paid', 'refunded')BETWEEN cho phạm vi: WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31'IS NULL / IS NOT NULL để xử lý các giá trị thiếuCác hướng dẫn và sổ tay tốt nhấn mạnh rằng biểu thức xuất hiện trong nhiều mệnh đề—WHERE, ORDER BY, HAVING và thậm chí trong chính SELECT. Tài liệu MySQL làm nổi bật điều này trong phần của họ về đánh giá biểu thức trong chương hàm và toán tử.
Cơ sở dữ liệu thực tế hiếm khi giữ mọi thứ trong một bảng duy nhất. Thay vào đó, bạn chuẩn hóa dữ liệu thành nhiều bảng và kết nối chúng khi bạn truy vấn. Các kết nối được bao phủ rộng rãi trong các tài nguyên như trang W3Schools về kết nối SQL, hướng dẫn kết nối của GeeksforGeeks, tổng quan kết nối của TutorialsPointvà các hướng dẫn tương tác như hướng dẫn kết nối SQL trên SQL Practice Online.
SELECT
o.id,
c.name,
o.order_date,
o.total_amount
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id;Các loại kết nối phổ biến:
Các giải thích trực quan và nặng về mã, chẳng hạn như bài viết "SQL joins được giải thích" của DbSchema hoặc ví dụ kết nối của LearnSQL.com, là những cách tuyệt vời để xây dựng trực giác mạnh mẽ về cách các kết nối hoạt động.
Để tóm tắt dữ liệu—tổng, trung bình, đếm—bạn sử dụng hàm tổng hợp (COUNT, SUM, AVG, MIN, MAX) với GROUP BY:
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(total_amount) AS total_spent
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(total_amount) >= 1000
ORDER BY total_spent DESC;Các tham chiếu như chương hàm và toán tử của MySQL và tài liệu PostgreSQL về hàm tổng hợp và cửa sổ liệt kê các hàm tích hợp bạn có thể sử dụng trong các biểu thức này.
SQL hiện đại cũng hỗ trợ hàm cửa sổ, cho phép bạn tính toán tổng hợp trên các "cửa sổ" hàng trượt trong khi vẫn trả về các hàng riêng lẻ—ví dụ: tổng chạy hoặc xếp hạng. Hàm cửa sổ đi vào SQL thông qua các sửa đổi cho SQL:1999, sau đó được tích hợp vào SQL:2003, như được tóm tắt trong các ghi chú về tiêu chuẩn SQL:1999 và SQL:2003.
SELECT
customer_id,
order_date,
total_amount,
SUM(total_amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS running_total
FROM orders;Loại truy vấn này cực kỳ mạnh mẽ cho phân tích trực tiếp trong cơ sở dữ liệu.
SQL không chỉ để truy vấn; nó cũng định nghĩa hình dạng của dữ liệu của bạn thông qua các câu lệnh Data Definition Language (DDL), được tài liệu hóa tốt trong các phần như hướng dẫn Định nghĩa Dữ liệu của PostgreSQL và chương câu lệnh SQL của MySQL.
Các lệnh DDL phổ biến:
CREATE DATABASE my_app; – tạo cơ sở dữ liệuCREATE TABLE customers (...); – định nghĩa bảngALTER TABLE customers ADD COLUMN phone TEXT; – thay đổi cấu trúc bảngDROP TABLE customers; – xóa bảngCREATE TABLE customers (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
active BOOLEAN NOT NULL DEFAULT TRUE
);Những điểm cần lưu ý:
PRIMARY KEY, UNIQUE, NOT NULL, biểu thức CHECKMọi sổ tay RDBMS chính—phần ngôn ngữ SQL của PostgreSQL, sổ tay tham khảo MySQLvà tham chiếu ngôn ngữ SQLite—nhấn mạnh suy nghĩ cẩn thận về DDL, vì các quyết định lược đồ khó thay đổi sau này.
Cơ sở dữ liệu SQL thường triển khai các thuộc tính ACID— Atomicity, Consistency, Isolation, Durability—thông qua giao dịch:
BEGIN;
UPDATE accounts
SET balance = balance - 200
WHERE id = 1;
UPDATE accounts
SET balance = balance + 200
WHERE id = 2;
COMMIT;Nếu bất cứ điều gì thất bại giữa BEGIN và COMMIT, giao dịch có thể được hoàn nguyên để các thay đổi trung gian không rò rỉ vào cơ sở dữ liệu.
Phần của MySQL về câu lệnh giao dịch và khóa bao gồm START TRANSACTION, COMMIT, ROLLBACK và các điểm lưu, trong khi các chương của PostgreSQL về kiểm soát đồng thời và quản lý giao dịch giải thích cách các mức cô lập và MVCC hoạt động dưới mui xe.
Ràng buộc—như khóa ngoại hoặc ràng buộc kiểm tra—là cách của cơ sở dữ liệu thực thi các quy tắc kinh doanh:
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers (id);Khi được sử dụng tốt, chúng biến cơ sở dữ liệu của bạn thành người bảo vệ các bất biến, ngăn chặn dữ liệu không hợp lệ tại nguồn thay vì chỉ dựa vào logic ứng dụng.
Có được lược đồ đúng thường quan trọng hơn các truy vấn thông minh. Chuẩn hóa là quá trình cấu trúc các bảng để giảm dư thừa và cải thiện tính nhất quán. Các hướng dẫn như:
Tiến trình điển hình:
Chuẩn hóa quá mức có thể làm tổn hại hiệu suất và làm phức tạp các truy vấn; các nhóm thực tế thường chuẩn hóa đến 3NF và sau đó phi chuẩn hóa có chọn lọc (ví dụ: lưu vào bộ nhớ cache các tổng hợp) ở những nơi hiệu suất yêu cầu.
Chỉ mục là công cụ chính để làm cho các truy vấn SQL nhanh. Chúng là các cấu trúc dữ liệu phụ trợ cho phép cơ sở dữ liệu nhảy thẳng đến các hàng liên quan thay vì quét toàn bộ bảng.
Một tài nguyên được tôn trọng sâu sắc về lập chỉ mục là Use The Index, Luke! của Markus Winand, một cuốn sách trực tuyến miễn phí tập trung hoàn toàn vào hiệu suất SQL và chiến lược lập chỉ mục. Trang chính của trang web, UseTheIndexLuke.com, và các bài viết như "Điều chỉnh hiệu suất lập chỉ mục LIKE filters" và "Nhiều chỉ mục hơn, INSERT chậm hơn" giải thích khi nào chỉ mục giúp và khi nào chúng gây hại.
Các ý tưởng chính:
WHERE email = ..., WHERE created_at >= ...).(customer_id, created_at) hoạt động tốt cho WHERE customer_id = ? AND created_at >= ?.SELECT, UPDATE và DELETE với bộ lọc, nhưng làm chậm chèn vì mỗi lần chèn phải cập nhật tất cả các chỉ mục liên quan.Các hướng dẫn như bài viết MSSQLTips về thiết kế chỉ mục SQL Server chứng minh cách lựa chọn cột và thứ tự trong chỉ mục ảnh hưởng đến các truy vấn thực tế.
Các quy tắc thực tế:
EXPLAIN ANALYZE của cơ sở dữ liệu để xem cách các truy vấn được thực thi.Trong khi các nguyên tắc cơ bản vẫn ổn định, SQL hiện đại đã phát triển đáng kể:
WITH cho phép các truy vấn dễ đọc hơn, mô-đun hơn:WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT customer_id, COUNT(*)
FROM recent_orders
GROUP BY customer_id;Bản thân tiêu chuẩn SQL đã thêm các phần cho XML, mảng đa chiều và các truy vấn property graph, như được tài liệu trong catalog tiêu chuẩn SQL ISO và trong các bài viết về sự tiến hóa của SQL như bài viết tiêu chuẩn SQL ANSI.
SQL hiện đại đủ mạnh để nhiều ứng dụng có thể đẩy logic phức tạp —phân cấp, phân tích, xử lý sự kiện—xuống lớp cơ sở dữ liệu.
Vì SQL vẫn là nền tảng cho công việc dữ liệu, có một hệ sinh thái phong phú về tài nguyên học tập:
Chiến lược học tập thực tế:
WHERE, ORDER BYvà LIMIT.GROUP BY.EXPLAIN.Nếu bạn có thể đọc và viết SQL một cách thoải mái, bạn có thể kiểm tra dữ liệu trực tiếp trong sản xuất, xây dựng báo cáo mà không cần xuất sang bảng tính, gỡ lỗi logic ứng dụng bằng cách xem các bảng cơ bản và cộng tác hiệu quả hơn với các kỹ sư và nhà phân tích.
SQL nằm ở một giao lộ độc đáo: nó hơn 40 tuổi, nhưng vẫn liên quan sâu sắc trong các hệ thống cloud-native, tập trung vào phân tích ngày nay. Tiêu chuẩn ISO/IEC 9075 và nhiều phần của nó tiếp tục phát triển, trong khi các cơ sở dữ liệu mã nguồn mở như PostgreSQL, MySQLvà SQLite thúc đẩy các tính năng thực tế và cải thiện hiệu suất.
Nếu bạn làm việc với dữ liệu—nhà phát triển, nhà phân tích, nhà khoa học dữ liệu hoặc người quản lý sản phẩm—SQL là ngôn ngữ chung cho phép bạn đặt câu hỏi trực tiếp cho cơ sở dữ liệu. Đáng học một lần và nó sẽ trả lại cho phần còn lại của sự nghiệp của bạn.
Định dạng SQL là quá trình tổ chức các truy vấn SQL với thụt lề phù hợp, ngắt dòng và chữ hoa/chữ thường của từ khóa để cải thiện khả năng đọc và bảo trì.
Trình định dạng của chúng tôi hỗ trợ nhiều phương ngữ SQL bao gồm MySQL, PostgreSQL, SQL Server, SQLite, Oracle và nhiều phương ngữ khác.
Có! Tất cả định dạng SQL xảy ra hoàn toàn trong trình duyệt của bạn. Truy vấn của bạn không bao giờ rời khỏi máy tính của bạn, đảm bảo quyền riêng tư và bảo mật hoàn toàn.
Có, bạn có thể định dạng nhiều câu lệnh SQL cùng một lúc. Trình định dạng sẽ xử lý từng câu lệnh một cách phù hợp dựa trên phương ngữ đã chọn.
Trình định dạng sẽ cố gắng định dạng SQL của bạn ngay cả khi nó chứa lỗi cú pháp. Tuy nhiên, bạn có thể thấy thông báo lỗi cho SQL không hợp l ệ không thể được phân tích cú pháp. Luôn xác thực SQL của bạn với hệ thống cơ sở dữ liệu của bạn.