- vừa được xem lúc

Tổng hợp kiến thức SQL từ Zero to Hero

0 0 3

Người đăng: Trần Quân

Theo Viblo Asia

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!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Stored Procedure trong SQL Server

Stored Procedure là 1 phần không thể thiếu của SQL Server. Chúng có thể hỗ trợ rất nhiều cho lập trình và cấu hình cơ sở dữ liệu.

0 0 185

- vừa được xem lúc

sử dụng index trong sql query

Index là một trong những yếu tố quan trọng nhất góp phần vào việc nâng cao hiệu suất của cơ sở dữ liệu. Index trong SQL tăng tốc độ của quá trình truy vấn dữ liệu bằng cách cung cấp phương pháp truy xuất nhanh chóng tới các dòng trong các bảng, tương tự như cách mà mục lục của một cuốn sách giúp bạn

0 0 287

- vừa được xem lúc

Hướng dẫn sửa lỗi không cài được SQL Server

Hôm qua do yêu cầu môn học, mình có cài lại Microsoft SQL Server. Trước đó mình có cài rồi, nhưng rồi lâu không dùng nên gỡ ra cho nhẹ máy. Bây giờ có dịp cần nên mình mới cài lại. Chi tiết lỗi mình gặp phải.

0 0 159

- vừa được xem lúc

Bạn nên tránh sử dụng Soft Delete khi có thể, và đây là lý do tại sao

Con người luôn luôn mắc sai lầm. Vì vậy, việc "lo xa" trước mọi tình huống xấu nhất chưa bao giờ là thừa.

0 0 226

- vừa được xem lúc

Sử dụng trigger trong SQL qua ví dụ cơ bản.

Trigger là gì . Cú pháp của Trigger. CREATE TRIGGER tên_trigger ON tên_bảng. FOR {DELETE, INSERT, UPDATE}.

0 0 179

- vừa được xem lúc

Khác biệt giữa khóa chính và khóa ngoại trong SQL

Các khoá chính và khóa ngoại là hai loại ràng buộc có thể được sử dụng để thực thi toàn vẹn dữ liệu trong các bảng SQL Server và đây là những đối tượng cơ sở dữ liệu quan trọng. Trong bài này, tôi muố

0 0 174