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ớiORDER BY
vàLIMIT
để 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 HoTen
và ChucVu
. 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ụngDISTINCT
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
DISTINCT
vàGROUP BY
: Trong một số trường hợp, bạn có thể sử dụngGROUP BY
để đạt được kết quả tương tự nhưDISTINCT
. Ví dụ,SELECT DISTINCT ChucVu FROM NhanVien
vàSELECT 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
- 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.
- 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.
- 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ặcDESC
, 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ưWHERE
vàLIMIT
để đ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
- 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ụ.
- 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ụ.
- 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
- 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.
- 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.
- 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 WHERE
và HAVING
WHERE
: Lọc các hàng trước khi nhóm dữ liệu. Sử dụngWHERE
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ụngHAVING
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ớiGROUP 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
- 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
.
- 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.
- 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.
- 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ụngTOP
, còn trong Oracle, bạn sử dụngROWNUM
hoặcFETCH 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ớiORDER 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.