50+ Ví dụ MySQL thực tế từ cơ bản đến nâng cao

50+ Ví dụ MySQL thực tế từ cơ bản đến nâng cao

Khám phá hơn 50 ví dụ MySQL thực tế từ cơ bản đến nâng cao với các câu lệnh SELECT, INSERT, UPDATE, DELETE, JOIN, GROUP BY, Subquery, CASE, Window Function và nhiều tình huống áp dụng trong dự án thực tế, chi tiết như nào hãy cùng chúng tôi phân tích:

MySQL là một trong những hệ quản trị cơ sở dữ liệu phổ biến nhất hiện nay. Tuy nhiên, chỉ học cú pháp thôi là chưa đủ. Điều quan trọng là biết cách áp dụng vào các tình huống thực tế. Trong phần đầu tiên này, chúng ta sẽ bắt đầu với những ví dụ nền tảng giúp bạn làm quen với cách thao tác dữ liệu một cách hiệu quả trước khi tiến tới các truy vấn phức tạp hơn.

50+ Ví dụ MySQL thực tế từ cơ bản đến nâng cao

Chuẩn bị bảng dữ liệu để thực hành

Giả sử bạn đang xây dựng hệ thống quản lý khách hàng với bảng customers.

CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    full_name VARCHAR(100),
    email VARCHAR(150),
    city VARCHAR(100),
    age INT,
    created_at DATETIME
);

Ví dụ thao tác dữ liệu cơ bản

Ví dụ 1: Thêm một khách hàng mới

Đây là câu lệnh thường dùng khi người dùng đăng ký tài khoản hoặc quản trị viên thêm dữ liệu.

INSERT INTO customers(full_name,email,city,age,created_at)
VALUES(
'Nguyễn Văn A',
'a@example.com',
'Hồ Chí Minh',
25,
NOW()
);

Kết quả là một bản ghi mới được thêm vào bảng.

Ví dụ 2: Lấy toàn bộ danh sách khách hàng

Đây là truy vấn cơ bản nhất để xem toàn bộ dữ liệu.

SELECT * FROM customers;

Trong dự án thực tế, không nên lạm dụng SELECT * khi bảng có nhiều cột vì sẽ làm tăng lượng dữ liệu truyền tải.

Ví dụ 3: Chỉ lấy những cột cần thiết

Nếu giao diện chỉ hiển thị tên và email thì chỉ nên truy vấn đúng hai cột này.

SELECT full_name,email
FROM customers;

Cách làm này giúp giảm tải cho cơ sở dữ liệu và cải thiện tốc độ phản hồi.

Ví dụ 4: Tìm khách hàng theo thành phố

Đây là tình huống phổ biến khi lọc dữ liệu.

SELECT *
FROM customers
WHERE city='Hồ Chí Minh';

Truy vấn chỉ trả về những khách hàng sinh sống tại Hồ Chí Minh.

Ví dụ 5: Lọc khách hàng trên 30 tuổi

Điều kiện số học thường được dùng trong các hệ thống CRM hoặc quản lý thành viên.

SELECT *
FROM customers
WHERE age>30;

Ví dụ 6: Sắp xếp theo tuổi tăng dần

Khi cần xem khách hàng từ nhỏ tuổi đến lớn tuổi, sử dụng ORDER BY.

SELECT *
FROM customers
ORDER BY age ASC;

Nếu muốn sắp xếp giảm dần chỉ cần thay ASC bằng DESC.

Ví dụ 7: Giới hạn số bản ghi trả về

Trong phân trang hoặc hiển thị dữ liệu ngoài website, việc giới hạn số lượng bản ghi là rất cần thiết.

SELECT *
FROM customers
LIMIT 10;

Truy vấn chỉ lấy 10 dòng đầu tiên, giúp giảm thời gian xử lý khi bảng có hàng trăm nghìn bản ghi.

Thao tác cập nhật, xóa và lọc dữ liệu trong thực tế

Ví dụ 8: Cập nhật email của một khách hàng

Khi khách hàng thay đổi địa chỉ email hoặc quản trị viên cần chỉnh sửa thông tin, câu lệnh UPDATE sẽ được sử dụng.

