MySQL-Mệnh đề

Mệnh đề WHERE trong MySQL được sử dụng để lọc các hàng trong một truy vấn SQL dựa trên điều kiện cụ thể. Mệnh đề này cho phép bạn chọn chỉ những hàng thỏa mãn điều kiện mà bạn đã chỉ định.

Cú pháp cơ bản

SELECT cot1, cot2, ...
FROM ten_bang
WHERE dieu_kien;

Ví dụ Cơ Bản

Giả sử bạn có bảng NhanVien với các cột HoTen, ChucVu, và Luong. Để truy xuất dữ liệu của nhân viên có chức vụ là ‘Quản lý’:

SELECT * FROM NhanVien
WHERE ChucVu = 'Quản lý';

Sử dụng Toán Tử So Sánh

Mệnh đề WHERE hỗ trợ các toán tử so sánh như =, <>, >, <, >=, <=:

SELECT * FROM NhanVien
WHERE Luong > 50000;

Ví dụ này sẽ trả về tất cả nhân viên có lương lớn hơn 50,000.

Kết hợp Các Điều Kiện Với AND, OR, NOT

Bạn có thể kết hợp nhiều điều kiện bằng các toán tử logic:

SELECT * FROM NhanVien
WHERE ChucVu = 'Nhân viên' AND Luong > 40000;

Ví dụ này trả về những nhân viên có chức vụ là ‘Nhân viên’ và lương lớn hơn 40,000.

SELECT * FROM NhanVien
WHERE ChucVu = 'Nhân viên' OR ChucVu = 'Thực tập sinh';

Ví dụ này trả về những nhân viên có chức vụ là ‘Nhân viên’ hoặc ‘Thực tập sinh’.

SELECT * FROM NhanVien
WHERE NOT (ChucVu = 'Quản lý');

Ví dụ này trả về tất cả nhân viên mà chức vụ không phải là ‘Quản lý’.

Sử dụng Toán Tử IN, BETWEEN, LIKE, IS NULL

  • IN: Kiểm tra nếu giá trị nằm trong một tập hợp giá trị:
  SELECT * FROM NhanVien
  WHERE ChucVu IN ('Nhân viên', 'Thực tập sinh');

Ví dụ này sẽ trả về những nhân viên có chức vụ là ‘Nhân viên’ hoặc ‘Thực tập sinh’.

  • BETWEEN: Kiểm tra nếu giá trị nằm trong một khoảng:
  SELECT * FROM NhanVien
  WHERE Luong BETWEEN 40000 AND 60000;

Ví dụ này trả về những nhân viên có lương từ 40,000 đến 60,000.

  • LIKE: Tìm kiếm mẫu trong một chuỗi:
  SELECT * FROM NhanVien
  WHERE HoTen LIKE 'Nguyen%';

Ví dụ này trả về những nhân viên có tên bắt đầu bằng ‘Nguyen’.

  • %: Đại diện cho bất kỳ chuỗi ký tự nào (bao gồm chuỗi rỗng).
  • _: Đại diện cho một ký tự đơn.
  • IS NULL: Kiểm tra giá trị NULL:
  SELECT * FROM NhanVien
  WHERE Luong IS NULL;

Ví dụ này trả về những nhân viên có lương là NULL.

Sử dụng ORDER BY Kết Hợp Với WHERE

Bạn có thể sắp xếp kết quả truy vấn bằng cách sử dụng mệnh đề ORDER BY kết hợp với WHERE:

SELECT * FROM NhanVien
WHERE Luong > 50000
ORDER BY Luong DESC;

Ví dụ này sẽ trả về những nhân viên có lương lớn hơn 50,000 và sắp xếp theo lương từ cao xuống thấp.

Sử dụng LIMIT Kết Hợp Với WHERE

Bạn có thể giới hạn số lượng kết quả trả về bằng cách sử dụng LIMIT:

SELECT * FROM NhanVien
WHERE Luong > 40000
ORDER BY Luong DESC
LIMIT 5;

Ví dụ này sẽ trả về 5 nhân viên có lương lớn hơn 40,000 và sắp xếp theo lương từ cao xuống thấp.

