MySQL - Các Biểu Thức Bảng Thông Thường: Hướng Dẫn Cho Người Mới Bắt Đầu

Xin chào các bạn, những法师 cơ sở dữ liệu tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới của MySQL Common Table Expressions (CTEs). Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ cùng nhau từng bước. Cuối cùng của bài hướng dẫn này, bạn sẽ có thể tạo ra CTEs như một chuyên gia!

MySQL - Common Table Expressions

Các Biểu Thức Bảng Thông Thường Là Gì?

Trước khi chúng ta đi sâu vào, hãy bắt đầu từ những điều cơ bản. Hãy tưởng tượng bạn đang tổ chức một bữa tiệc lớn (vì ai lại không thích một buổi tiệc dữ liệu tốt, phải không?). Bạn có thể lập danh sách khách mời, danh sách thức ăn và danh sách các hoạt động. Những danh sách này giúp bạn tổ chức suy nghĩ và dễ dàng hơn trong việc lập kế hoạch. Các Biểu Thức Bảng Thông Thường giống như những danh sách đó, nhưng cho các truy vấn dữ liệu của bạn!

Một Biểu Thức Bảng Thông Thường, hay CTE cho ngắn, là một tập kết quả tạm thời có tên mà bạn có thể tham chiếu trong một câu lệnh SELECT, INSERT, UPDATE, DELETE hoặc MERGE. Nó giống như tạo một bảng tạm thời chỉ tồn tại trong suốt thời gian truy vấn của bạn. Đúng là thú vị phải không?

Câu Lệnh MySQL WITH: Cây Đ魔法 Cho CTE

Trong MySQL, chúng ta sử dụng câu lệnh WITH để tạo một CTE. Nó giống như nói, "Hey MySQL, tôi muốn tạo một tập kết quả tạm thời, và tôi sẽ gọi nó là X." Hãy nhìn vào một ví dụ đơn giản:

WITH cte_name AS (
SELECT column1, column2
FROM table_name
WHERE condition
)
SELECT * FROM cte_name;

Hãy phân tích này:

  1. WITH告诉MySQL chúng ta đang định nghĩa một CTE.
  2. cte_name là tên chúng ta đặt cho CTE của mình (bạn có thể chọn bất kỳ tên nào bạn thích).
  3. AS được theo sau bởi truy vấn định nghĩa dữ liệu sẽ có trong CTE của chúng ta.
  4. Sau khi định nghĩa CTE, chúng ta có truy vấn chính sử dụng CTE.

Bây giờ, hãy thử một ví dụ thực tế. Hãy tưởng tượng chúng ta có một bảng học sinh và điểm số của họ:

CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
grade INT
);

INSERT INTO students VALUES
(1, 'Alice', 85),
(2, 'Bob', 92),
(3, 'Charlie', 78),
(4, 'Diana', 95),
(5, 'Eva', 88);

WITH high_achievers AS (
SELECT name, grade
FROM students
WHERE grade > 90
)
SELECT * FROM high_achievers;

Trong ví dụ này, chúng ta đã tạo một CTE叫做 high_achievers chỉ bao gồm học sinh có điểm số trên 90. Sau đó, chúng ta đã chọn tất cả các cột từ CTE này. Kết quả sẽ hiển thị Bob và Diana, những học sinh xuất sắc của chúng ta!

CTEs Từ Nhiều Bảng: Tham gia Bữa Tiệc

CTEs không giới hạn chỉ một bảng. Oh không, chúng có thể phức tạp như bạn cần! Hãy thêm một bảng môn học vào cơ sở dữ liệu trường học của chúng ta:

CREATE TABLE courses (
id INT PRIMARY KEY,
name VARCHAR(50),
teacher VARCHAR(50)
);

INSERT INTO courses VALUES
(1, 'Math', 'Mr. Smith'),
(2, 'Science', 'Ms. Johnson'),
(3, 'History', 'Mrs. Brown');

CREATE TABLE enrollments (
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);

INSERT INTO enrollments VALUES
(1, 1), (1, 2), (2, 2), (3, 3), (4, 1), (4, 3), (5, 2);