UPDATE customers
SET email='newemail@example.com'
WHERE id=1;

Điều quan trọng là luôn sử dụng điều kiện WHERE. Nếu bỏ quên điều kiện này, toàn bộ dữ liệu trong cột email sẽ bị thay đổi.

Ví dụ 9: Cập nhật nhiều cột cùng lúc

Trong nhiều trường hợp, người dùng thay đổi đồng thời nhiều thông tin cá nhân.

UPDATE customers
SET
    full_name='Nguyễn Văn B',
    city='Đồng Nai',
    age=28
WHERE id=2;

Việc cập nhật nhiều cột trong một câu lệnh giúp giảm số lần truy vấn đến cơ sở dữ liệu.

Ví dụ 10: Xóa một khách hàng theo ID

Giả sử tài khoản đã bị xóa khỏi hệ thống, quản trị viên có thể loại bỏ dữ liệu bằng câu lệnh sau.

DELETE FROM customers
WHERE id=5;

Đây là thao tác không thể hoàn tác nếu chưa sao lưu dữ liệu, vì vậy nên kiểm tra điều kiện trước khi thực hiện.

Ví dụ 11: Xóa các khách hàng chưa hoàn thiện thông tin

Nhiều hệ thống sẽ dọn dẹp dữ liệu không hợp lệ sau một khoảng thời gian nhất định.

DELETE FROM customers
WHERE email IS NULL;

Ví dụ này sẽ xóa toàn bộ bản ghi chưa có địa chỉ email.

Ví dụ 12: Tìm khách hàng trong khoảng độ tuổi

Toán tử BETWEEN giúp viết truy vấn ngắn gọn và dễ đọc hơn.

SELECT *
FROM customers
WHERE age BETWEEN 18 AND 30;

Kết quả bao gồm cả giá trị 18 và 30.

Ví dụ 13: Tìm khách hàng thuộc nhiều thành phố

Nếu cần lọc nhiều giá trị cùng lúc, nên sử dụng IN thay vì viết nhiều điều kiện OR.

SELECT *
FROM customers
WHERE city IN (
'Hồ Chí Minh',
'Đồng Nai',
'Bình Dương'
);

Cách viết này rõ ràng hơn và dễ mở rộng khi số lượng điều kiện tăng lên.

Ví dụ 14: Tìm khách hàng có họ Nguyễn

Toán tử LIKE được sử dụng để tìm kiếm theo mẫu chuỗi.

SELECT *
FROM customers
WHERE full_name LIKE 'Nguyễn%';

Dấu % đại diện cho bất kỳ chuỗi ký tự nào phía sau từ "Nguyễn".

Ví dụ 15: Tìm khách hàng có email thuộc Gmail

Một tình huống phổ biến là lọc khách hàng theo nhà cung cấp email.

SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';

Dấu % đứng trước ký tự @ cho phép khớp với mọi tên hộp thư.

Ví dụ 16: Lấy danh sách các thành phố không bị trùng lặp

Khi cần thống kê khu vực khách hàng đang sinh sống, không cần lấy toàn bộ dữ liệu mà chỉ cần các giá trị duy nhất.

SELECT DISTINCT city
FROM customers;

Từ khóa DISTINCT giúp loại bỏ các giá trị trùng lặp trước khi trả về kết quả.

Ví dụ 17: Đếm tổng số khách hàng

Đây là truy vấn xuất hiện trong hầu hết dashboard quản trị.

SELECT COUNT(*) AS total_customers
FROM customers;

Kết quả trả về một dòng duy nhất chứa tổng số bản ghi hiện có trong bảng.

Ví dụ 18: Đếm số khách hàng theo từng thành phố

Thống kê theo nhóm là nhu cầu rất phổ biến trong các hệ thống báo cáo.

SELECT
    city,
    COUNT(*) AS total
FROM customers
GROUP BY city;

Kết quả cho biết mỗi thành phố hiện có bao nhiêu khách hàng.

Thống kê và xử lý dữ liệu bằng các hàm tổng hợp