Tóm tắt

  • Mệnh đề WHERE được sử dụng để lọc hàng dựa trên điều kiện cụ thể.
  • Bạn có thể sử dụng các toán tử so sánh (=, <>, >, <, v.v.), toán tử logic (AND, OR, NOT), và các toán tử đặc biệt (IN, BETWEEN, LIKE, IS NULL).
  • Kết hợp WHERE với ORDER BYLIMIT để có kết quả truy vấn chính xác và hiệu quả hơn.

Câu lệnh SELECT DISTINCT trong SQL được sử dụng để loại bỏ các bản sao và chỉ trả về các giá trị khác nhau trong kết quả truy vấn. Điều này rất hữu ích khi bạn muốn tìm các giá trị duy nhất từ một cột hoặc tập hợp các cột trong bảng.

Cú pháp cơ bản

SELECT DISTINCT cot1, cot2, ...
FROM ten_bang;

Ví dụ Cơ Bản

Giả sử bạn có bảng NhanVien với các cột HoTen, ChucVu, và Luong. Nếu bạn muốn lấy danh sách các chức vụ duy nhất trong bảng:

SELECT DISTINCT ChucVu
FROM NhanVien;

Câu lệnh này sẽ trả về danh sách các chức vụ mà không có trùng lặp.

Sử dụng DISTINCT Với Nhiều Cột

Bạn có thể sử dụng DISTINCT để loại bỏ bản sao dựa trên sự kết hợp của nhiều cột:

SELECT DISTINCT HoTen, ChucVu
FROM NhanVien;

Câu lệnh này sẽ trả về các kết hợp duy nhất của HoTenChucVu. Nếu có nhiều nhân viên với cùng tên và chức vụ, chỉ một bản sao của mỗi kết hợp sẽ được trả về.

Kết Hợp Với ORDER BY

Bạn có thể kết hợp DISTINCT với ORDER BY để sắp xếp kết quả theo thứ tự mong muốn:

SELECT DISTINCT ChucVu
FROM NhanVien
ORDER BY ChucVu;

Ví dụ này sẽ trả về các chức vụ duy nhất và sắp xếp chúng theo thứ tự tăng dần.

Sử dụng DISTINCT Trong Các Truy Vấn Phức Tạp

DISTINCT cũng có thể được sử dụng trong các truy vấn phức tạp để loại bỏ các bản sao từ kết quả trả về của các phép nối (JOIN) hoặc các phép toán khác:

SELECT DISTINCT n.HoTen, d.TenPhong
FROM NhanVien n
JOIN PhongBan d ON n.MaPhongBan = d.MaPhongBan
WHERE n.Luong > 50000;

Ví dụ này sẽ trả về danh sách duy nhất của các nhân viên và phòng ban mà họ làm việc, chỉ cho những nhân viên có lương lớn hơn 50,000.

Lưu Ý

  • Tốc độ truy vấn: Sử dụng DISTINCT có thể làm giảm tốc độ truy vấn nếu bảng có nhiều dữ liệu, vì MySQL cần phải thực hiện các bước bổ sung để loại bỏ bản sao. Hãy chắc chắn rằng việc sử dụng DISTINCT là cần thiết và có thể cải thiện hiệu suất bằng cách sử dụng các chỉ mục nếu cần.
  • Sự khác biệt giữa DISTINCTGROUP BY: Trong một số trường hợp, bạn có thể sử dụng GROUP BY để đạt được kết quả tương tự như DISTINCT. Ví dụ, SELECT DISTINCT ChucVu FROM NhanVienSELECT ChucVu FROM NhanVien GROUP BY ChucVu đều sẽ trả về các chức vụ duy nhất.

Mệnh đề ORDER BY trong SQL được sử dụng để sắp xếp kết quả của một truy vấn theo một hoặc nhiều cột. Mệnh đề này cho phép bạn xác định thứ tự của các hàng trong kết quả truy vấn, theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC).

Cú pháp cơ bản

SELECT cot1, cot2, ...
FROM ten_bang
ORDER BY cot1 [ASC|DESC], cot2 [ASC|DESC], ...;
  • cot1, cot2, …: Các cột mà bạn muốn sắp xếp.
  • ASC: Sắp xếp theo thứ tự tăng dần (mặc định nếu không chỉ định).
  • DESC: Sắp xếp theo thứ tự giảm dần.

