Tổng hợp kiến thức SQL từ Zero to Hero
Giới thiệu
Trong thế giới số ngày nay, dữ liệu được ví như "mỏ vàng" mới, và SQL (Structured Query Language) chính là chiếc cuốc, xẻng để bạn khai thác "mỏ vàng" đó. Hiểu đơn giản, SQL là ngôn ngữ tiêu chuẩn để bạn "trò chuyện", yêu cầu và thao tác với các cơ sở dữ liệu.
Dù bạn là một nhà phân tích dữ liệu, kỹ sư phần mềm, hay nhà quản lý sản phẩm, kỹ năng SQL đều là một lợi thế cạnh tranh không thể thiếu.
Bài viết này được thiết kế như một lộ trình toàn diện, dẫn dắt bạn từ những viên gạch nền móng đầu tiên về cơ sở dữ liệu đến việc xây dựng các truy vấn phức tạp để phân tích và thao tác dữ liệu.
Hãy tưởng tượng bạn vừa được thuê bởi "Kako Corp", một gã khổng lồ công nghệ vừa phải đối mặt với một vụ rò rỉ dữ liệu nghiêm trọng. Nhiệm vụ của bạn là sử dụng SQL để tìm ra manh mối và giải quyết bí ẩn này.
Hãy bắt đầu hành trình từ Zero đến Hero của bạn!
Phần 1: Nền Tảng - Cơ Sở Dữ Liệu là gì?
1. Định nghĩa Cơ sở dữ liệu (Database)
Cơ sở dữ liệu (CSDL) là một tập hợp dữ liệu được tổ chức một cách có hệ thống, đi kèm với các phương thức để truy cập và thao tác dữ liệu đó.
Amazon ban đầu có thể quản lý đơn hàng bằng Excel, nhưng khi dữ liệu lên tới hàng triệu bản ghi, cần có CSDL để đảm bảo hiệu quả, toàn vẹn và dễ truy xuất.
2. Hệ Quản trị Cơ sở dữ liệu (DBMS)
DBMS (Database Management System) là phần mềm trung gian giữa người dùng và CSDL. Nó nhận các chỉ dẫn (câu lệnh SQL) và thực thi trên CSDL.
- RDBMS (Relational DBMS): Dành cho cơ sở dữ liệu quan hệ.
- Ví dụ: PostgreSQL, MySQL, MariaDB.
3. Mô hình Quan hệ (Relational Model)
Thay vì dùng một bảng Excel khổng lồ, mô hình quan hệ tổ chức dữ liệu thành nhiều bảng riêng biệt:
customers
: Thông tin khách hàngproducts
: Thông tin sản phẩmorders
: Thông tin đơn hàng
Ví dụ mối quan hệ:
Bảng orders | Bảng customers | Mô tả |
---|---|---|
order_id (PK) | customer_id (PK) | Mỗi khách hàng có ID duy nhất |
customer_id(FK) | first_name | customer_id là Khóa Ngoại |
order_date | last_name | Tham chiếu đến bảng customers để biết ai đặt hàng |
Phần 2: Những Bước Đầu Tiên với SQL - Truy Vấn Dữ Liệu
1. SQL là gì? Truy vấn (Query) là gì?
- SQL là ngôn ngữ để "nói chuyện" với CSDL.
- Query là tập lệnh gửi tới CSDL để truy vấn dữ liệu.
2. Câu lệnh SELECT
Cú pháp:
SELECT ten_cot_1, ten_cot_2 FROM ten_bang;
Ví dụ:
SELECT * FROM employees;
3. Lọc dữ liệu với WHERE
SELECT name FROM users WHERE role = 'manager';
4. Sắp xếp với ORDER BY
SELECT first_name, last_name FROM employees ORDER BY last_name DESC;
Phần 3: Nâng Cao Kỹ Năng Truy Vấn
1. Toán tử logic: AND
, OR
, NOT
Ví dụ:
SELECT * FROM customers
WHERE (state = 'NY' OR state = 'OR') AND gender = 'F';
2. Toán tử so sánh
=
: Bằng!=
,<>
: Không bằng>
,<
,>=
,<=
Ví dụ:
SELECT * FROM employees WHERE age > 30;
3. Từ khóa hữu ích
IN
BETWEEN
LIKE
(%
,_
)IS NULL
4. Hàm trong SQL
Hàm Tổng hợp (Aggregate Functions)
Hàm tổng hợp dùng để xử lý tập hợp các giá trị và trả về một kết quả duy nhất từ tập đó.
PostgreSQL hỗ trợ nhiều hàm tổng hợp tích hợp như: sum
, avg
, min
, max
, count
, array_agg
, json_agg
, string_agg
, xmlagg
, …
Lưu ý quan trọng:
- Ngoại trừ
count
, các hàm nhưsum(...)
trên tập rỗng sẽ trả vềNULL
, không phải 0. - Bạn có thể dùng
COALESCE
để thay NULL bằng giá trị mong muốn, ví dụ:COALESCE(SUM(amount), 0)
- Các hàm như
array_agg
,json_agg
hỗ trợ mệnh đềORDER BY
để kiểm soát thứ tự input.
Ví dụ các hàm phổ biến
COUNT(*)
,COUNT(column)
SUM(column)
AVG(column)
MIN(column)
,MAX(column)
STRING_AGG(column, delimiter)
ARRAY_AGG(column)
JSON_AGG(column)
XMLAGG(column)
Hàm Vô hướng (Scalar Functions)
Hàm vô hướng hoạt động trên từng hàng riêng lẻ và trả về một giá trị cho mỗi hàng.
Một số ví dụ:
CONCAT(str1, str2, …)
UPPER(str)
,LOWER(str)
SUBSTRING(str FROM x FOR y)
TRIM()
,LTRIM()
,RTRIM()
COALESCE(expr1, expr2, ...)
CAST(expr AS type)
hoặcexpr::type
- Các hàm ngày giờ:
EXTRACT(part FROM date)
,TO_CHAR(date, format)
,AGE()
,DATE_PART()
CASE WHEN … THEN … ELSE … END
Bạn có thể kết hợp hàm vô hướng với điều kiện lọc, tính toán, hoặc biến đổi trước khi dùng aggregate hoặc sắp xếp.
Ví dụ kết hợp Aggregate & Scalar
Giả sử bạn có bảng sales(amount, region, sale_date)
:
SELECT
region,
COUNT(*) AS num_sales,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount,
MIN(amount) AS min_amount,
MAX(amount) AS max_amount,
STRING_AGG(region, ',') AS regions_concat
FROM sales
GROUP BY region;
Hoặc bạn muốn tính trung bình doanh thu theo năm:
SELECT
EXTRACT(YEAR FROM sale_date) AS year,
AVG(amount) AS avg_by_year
FROM sales
GROUP BY year;
Một ví dụ dùng COALESCE
để tránh NULL:
SELECT
region,
COALESCE(SUM(amount), 0) AS total_amount_nonnull
FROM sales
GROUP BY region;
Phần 4: Kết Nối Dữ Liệu - JOIN
1. Tại sao cần JOIN?
Như đã đề cập ở Phần 1, dữ liệu trong CSDL quan hệ được chia thành nhiều bảng để tối ưu hóa việc lưu trữ. JOIN
là cơ chế cho phép chúng ta kết hợp các hàng từ hai hay nhiều bảng lại với nhau dựa trên một cột có liên quan (thường là khóa ngoại và khóa chính) để tạo ra một tập kết quả thống nhất.
2. Các loại JOIN phổ biến
🔹 INNER JOIN
Trả về các bản ghi có giá trị khớp ở cả hai bảng. Đây là loại join phổ biến nhất.
Ví dụ: Lấy tên nhân viên và mức lương tương ứng của họ bằng cách kết nối bảng employees
và salaries
.
SELECT
e.first_name,
s.salary
FROM
employees AS e
INNER JOIN
salaries AS s ON e.emp_no = s.emp_no;
🔹 LEFT JOIN (LEFT OUTER JOIN)
Trả về tất cả các bản ghi từ bảng bên trái (bảng đầu tiên) và các bản ghi khớp từ bảng bên phải. Nếu không khớp, cột từ bảng bên phải sẽ là NULL
.
SELECT
e.first_name,
s.salary
FROM
employees AS e
LEFT JOIN
salaries AS s ON e.emp_no = s.emp_no;
🔹 RIGHT JOIN (RIGHT OUTER JOIN)
Ngược lại với LEFT JOIN
, trả về tất cả bản ghi từ bảng bên phải và những bản ghi khớp từ bảng bên trái.
SELECT
e.first_name,
s.salary
FROM
employees AS e
RIGHT JOIN
salaries AS s ON e.emp_no = s.emp_no;
3. SELF JOIN – Tự kết nối chính mình
SELF JOIN
là phép nối một bảng với chính nó, thường được sử dụng khi bảng có quan hệ đệ quy hoặc tham chiếu đến chính nó.
Ví dụ: Một bảng employees
có cột manager_id
tham chiếu đến emp_no
của quản lý trong cùng bảng.
SELECT
e1.first_name AS employee_name,
e2.first_name AS manager_name
FROM
employees AS e1
LEFT JOIN
employees AS e2 ON e1.manager_id = e2.emp_no;
4. CROSS JOIN – Tích Đề-các
CROSS JOIN
kết hợp tất cả các hàng từ bảng A với tất cả hàng từ bảng B (Cartesian Product). Dùng trong các trường hợp đặc biệt khi muốn tổ hợp mọi khả năng.
Ví dụ: Kết hợp mọi sản phẩm với mọi chương trình giảm giá.
SELECT
p.product_name,
d.discount_code
FROM
products AS p
CROSS JOIN
discounts AS d;
⚠️ Lưu ý: CROSS JOIN có thể tạo ra số lượng bản ghi rất lớn nếu hai bảng có nhiều hàng.
Phần 5: Gom Nhóm và Phân Tích Dữ Liệu
1. GROUP BY
SELECT
d.department_name,
COUNT(e.emp_no)
FROM
employees AS e
JOIN
dept_emp AS de ON e.emp_no = de.emp_no
JOIN
departments AS d ON de.dept_no = d.dept_no
GROUP BY
d.department_name;
2. HAVING
vs WHERE
WHERE
: lọc trước khi gom nhómHAVING
: lọc sau khi gom nhóm
Ví dụ:
HAVING COUNT(e.emp_no) > 25000;
Phần 6: DDL và DML
1. DDL - Data Definition Language
Dùng để tạo/sửa/xóa cấu trúc bảng.
Ví dụ:
CREATE TABLE student (
student_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
first_name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
2. DML - Data Manipulation Language
INSERT INTO
UPDATE
DELETE FROM
Phần 7: Các Kỹ Thuật Chuyên Nghiệp
Một số kỹ thuật nâng cao để bạn học thêm:
- Subqueries (Truy vấn con)
- Window Functions
- Transactions (Giao dịch - đảm bảo tính ACID)
- Indexes (Chỉ mục - tăng tốc truy vấn)
Kết luận
Chúng ta đã đi qua:
- CSDL là gì
- SELECT và lọc dữ liệu
- JOIN để kết nối dữ liệu
- GROUP BY & HAVING để phân tích dữ liệu
- Tạo bảng, thêm dữ liệu
- Kỹ thuật nâng cao
Nhưng nhớ: Học SQL không chỉ là đọc - mà là phải thực hành.
Hãy tìm các bộ dữ liệu, làm dự án nhỏ, tham gia cộng đồng SQL. Hành trình từ Zero đến Hero được xây dựng trên sự kiên trì và luyện tập.
Chúc bạn thành công!
All rights reserved