Ví dụ 19: Đếm số khách hàng của từng thành phố và chỉ lấy nơi có từ 5 người trở lên

Sau khi nhóm dữ liệu, bạn có thể sử dụng HAVING để lọc kết quả thống kê.

SELECT
    city,
    COUNT(*) AS total_customers
FROM customers
GROUP BY city
HAVING COUNT(*) >= 5;

Khác với WHERE, mệnh đề HAVING hoạt động sau khi dữ liệu đã được nhóm.

Ví dụ 20: Tìm khách hàng lớn tuổi nhất

Hàm MAX() thường được dùng để tìm giá trị lớn nhất trong một cột.

SELECT MAX(age) AS oldest_age
FROM customers;

Kết quả chỉ trả về một giá trị là tuổi cao nhất hiện có.

Ví dụ 21: Tìm khách hàng nhỏ tuổi nhất

Ngược lại với MAX(), hàm MIN() dùng để lấy giá trị nhỏ nhất.

SELECT MIN(age) AS youngest_age
FROM customers;

Ví dụ 22: Tính tuổi trung bình của khách hàng

Đây là thống kê phổ biến khi phân tích nhóm khách hàng mục tiêu.

SELECT AVG(age) AS average_age
FROM customers;

Giá trị trả về có thể là số thập phân tùy thuộc dữ liệu.

Ví dụ 23: Tính tổng tuổi của toàn bộ khách hàng

Mặc dù không thường dùng trong báo cáo thực tế, ví dụ này giúp hiểu rõ cách hoạt động của hàm SUM().

SELECT SUM(age) AS total_age
FROM customers;

Ví dụ 24: Kết hợp nhiều hàm thống kê trong một truy vấn

Bạn có thể lấy nhiều thông tin thống kê chỉ bằng một câu lệnh.

SELECT
    COUNT(*) AS total_customers,
    AVG(age) AS average_age,
    MIN(age) AS youngest_age,
    MAX(age) AS oldest_age
FROM customers;

Cách này giúp giảm số lần truy vấn tới cơ sở dữ liệu.

Ví dụ 25: Sắp xếp khách hàng theo thời gian đăng ký mới nhất

Hầu hết trang quản trị đều hiển thị dữ liệu mới trước.

SELECT *
FROM customers
ORDER BY created_at DESC;

Ví dụ 26: Lấy 5 khách hàng đăng ký gần đây nhất

Kết hợp ORDER BY với LIMIT là cách làm rất phổ biến.

SELECT *
FROM customers
ORDER BY created_at DESC
LIMIT 5;

Ví dụ 27: Phân trang dữ liệu

Giả sử mỗi trang hiển thị 10 khách hàng, trang thứ ba sẽ bỏ qua 20 bản ghi đầu tiên.

SELECT *
FROM customers
ORDER BY id
LIMIT 20,10;

Trong đó:

  • 20 là số bản ghi cần bỏ qua.
  • 10 là số bản ghi cần lấy.

Ví dụ 28: Kiểm tra khách hàng đã có email hay chưa

Việc kiểm tra dữ liệu rỗng thường xuyên xuất hiện trong quá trình làm sạch dữ liệu.

SELECT *
FROM customers
WHERE email IS NOT NULL;

Chỉ những khách hàng đã khai báo email mới được trả về.

Tìm kiếm dữ liệu nâng cao

Ví dụ 29: Tìm tên có chứa từ "Anh"

Không nhất thiết chuỗi cần tìm phải nằm ở đầu hoặc cuối.

SELECT *
FROM customers
WHERE full_name LIKE '%Anh%';

Điều này rất hữu ích khi xây dựng chức năng tìm kiếm trên website.

Ví dụ 30: Tìm email bắt đầu bằng chữ "a"

Đây là ví dụ minh họa cho việc tìm kiếm theo tiền tố.

SELECT *
FROM customers
WHERE email LIKE 'a%';

MySQL sẽ trả về tất cả email có ký tự đầu tiên là chữ a.

Kết hợp nhiều điều kiện trong truy vấn

Ví dụ 31: Lọc khách hàng trên 25 tuổi và sống tại Đồng Nai