Ví dụ Cơ Bản

  1. Sắp xếp theo một cột Để sắp xếp kết quả truy vấn theo cột Luong theo thứ tự tăng dần:
   SELECT * FROM NhanVien
   ORDER BY Luong ASC;

Câu lệnh này sẽ trả về danh sách nhân viên sắp xếp theo lương từ thấp đến cao.

  1. Sắp xếp theo một cột theo thứ tự giảm dần Để sắp xếp kết quả truy vấn theo cột Luong theo thứ tự giảm dần:
   SELECT * FROM NhanVien
   ORDER BY Luong DESC;

Câu lệnh này sẽ trả về danh sách nhân viên sắp xếp theo lương từ cao đến thấp.

  1. Sắp xếp theo nhiều cột Để sắp xếp kết quả truy vấn theo nhiều cột, bạn chỉ định nhiều cột trong mệnh đề ORDER BY. Thứ tự sắp xếp được thực hiện theo cột đầu tiên, sau đó theo cột thứ hai nếu có nhiều hàng có cùng giá trị ở cột đầu tiên, và cứ tiếp tục như vậy:
   SELECT * FROM NhanVien
   ORDER BY ChucVu ASC, Luong DESC;

Câu lệnh này sẽ sắp xếp kết quả theo chức vụ (theo thứ tự tăng dần) và sau đó theo lương (theo thứ tự giảm dần) nếu chức vụ giống nhau.

Sử dụng ORDER BY Kết Hợp Với Các Mệnh Đề Khác

  • Kết hợp với WHERE:
   SELECT * FROM NhanVien
   WHERE Luong > 40000
   ORDER BY Luong DESC;

Câu lệnh này sẽ trả về những nhân viên có lương lớn hơn 40,000, sắp xếp theo lương từ cao đến thấp.

  • Kết hợp với LIMIT:
   SELECT * FROM NhanVien
   ORDER BY Luong DESC
   LIMIT 5;

Câu lệnh này sẽ trả về 5 nhân viên có lương cao nhất.

Sắp xếp với Các Loại Dữ Liệu Khác

  • Sắp xếp theo chuỗi:
   SELECT * FROM NhanVien
   ORDER BY HoTen ASC;

Câu lệnh này sẽ sắp xếp danh sách nhân viên theo tên (theo thứ tự chữ cái).

  • Sắp xếp theo ngày:
   SELECT * FROM DonHang
   ORDER BY NgayDat DESC;

Câu lệnh này sẽ sắp xếp danh sách đơn hàng theo ngày đặt từ mới nhất đến cũ nhất.

Lưu Ý

  • Hiệu suất: Sắp xếp dữ liệu có thể làm giảm hiệu suất của truy vấn, đặc biệt là khi bạn làm việc với các bảng lớn. Đảm bảo rằng các cột được sử dụng trong mệnh đề ORDER BY được chỉ mục để cải thiện hiệu suất.
  • Thứ tự sắp xếp: Mặc định, nếu bạn không chỉ định ASC hoặc DESC, SQL sẽ sắp xếp theo thứ tự tăng dần (ASC).

Tóm tắt

  • Mệnh đề ORDER BY được sử dụng để sắp xếp kết quả truy vấn theo một hoặc nhiều cột.
  • Bạn có thể sắp xếp theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC).
  • Kết hợp ORDER BY với các mệnh đề khác như WHERELIMIT để điều chỉnh kết quả truy vấn.
  • Sử dụng ORDER BY với các cột và loại dữ liệu khác nhau như chuỗi, số và ngày.

Mệnh đề GROUP BY trong SQL được sử dụng để nhóm các hàng có cùng giá trị trong một hoặc nhiều cột thành các nhóm. Điều này thường được kết hợp với các hàm tổng hợp như COUNT(), SUM(), AVG(), MAX(), và MIN() để thực hiện các phép toán trên các nhóm dữ liệu.

Cú pháp cơ bản

SELECT cot1, cot2, ..., ham_tong_hop(cot_n)
FROM ten_bang
GROUP BY cot1, cot2, ...;
  • cot1, cot2, …: Các cột dùng để nhóm dữ liệu.
  • ham_tong_hop(cot_n): Các hàm tổng hợp áp dụng cho các nhóm dữ liệu.