WITH student_courses AS (
SELECT s.name AS student_name, c.name AS course_name
FROM students s
JOIN enrollments e ON s.id = e.student_id
JOIN courses c ON e.course_id = c.id
),
science_students AS (
SELECT student_name
FROM student_courses
WHERE course_name = 'Science'
)
SELECT * FROM science_students;

Wow, đó là rất nhiều! Hãy phân tích nó:

  1. Chúng ta đã tạo hai bảng mới: coursesenrollments.
  2. Chúng ta đã định nghĩa một CTE叫做 student_courses để kết hợp các bảng này và nhận được danh sách học sinh và môn học của họ.
  3. Chúng ta đã định nghĩa một CTE khác叫做 science_students sử dụng CTE đầu tiên để tìm học sinh học môn Khoa học.
  4. Cuối cùng, chúng ta đã chọn tất cả học sinh khoa học.

Truy vấn này sẽ hiển thị Alice, Bob và Eva - những nhà khoa học tương lai của chúng ta!

Sức Mạnh của CTEs: Tại Sao Bạn Nên Quan Tâm?

Bạn có thể đang tự hỏi, "Tại sao lại phiền phức như vậy? Tôi không thể chỉ sử dụng subquery sao?" Câu hỏi tuyệt vời! CTEs mang lại nhiều ưu thế:

  1. Đọcibility: CTEs giúp làm cho các truy vấn phức tạp dễ đọc và dễ hiểu hơn. Nó giống như chia một vấn đề lớn thành những phần nhỏ, dễ quản lý.

  2. Tính tái sử dụng: Bạn có thể tham chiếu một CTE nhiều lần trong truy vấn chính của mình, điều này có thể hiệu quả hơn việc lặp lại subqueries.

  3. Tính đệ quy: CTEs có thể đệ quy, cho phép bạn làm việc với dữ liệu phân cấp hoặc cấu trúc cây dễ dàng (nhưng đó là chủ đề cho một ngày khác!).

Các Phương Thức CTE: Dao多点 của Công Cụ Truy Vấn

Hãy tóm tắt các cách khác nhau bạn có thể sử dụng CTEs trong một bảng tiện dụng:

Phương Thức Mô Tả Ví Dụ
CTE Cơ Bản Định nghĩa một tập kết quả tạm thời có tên WITH cte AS (SELECT * FROM table)
Nhiều CTE Định nghĩa nhiều CTE trong một truy vấn WITH cte1 AS (...), cte2 AS (...)
CTE Đệ Quy Sử dụng một CTE trong chính nó WITH RECURSIVE cte AS (...)

Nhớ rằng, như bất kỳ công cụ mạnh mẽ nào, hãy sử dụng CTEs một cách khôn ngoan. Chúng rất hữu ích cho việc tổ chức các truy vấn phức tạp, nhưng cho các thao tác đơn giản, một câu lệnh SELECT đơn giản có thể là đủ.

Kết Luận: Hành Trình CTE Của Bạn Bắt Đầu!

Chúc mừng! Bạn đã bước những bước đầu tiên vào thế giới của Common Table Expressions. Chúng ta đã bao gồm các nguyên tắc cơ bản, cách sử dụng câu lệnh WITH, và thậm chí là CTE đa bảng. Nhớ rằng, thực hành là cách tốt nhất để trở nên thành thạo, vì vậy đừng ngần ngại thử nghiệm với cơ sở dữ liệu của riêng bạn.

Trong hành trình MySQL của bạn, bạn sẽ thấy CTEs là những công cụ quý giá trong bộ công cụ truy vấn của bạn. Chúng sẽ giúp bạn viết mã sạch sẽ, hiệu quả và dễ bảo trì hơn. Và biết đâu, có thể một ngày nào đó bạn sẽ là người dạy người khác về phép màu của CTEs!

Tiếp tục lập mã, 保持好奇心, và mong rằng các truy vấn của bạn luôn trả về kết quả bạn mong đợi! Đến gặp lại, chúc may mắn trong việc xử lý dữ liệu!

Credits: Image by storyset