Toán tử AND được sử dụng khi tất cả điều kiện đều phải đúng.

SELECT *
FROM customers
WHERE age > 25
AND city='Đồng Nai';

Kết quả chỉ bao gồm những khách hàng thỏa mãn đồng thời cả hai điều kiện.

Ví dụ 32: Tìm khách hàng ở Hà Nội hoặc Hồ Chí Minh

Toán tử OR phù hợp khi chỉ cần một trong các điều kiện đúng.

SELECT *
FROM customers
WHERE city='Hà Nội'
OR city='Hồ Chí Minh';

Ví dụ 33: Kết hợp AND và OR đúng cách

Khi sử dụng nhiều toán tử trong cùng một truy vấn, nên dùng dấu ngoặc để tránh nhầm lẫn về thứ tự ưu tiên.

SELECT *
FROM customers
WHERE age >= 18
AND (
    city='Hồ Chí Minh'
    OR city='Đồng Nai'
);

Ví dụ này chỉ lấy khách hàng từ 18 tuổi trở lên và sinh sống tại một trong hai thành phố được chỉ định.

Ví dụ 34: Loại bỏ một thành phố khỏi kết quả

Toán tử hoặc != đều có thể dùng để so sánh khác.

SELECT *
FROM customers
WHERE city <> 'Hồ Chí Minh';

Ví dụ 35: Không lấy khách hàng thuộc nhiều thành phố

NOT IN giúp truy vấn ngắn gọn hơn so với nhiều điều kiện khác nhau.

SELECT *
FROM customers
WHERE city NOT IN (
'Hồ Chí Minh',
'Hà Nội'
);

Toàn bộ khách hàng thuộc hai thành phố trên sẽ bị loại khỏi kết quả.

Ví dụ 36: Tìm khách hàng chưa đủ 18 tuổi hoặc trên 60 tuổi

Đây là dạng truy vấn thường gặp khi phân tích nhóm tuổi.

SELECT *
FROM customers
WHERE age < 18
OR age > 60;

Làm việc với nhiều bảng dữ liệu

Trong các dự án thực tế, dữ liệu thường được chia thành nhiều bảng thay vì lưu chung trong một bảng.

Giả sử hệ thống có thêm bảng đơn hàng.

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT,
    total DECIMAL(12,2),
    status VARCHAR(30),
    created_at DATETIME
);

Ví dụ 37: Lấy danh sách khách hàng cùng đơn hàng

INNER JOIN chỉ trả về các bản ghi tồn tại ở cả hai bảng.

SELECT
    customers.full_name,
    orders.id,
    orders.total
FROM customers
INNER JOIN orders
ON customers.id=orders.customer_id;

Đây là kiểu JOIN được sử dụng nhiều nhất trong các hệ thống thương mại điện tử.

Ví dụ 38: Hiển thị tất cả khách hàng kể cả chưa có đơn hàng

Khi cần thống kê toàn bộ khách hàng, kể cả người chưa từng mua hàng, hãy sử dụng LEFT JOIN.

SELECT
    customers.full_name,
    orders.total
FROM customers
LEFT JOIN orders
ON customers.id=orders.customer_id;

Nếu khách hàng chưa có đơn hàng thì các cột của bảng orders sẽ có giá trị NULL.

Ví dụ 39: Đếm số đơn hàng của từng khách hàng

JOIN kết hợp với GROUP BY giúp tạo các báo cáo tổng hợp.

SELECT
    customers.full_name,
    COUNT(orders.id) AS total_orders
FROM customers
LEFT JOIN orders
ON customers.id=orders.customer_id
GROUP BY customers.id,customers.full_name;

Kết quả cho biết mỗi khách hàng đã phát sinh bao nhiêu đơn hàng.

Ví dụ 40: Tính tổng số tiền khách hàng đã mua

Đây là báo cáo rất phổ biến trong các hệ thống bán hàng.

SELECT
    customers.full_name,
    SUM(orders.total) AS total_spent
FROM customers
INNER JOIN orders
ON customers.id=orders.customer_id
GROUP BY customers.id,customers.full_name;

Dựa trên kết quả này, bạn có thể xác định khách hàng có giá trị cao để triển khai các chương trình chăm sóc phù hợp.

Truy vấn nâng cao với JOIN, GROUP BY và Subquery

Ví dụ 41: Tìm khách hàng chưa từng phát sinh đơn hàng

Đây là truy vấn rất phổ biến khi cần xác định khách hàng mới đăng ký nhưng chưa mua sản phẩm.

SELECT
    customers.id,
    customers.full_name,
    customers.email
FROM customers
LEFT JOIN orders
ON customers.id=orders.customer_id
WHERE orders.id IS NULL;

Nhờ LEFT JOIN, toàn bộ khách hàng đều được lấy ra, sau đó chỉ giữ lại những bản ghi không có đơn hàng.

Ví dụ 42: Lấy đơn hàng có giá trị lớn hơn mức trung bình

Subquery giúp tạo các điều kiện dựa trên kết quả của một truy vấn khác.

SELECT *
FROM orders
WHERE total > (
    SELECT AVG(total)
    FROM orders
);

Ví dụ này thường được sử dụng trong các báo cáo doanh thu hoặc phân tích đơn hàng có giá trị cao.

Ví dụ 43: Tìm khách hàng có tổng chi tiêu lớn hơn 50 triệu

Kết hợp JOIN, GROUP BY và HAVING để lọc theo dữ liệu đã tổng hợp.

SELECT
    customers.full_name,
    SUM(orders.total) AS total_spent
FROM customers
INNER JOIN orders
ON customers.id=orders.customer_id
GROUP BY customers.id,customers.full_name
HAVING SUM(orders.total) > 50000000;

Đây là truy vấn thường xuất hiện trong các chương trình khách hàng VIP.

Ví dụ 44: Lấy đơn hàng mới nhất của từng khách hàng

Hàm MAX() kết hợp với GROUP BY giúp xác định thời điểm đặt hàng gần nhất.

SELECT
    customer_id,
    MAX(created_at) AS latest_order
FROM orders
GROUP BY customer_id;

Ví dụ 45: Tìm khách hàng có tuổi lớn hơn tuổi trung bình

Subquery không chỉ áp dụng cho bảng đơn hàng mà còn rất hữu ích với các bảng dữ liệu thông thường.

SELECT *
FROM customers
WHERE age > (
    SELECT AVG(age)
    FROM customers
);

Kết quả chỉ bao gồm những khách hàng có tuổi cao hơn mức trung bình của toàn bộ hệ thống.

Sử dụng CASE trong MySQL

Ví dụ 46: Phân loại khách hàng theo độ tuổi

CASE giúp tạo dữ liệu hiển thị trực tiếp trong kết quả truy vấn mà không cần xử lý thêm ở phía ứng dụng.

SELECT
    full_name,
    age,
    CASE
        WHEN age < 18 THEN 'Chưa thành niên'
        WHEN age BETWEEN 18 AND 30 THEN 'Thanh niên'
        WHEN age BETWEEN 31 AND 50 THEN 'Trung niên'
        ELSE 'Cao tuổi'
    END AS age_group
FROM customers;

Đây là kỹ thuật rất hữu ích khi xây dựng báo cáo hoặc dashboard.

Ví dụ 47: Hiển thị trạng thái đơn hàng dễ đọc

Thay vì hiển thị các mã trạng thái khó hiểu, bạn có thể chuyển đổi sang nội dung thân thiện hơn.

SELECT
    id,
    total,
    CASE
        WHEN status='pending' THEN 'Chờ xử lý'
        WHEN status='processing' THEN 'Đang xử lý'
        WHEN status='completed' THEN 'Hoàn thành'
        WHEN status='cancelled' THEN 'Đã hủy'
        ELSE 'Khác'
    END AS status_name
FROM orders;

Làm việc với dữ liệu ngày và thời gian

Ví dụ 48: Lấy các khách hàng đăng ký trong 30 ngày gần nhất

Hầu hết hệ thống quản trị đều có chức năng thống kê người dùng mới theo khoảng thời gian.

SELECT *
FROM customers
WHERE created_at >= DATE_SUB(NOW(),INTERVAL 30 DAY);

DATE_SUB() giúp tính toán khoảng thời gian một cách linh hoạt.

Ví dụ 49: Thống kê số khách hàng đăng ký theo từng tháng

Đây là báo cáo thường thấy trong các hệ thống CRM và Marketing.

SELECT
    YEAR(created_at) AS year_created,
    MONTH(created_at) AS month_created,
    COUNT(*) AS total_customers
FROM customers
GROUP BY
    YEAR(created_at),
    MONTH(created_at)
ORDER BY
    year_created,
    month_created;

Kết quả giúp theo dõi tốc độ tăng trưởng người dùng theo từng tháng.

Ví dụ 50: Lấy các đơn hàng được tạo trong ngày hôm nay

Khi cần thống kê doanh thu theo ngày, đây là một trong những truy vấn được sử dụng nhiều nhất.

SELECT *
FROM orders
WHERE DATE(created_at)=CURDATE();

Việc kết hợp các hàm xử lý ngày tháng giúp truy vấn trở nên ngắn gọn và dễ bảo trì hơn.

Các ví dụ nâng cao thường gặp trong dự án thực tế

Ví dụ 51: Tìm 5 khách hàng có tổng giá trị mua hàng cao nhất

Đây là truy vấn rất phổ biến trong các hệ thống CRM và thương mại điện tử nhằm xác định nhóm khách hàng VIP.

SELECT
    customers.id,
    customers.full_name,
    SUM(orders.total) AS total_spent
FROM customers
INNER JOIN orders
ON customers.id=orders.customer_id
GROUP BY customers.id,customers.full_name
ORDER BY total_spent DESC
LIMIT 5;

Việc sắp xếp theo tổng giá trị đơn hàng giúp doanh nghiệp dễ dàng xây dựng các chương trình ưu đãi phù hợp.

Ví dụ 52: Tìm đơn hàng có giá trị cao nhất của mỗi khách hàng

Đây là dạng thống kê thường được sử dụng để phân tích hành vi mua sắm.

SELECT
    customer_id,
    MAX(total) AS highest_order
FROM orders
GROUP BY customer_id;

Ví dụ 53: Kiểm tra khách hàng đã từng mua hàng hay chưa bằng EXISTS

EXISTS thường có hiệu năng tốt khi chỉ cần kiểm tra sự tồn tại của dữ liệu.

SELECT *
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id=c.id
);

MySQL sẽ dừng tìm kiếm ngay khi tìm thấy bản ghi đầu tiên phù hợp.

Ví dụ 54: Kiểm tra khách hàng chưa từng phát sinh đơn hàng bằng NOT EXISTS

Đây là cách viết thay thế cho LEFT JOIN trong nhiều tình huống.

SELECT *
FROM customers c
WHERE NOT EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id=c.id
);

Trong các bảng dữ liệu lớn, NOT EXISTS đôi khi mang lại hiệu quả tốt hơn tùy vào chỉ mục và kế hoạch thực thi của MySQL.

Ví dụ 55: Đánh số thứ tự bằng ROW_NUMBER()

Từ MySQL 8 trở lên, Window Function giúp xử lý dữ liệu linh hoạt hơn rất nhiều.

SELECT
    ROW_NUMBER() OVER(
        ORDER BY total DESC
    ) AS ranking,
    id,
    customer_id,
    total
FROM orders;

Ví dụ này rất hữu ích khi xây dựng bảng xếp hạng hoặc báo cáo.

Ví dụ 56: Xếp hạng khách hàng theo tổng chi tiêu

Hàm DENSE_RANK() hỗ trợ tạo bảng xếp hạng mà không bị nhảy số khi có các giá trị bằng nhau.

SELECT
    full_name,
    total_spent,
    DENSE_RANK() OVER(
        ORDER BY total_spent DESC
    ) AS customer_rank
FROM (
    SELECT
        customers.full_name,
        SUM(orders.total) AS total_spent
    FROM customers
    INNER JOIN orders
    ON customers.id=orders.customer_id
    GROUP BY customers.id,customers.full_name
) AS report_data;