Ví dụ Cơ Bản

  1. Nhóm dữ liệu và đếm số lượng Để đếm số lượng nhân viên theo chức vụ:
   SELECT ChucVu, COUNT(*) AS SoLuong
   FROM NhanVien
   GROUP BY ChucVu;

Câu lệnh này sẽ trả về số lượng nhân viên trong từng chức vụ.

  1. Nhóm dữ liệu và tính tổng Để tính tổng lương của nhân viên theo chức vụ:
   SELECT ChucVu, SUM(Luong) AS TongLuong
   FROM NhanVien
   GROUP BY ChucVu;

Câu lệnh này sẽ trả về tổng lương của nhân viên trong từng chức vụ.

  1. Nhóm dữ liệu và tính giá trị trung bình Để tính giá trị trung bình của lương nhân viên theo chức vụ:
   SELECT ChucVu, AVG(Luong) AS LuongTrungBinh
   FROM NhanVien
   GROUP BY ChucVu;

Câu lệnh này sẽ trả về giá trị trung bình của lương trong từng chức vụ.

Kết Hợp GROUP BY Với Các Điều Kiện

  • Kết hợp với HAVING: Mệnh đề HAVING được sử dụng để lọc các nhóm dữ liệu sau khi nhóm. Nó tương tự như mệnh đề WHERE, nhưng áp dụng cho các nhóm dữ liệu:
   SELECT ChucVu, COUNT(*) AS SoLuong
   FROM NhanVien
   GROUP BY ChucVu
   HAVING COUNT(*) > 5;

Câu lệnh này sẽ trả về các chức vụ có số lượng nhân viên lớn hơn 5.

  • Kết hợp với ORDER BY: Bạn có thể sắp xếp các nhóm dữ liệu sau khi nhóm bằng cách sử dụng mệnh đề ORDER BY:
   SELECT ChucVu, AVG(Luong) AS LuongTrungBinh
   FROM NhanVien
   GROUP BY ChucVu
   ORDER BY LuongTrungBinh DESC;

Câu lệnh này sẽ trả về các chức vụ sắp xếp theo giá trị trung bình của lương từ cao đến thấp.

Nhóm Dữ Liệu Theo Nhiều Cột

Bạn có thể nhóm dữ liệu theo nhiều cột để tạo ra các nhóm phức tạp hơn:

SELECT ChucVu, PhongBan, COUNT(*) AS SoLuong
FROM NhanVien
GROUP BY ChucVu, PhongBan;

Câu lệnh này sẽ trả về số lượng nhân viên theo từng chức vụ và phòng ban.

Sử Dụng Hàm Tổng Hợp

Các hàm tổng hợp phổ biến được sử dụng cùng với GROUP BY bao gồm:

  • COUNT(): Đếm số lượng hàng trong mỗi nhóm.
  • SUM(): Tính tổng giá trị trong mỗi nhóm.
  • AVG(): Tính giá trị trung bình trong mỗi nhóm.
  • MAX(): Tìm giá trị lớn nhất trong mỗi nhóm.
  • MIN(): Tìm giá trị nhỏ nhất trong mỗi nhóm.

Lưu Ý

  • Cột không trong mệnh đề GROUP BY: Nếu bạn chọn các cột không nằm trong mệnh đề GROUP BY, bạn phải sử dụng các hàm tổng hợp với chúng.
  • Hiệu suất: Nhóm dữ liệu có thể tốn kém về hiệu suất, đặc biệt với các bảng lớn. Đảm bảo rằng các cột nhóm dữ liệu được chỉ mục nếu cần thiết để cải thiện hiệu suất.

Tóm tắt

  • Mệnh đề GROUP BY được sử dụng để nhóm các hàng dựa trên một hoặc nhiều cột và thực hiện các phép toán tổng hợp trên các nhóm dữ liệu.
  • Kết hợp với các hàm tổng hợp như COUNT(), SUM(), AVG(), MAX(), và MIN().
  • Có thể sử dụng với các mệnh đề khác như HAVING để lọc nhóm và ORDER BY để sắp xếp kết quả.
  • Có thể nhóm dữ liệu theo nhiều cột để tạo các nhóm dữ liệu phức tạp hơn.

Mệnh đề HAVING trong SQL được sử dụng để lọc các nhóm dữ liệu được tạo ra bởi mệnh đề GROUP BY. Nó cho phép bạn áp dụng các điều kiện lọc trên các nhóm dữ liệu sau khi chúng đã được nhóm và tổng hợp. Điều này khác với mệnh đề WHERE, mà lọc dữ liệu trước khi nhóm.

Cú pháp cơ bản

SELECT cot1, cot2, ..., ham_tong_hop(cot_n)
FROM ten_bang
GROUP BY cot1, cot2, ...
HAVING dieu_kien;
  • cot1, cot2, …: Các cột dùng để nhóm dữ liệu.
  • ham_tong_hop(cot_n): Các hàm tổng hợp áp dụng cho các nhóm dữ liệu.
  • dieu_kien: Điều kiện lọc áp dụng cho các nhóm dữ liệu.

Ví dụ Cơ Bản

  1. Lọc nhóm dữ liệu dựa trên số lượng Để trả về các chức vụ có số lượng nhân viên lớn hơn 5:
   SELECT ChucVu, COUNT(*) AS SoLuong
   FROM NhanVien
   GROUP BY ChucVu
   HAVING COUNT(*) > 5;

Câu lệnh này sẽ nhóm nhân viên theo chức vụ và chỉ trả về các chức vụ có số lượng nhân viên lớn hơn 5.

  1. Lọc nhóm dữ liệu dựa trên giá trị tổng Để trả về các phòng ban có tổng lương lớn hơn 100,000:
   SELECT PhongBan, SUM(Luong) AS TongLuong
   FROM NhanVien
   GROUP BY PhongBan
   HAVING SUM(Luong) > 100000;

Câu lệnh này sẽ nhóm nhân viên theo phòng ban và chỉ trả về các phòng ban có tổng lương lớn hơn 100,000.

  1. Lọc nhóm dữ liệu dựa trên giá trị trung bình Để trả về các chức vụ có giá trị trung bình lương nhỏ hơn 50,000:
   SELECT ChucVu, AVG(Luong) AS LuongTrungBinh
   FROM NhanVien
   GROUP BY ChucVu
   HAVING AVG(Luong) < 50000;

Câu lệnh này sẽ nhóm nhân viên theo chức vụ và chỉ trả về các chức vụ có giá trị trung bình lương nhỏ hơn 50,000.

Kết Hợp HAVING Với ORDER BY

Bạn có thể kết hợp mệnh đề HAVING với ORDER BY để sắp xếp kết quả:

SELECT ChucVu, AVG(Luong) AS LuongTrungBinh
FROM NhanVien
GROUP BY ChucVu
HAVING AVG(Luong) < 50000
ORDER BY LuongTrungBinh DESC;

Câu lệnh này sẽ nhóm nhân viên theo chức vụ, lọc các chức vụ có giá trị trung bình lương nhỏ hơn 50,000 và sắp xếp kết quả theo giá trị trung bình lương từ cao đến thấp.

Sự Khác Biệt Giữa WHEREHAVING

  • WHERE: Lọc các hàng trước khi nhóm dữ liệu. Sử dụng WHERE khi bạn cần lọc dữ liệu cơ bản.
  SELECT * FROM NhanVien
  WHERE Luong > 40000;
  • HAVING: Lọc các nhóm dữ liệu sau khi nhóm và tổng hợp. Sử dụng HAVING khi bạn cần lọc dữ liệu dựa trên kết quả tổng hợp.
  SELECT ChucVu, COUNT(*) AS SoLuong
  FROM NhanVien
  GROUP BY ChucVu
  HAVING COUNT(*) > 5;

Lưu Ý

  • Sử dụng cùng với GROUP BY: Mệnh đề HAVING thường được sử dụng cùng với mệnh đề GROUP BY. Nó không thể được sử dụng mà không có GROUP BY trừ khi bạn chỉ sử dụng các hàm tổng hợp không cần nhóm.
  • Hiệu suất: Lọc dữ liệu với HAVING có thể ảnh hưởng đến hiệu suất, đặc biệt khi dữ liệu lớn. Đảm bảo các cột nhóm dữ liệu được chỉ mục nếu cần thiết.

Tóm tắt

  • Mệnh đề HAVING được sử dụng để lọc các nhóm dữ liệu sau khi nhóm và tổng hợp.
  • HAVING cho phép áp dụng các điều kiện lọc trên kết quả của các hàm tổng hợp.
  • Kết hợp HAVING với GROUP BY để nhóm dữ liệu và lọc các nhóm dữ liệu theo điều kiện cụ thể.
  • Sử dụng WHERE để lọc dữ liệu trước khi nhóm và HAVING để lọc dữ liệu sau khi nhóm.

Trong MySQL, bạn có thể giới hạn số lượng kết quả trả về của một truy vấn bằng cách sử dụng mệnh đề LIMIT. Mệnh đề LIMIT cho phép bạn chỉ định số lượng hàng muốn trả về và cũng có thể chỉ định điểm bắt đầu để lấy dữ liệu.

Cú pháp cơ bản

SELECT cot1, cot2, ...
FROM ten_bang
LIMIT [offset,] count;
  • offset: Vị trí bắt đầu (tùy chọn). Nếu không chỉ định, LIMIT bắt đầu từ hàng đầu tiên (0).
  • count: Số lượng hàng muốn trả về.

Ví dụ Cơ Bản

  1. Giới hạn số lượng hàng trả về Để chỉ lấy 10 hàng đầu tiên từ bảng NhanVien:
   SELECT * FROM NhanVien
   LIMIT 10;

Câu lệnh này sẽ trả về 10 hàng đầu tiên từ bảng NhanVien.

  1. Giới hạn số lượng hàng trả về với offset Để lấy 10 hàng bắt đầu từ hàng thứ 11:
   SELECT * FROM NhanVien
   LIMIT 10, 10;

Câu lệnh này sẽ bỏ qua 10 hàng đầu tiên và trả về 10 hàng tiếp theo từ bảng NhanVien. Trong cú pháp này, 10 đầu tiên là offset và 10 thứ hai là số lượng hàng muốn lấy.

  1. Kết hợp với ORDER BY Để lấy 5 hàng đầu tiên sau khi sắp xếp theo lương từ cao đến thấp:
   SELECT * FROM NhanVien
   ORDER BY Luong DESC
   LIMIT 5;

Câu lệnh này sẽ sắp xếp nhân viên theo lương từ cao đến thấp và trả về 5 hàng đầu tiên.

  1. Kết hợp với OFFSET Để lấy 10 hàng sau khi bỏ qua 20 hàng đầu tiên:
   SELECT * FROM NhanVien
   ORDER BY Luong DESC
   LIMIT 20, 10;

Câu lệnh này sẽ sắp xếp nhân viên theo lương từ cao đến thấp, bỏ qua 20 hàng đầu tiên, và trả về 10 hàng tiếp theo.

Lưu Ý

  • Kết quả không xác định nếu không có ORDER BY: Nếu không sử dụng mệnh đề ORDER BY, kết quả trả về có thể không nhất quán và không theo thứ tự nào cụ thể.
  • Hiệu suất: Sử dụng LIMIT giúp cải thiện hiệu suất của các truy vấn khi bạn chỉ cần một phần nhỏ của kết quả tổng thể, đặc biệt là khi làm việc với các bảng lớn.
  • Tương thích với các cơ sở dữ liệu khác: Mệnh đề LIMIT là đặc trưng của MySQL và một số hệ quản trị cơ sở dữ liệu khác như PostgreSQL. Trong SQL Server, bạn sử dụng TOP, còn trong Oracle, bạn sử dụng ROWNUM hoặc FETCH FIRST.

Tóm tắt

  • Mệnh đề LIMIT cho phép bạn giới hạn số lượng hàng trả về trong kết quả của một truy vấn.
  • Bạn có thể chỉ định số lượng hàng muốn trả về và điểm bắt đầu (offset).
  • Kết hợp LIMIT với ORDER BY để có kết quả chính xác theo thứ tự mong muốn.
  • Sử dụng LIMIT để cải thiện hiệu suất và làm việc với một phần nhỏ của dữ liệu khi cần thiết.