hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • MySQL
Truy Vấn Con (SUBQUERY) và Biểu Thức Bảng Chung (CTE) Trong MySQL

Truy Vấn Con (SUBQUERY) và Biểu Thức Bảng Chung (CTE) Trong MySQL

  • 08-07-2025
  • Toanngo92
  • 0 Comments

Truy vấn SQL nâng cao: SUBQUERY (truy vấn con) và CTE (Common Table Expression) — hai kỹ thuật mạnh mẽ sử dụng để tổ chức truy vấn logic, sạch và hiệu quả hơn trong các hệ cơ sở dữ liệu quan hệ.


Mục lục

  • ✅ 1. SUBQUERY là gì?
  • 🔸 1.1. Subquery trong WHERE
  • 🔸 1.2. Subquery trong SELECT
  • 🔸 1.3. Subquery trong FROM (inline view)
  • 🔸 1.4. Subquery có trả về 1 giá trị (scalar)
  • ✅ 2. CTE – Common Table Expression
  • 🔸 2.1. Cú pháp cơ bản
  • 🔸 2.2. Ví dụ đơn giản
  • 🔸 2.3. CTE có thể JOIN, GROUP BY, RANK, v.v.
  • 🔸 2.4. CTE đệ quy (recursive CTE)
  • ✅ So sánh nhanh SUBQUERY vs CTE
  • 💡 Khi nào dùng SUBQUERY và khi nào dùng CTE?
  • 📘 Kết Luận

✅ 1. SUBQUERY là gì?

Subquery (truy vấn con) là một câu lệnh SELECT được lồng trong:

  • SELECT, FROM, WHERE, hoặc HAVING
  • Giúp truy vấn theo điều kiện phức tạp, có phụ thuộc vào dữ liệu khác

🔸 1.1. Subquery trong WHERE

SELECT name
FROM Students
WHERE id IN (
    SELECT student_id FROM Enrollments WHERE subject = 'Math'
);

Lấy tên sinh viên học môn Toán.


🔸 1.2. Subquery trong SELECT

SELECT 
    name,
    (SELECT COUNT(*) FROM Orders WHERE Orders.customer_id = Customers.id) AS total_orders
FROM Customers;

Truy vấn số đơn hàng mỗi khách hàng ngay trong SELECT.


🔸 1.3. Subquery trong FROM (inline view)

SELECT avg_amount
FROM (
    SELECT AVG(amount) AS avg_amount FROM Orders
) AS sub;

Tạo bảng tạm thời chứa giá trị trung bình để xử lý tiếp.


🔸 1.4. Subquery có trả về 1 giá trị (scalar)

SELECT name
FROM Customers
WHERE id = (SELECT customer_id FROM Orders WHERE amount = (SELECT MAX(amount) FROM Orders));

Lấy tên khách hàng có đơn hàng lớn nhất.


✅ 2. CTE – Common Table Expression

Từ MySQL 8.0 trở lên, bạn có thể sử dụng WITH ... AS để tạo CTE – một cách đặt tên cho truy vấn con và tái sử dụng trong câu truy vấn.


🔸 2.1. Cú pháp cơ bản

WITH cte_name AS (
    SELECT ...
)
SELECT * FROM cte_name;

🔸 2.2. Ví dụ đơn giản

WITH HighValueOrders AS (
    SELECT * FROM Orders WHERE amount > 300
)
SELECT * FROM HighValueOrders;

CTE giúp viết truy vấn sạch hơn, dễ đọc hơn thay vì lồng nhiều cấp.


🔸 2.3. CTE có thể JOIN, GROUP BY, RANK, v.v.

WITH OrderTotals AS (
    SELECT customer_id, SUM(amount) AS total
    FROM Orders
    GROUP BY customer_id
)
SELECT Customers.name, OrderTotals.total
FROM Customers
JOIN OrderTotals ON Customers.id = OrderTotals.customer_id;

🔸 2.4. CTE đệ quy (recursive CTE)

Dùng trong cây thư mục, tổ chức cấp bậc…

WITH RECURSIVE numbers AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM numbers WHERE n < 5
)
SELECT * FROM numbers;

📌 Kết quả: 1 → 5


✅ So sánh nhanh SUBQUERY vs CTE

Tiêu chíSubqueryCTE
Viết trongSELECT, WHERE, FROMĐịnh nghĩa riêng biệt với WITH
Tái sử dụng❌ Không✅ Có thể dùng nhiều lần
Dễ đọc👎 Khi lồng nhiều truy vấn✅ Rất sạch, rõ ràng
Hỗ trợ đệ quy❌ Không✅ Có (WITH RECURSIVE)
Yêu cầu phiên bản✅ Mọi phiên bản✅ MySQL >= 8.0

💡 Khi nào dùng SUBQUERY và khi nào dùng CTE?

  • Dùng SUBQUERY khi:
    • Truy vấn đơn giản, nhanh gọn
    • Cần điều kiện lọc phụ thuộc bảng khác
  • Dùng CTE khi:
    • Truy vấn phức tạp cần chia thành nhiều bước
    • Muốn tái sử dụng hoặc dễ đọc
    • Cần xử lý đệ quy (cây phân cấp)

📘 Kết Luận

  • SUBQUERY và CTE là hai công cụ không thể thiếu trong xử lý truy vấn nâng cao.
  • CTE được xem là “phiên bản nâng cấp” của subquery nhờ cấu trúc rõ ràng, dễ tái sử dụng.
  • Hãy luôn chọn cách viết giúp truy vấn dễ hiểu, bảo trì tốt, đặc biệt trong hệ thống lớn.

Bài viết liên quan:

TCL Trong MySQL – Quản Lý Giao Dịch Với COMMIT, ROLLBACK, SAVEPOINT
FUNCTION Trong MySQL – Định Nghĩa Hàm Tùy Chỉnh Trả Về Giá Trị
TRIGGER Trong MySQL – Kích Hoạt Tự Động Khi Dữ Liệu Thay Đổi
Giao Dịch (Transaction) Trong MySQL — START TRANSACTION, COMMIT, ROLLBACK
Stored Procedure Trong MySQL — thủ tục lưu trữ
Tăng Tốc Truy Vấn Dữ Liệu Với INDEX Trong MySQL
VIEW Trong MySQL — Bảng Ảo Từ Truy Vấn
Điều Kiện Trong Truy Vấn Với CASE WHEN và Wildcard, REGEXP trong MySQL
Kết Hợp Dữ Liệu Từ Nhiều Bảng Với JOIN Trong MySQL
Hàm Tổng Hợp và Nhóm Dữ Liệu Trong MySQL: GROUP BY, HAVING
Truy Vấn Dữ Liệu Với SELECT Trong MySQL
Các Lệnh DML Cơ Bản Trong MySQL: INSERT, UPDATE, DELETE

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Truy Vấn Dữ Liệu Với SELECT Trong MySQL

Các Lệnh DML Cơ Bản Trong MySQL: INSERT, UPDATE, DELETE

TCL Trong MySQL – Quản Lý Giao Dịch Với COMMIT, ROLLBACK, SAVEPOINT

DCL Trong MySQL – Quản Lý Quyền Truy Cập Với GRANT và REVOKE

FUNCTION Trong MySQL – Định Nghĩa Hàm Tùy Chỉnh Trả Về Giá Trị

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×