Ví dụ 57: Đánh số đơn hàng của từng khách hàng

PARTITION BY giúp chia dữ liệu thành từng nhóm trước khi thực hiện Window Function.

SELECT
    customer_id,
    id,
    total,
    ROW_NUMBER() OVER(
        PARTITION BY customer_id
        ORDER BY created_at
    ) AS order_number
FROM orders;

Mỗi khách hàng sẽ được đánh số đơn hàng riêng bắt đầu từ 1.

Kinh nghiệm viết truy vấn MySQL hiệu quả

Luôn chỉ lấy các cột cần thiết

Thay vì sử dụng SELECT *, hãy chỉ định rõ những cột thực sự cần dùng. Điều này giúp giảm lượng dữ liệu truyền qua mạng, tăng tốc truy vấn và tối ưu tài nguyên máy chủ.

Tạo chỉ mục cho các cột thường xuyên tìm kiếm

Các cột như email, customer_id, created_at hoặc status thường xuyên xuất hiện trong điều kiện WHERE, JOIN và ORDER BY nên rất phù hợp để tạo Index.

Hạn chế sử dụng hàm trên cột được lập chỉ mục

Ví dụ, thay vì sử dụng hàm DATE() trực tiếp trên cột ngày giờ trong điều kiện lọc, hãy cân nhắc so sánh theo khoảng thời gian để MySQL có thể tận dụng Index hiệu quả hơn.

Ưu tiên JOIN thay vì xử lý dữ liệu ở ứng dụng

Nếu dữ liệu đã nằm trong cơ sở dữ liệu, hãy để MySQL thực hiện việc kết nối và tổng hợp. Điều này thường nhanh hơn so với việc lấy nhiều tập dữ liệu rồi xử lý bằng PHP hoặc ngôn ngữ lập trình khác.

Thường xuyên kiểm tra kế hoạch thực thi truy vấn

Khi truy vấn trở nên phức tạp hoặc dữ liệu tăng lên hàng triệu bản ghi, nên sử dụng lệnh EXPLAIN để xem MySQL đang đọc dữ liệu như thế nào và từ đó tối ưu câu lệnh phù hợp.

EXPLAIN
SELECT
    customers.full_name,
    SUM(orders.total)
FROM customers
INNER JOIN orders
ON customers.id=orders.customer_id
GROUP BY customers.id;

Tổng kết

Qua hơn 50 ví dụ thực tế, bạn đã lần lượt làm quen với các thao tác từ cơ bản như SELECT, INSERT, UPDATE, DELETE cho đến GROUP BY, HAVING, JOIN, Subquery, CASE, Window Function và nhiều kỹ thuật thống kê thường gặp trong các dự án thực tế. Việc hiểu rõ từng ví dụ sẽ giúp bạn không chỉ ghi nhớ cú pháp mà còn biết cách lựa chọn giải pháp phù hợp khi xây dựng website, phần mềm quản lý, hệ thống bán hàng hay các ứng dụng có sử dụng MySQL.

Thay vì cố gắng học thuộc toàn bộ câu lệnh, hãy dành thời gian thực hành với các bảng dữ liệu của riêng mình, thử thay đổi điều kiện truy vấn, thêm dữ liệu và quan sát kết quả. Đây là cách nhanh nhất để nâng cao kỹ năng làm việc với MySQL và sẵn sàng áp dụng vào những dự án có quy mô lớn hơn trong tương lai.

  • 0 Bình luận
Trần Thị Vân | Content Creator Web Mới
Trần Thị Vân
Trần Thị Vân là Content Creator tại Web Mới, phụ trách nghiên cứu, biên soạn nội dung và chia sẻ kiến thức về website, SEO, lập trình cùng các xu hướng công nghệ
Chia sẻ nội dung đánh giá của bạn về 50+ Ví dụ MySQL thực tế từ cơ bản đến nâng cao
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Đăng ký tư vấn thiết kế website
Tìm hiểu 1 năm không bằng lắng nghe 1 câu tư vấn