+1

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àng
  • products: Thông tin sản phẩm
  • orders: 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ặc expr::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 employeessalaries.

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óm
  • HAVING: 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí