Hệ thống toán tử trong MySQL
Thứ tự ưu tiên của toán tử
Trong MySQL, các toán tử được thực thi theo trình tự ưu tiên từ cao xuống thấp. Các toán tử nằm trên cùng một dòng có mức ưu tiên tương đương và sẽ được xử lý từ trái sang phải:- INTERVAL
- BINARY, COLLATE
- ! (Phép phủ định)
- - (Số âm), ~ (Đảo bit)
- ^ (XOR bit)
- *, /, DIV, %, MOD
- -, +
- <<, >> (Dịch bit)
- & (AND bit)
- | (OR bit)
- =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
- BETWEEN, CASE, WHEN, THEN, ELSE
- NOT
- AND, &&
- XOR
- OR, ||
- =, := (Phép gán)
Toán tử so sánh
Các toán tử này trả về kết quả 1 (TRUE), 0 (FALSE) hoặc NULL.- COALESCE(): Trả về giá trị đầu tiên khác NULL trong danh sách.
- GREATEST() / LEAST(): Tìm giá trị lớn nhất hoặc nhỏ nhất trong tập tham số.
- IS NULL / IS NOT NULL: Kiểm tra trạng thái rỗng của dữ liệu.
- BETWEEN ... AND ...: Kiểm tra giá trị có nằm trong một khoảng xác định hay không.
- IN(): Kiểm tra giá trị có thuộc một tập hợp cụ thể.
- STRCMP(s1, s2): So sánh hai chuỗi ký tự (trả về 0 nếu bằng nhau).
Hàm kiểm soát luồng (Flow Control)
Các hàm này giúp xử lý logic điều kiện ngay trong câu lệnh SQL:
- CASE: Cấu trúc rẽ nhánh phức tạp.
SELECT ten_san_pham, CASE WHEN ton_kho > 100 THEN 'Con hang' WHEN ton_kho > 0 THEN 'Sap het' ELSE 'Het hang' END AS trang_thai FROM kho_hang; - IF(expr1, expr2, expr3): Nếu expr1 đúng, trả về expr2, ngược lại trả về expr3.
- IFNULL(val, default): Nếu val là NULL, trả về giá trị mặc định.
- NULLIF(val1, val2): Nếu hai giá trị bằng nhau, trả về NULL.
Xử lý chuỗi ký tự (String Functions)
- CONCAT(str1, str2, ...): Ghép các chuỗi lại với nhau. Trả về NULL nếu có bất kỳ tham số nào là NULL.
- CONCAT_WS(separator, str1, str2, ...): Ghép chuỗi với ký tự phân cách (bỏ qua các giá trị NULL).
- CHAR_LENGTH(): Đếm số lượng ký tự trong chuỗi.
- LENGTH(): Trả về độ dài chuỗi tính bằng byte.
- LEFT(str, len) / RIGHT(str, len): Trích xuất chuỗi từ phía trái hoặc phải.
- SUBSTRING(str, pos, len): Cắt chuỗi từ vị trí xác định.
- UPPER() / LOWER(): Chuyển đổi chữ hoa/chữ thường.
- TRIM() / LTRIM() / RTRIM(): Loại bỏ khoảng trắng thừa.
- REPLACE(str, from_str, to_str): Thay thế toàn bộ chuỗi con được tìm thấy.
- LPAD() / RPAD(): Chèn thêm ký tự vào bên trái hoặc phải chuỗi để đạt độ dài mong muốn.
Hàm tính toán số học
- ABS(x): Giá trị tuyệt đối.
- CEIL(x) / FLOOR(x): Làm tròn lên hoặc xuống số nguyên gần nhất.
- ROUND(x, d): Làm tròn số x với d chữ số thập phân.
- TRUNCATE(x, d): Cắt bỏ phần thập phân của x sau d vị trí mà không làm tròn.
- MOD(n, m): Lấy số dư của phép chia n cho m.
- RAND(): Tạo số ngẫu nhiên trong khoảng [0, 1].
Xử lý ngày tháng và thời gian
- NOW(): Trả về ngày giờ hiện tại của hệ thống.
- CURDATE() / CURTIME(): Chỉ lấy ngày hoặc chỉ lấy giờ hiện tại.
- DATE_ADD(date, INTERVAL expr unit): Cộng thêm một khoảng thời gian vào ngày cho trước.
SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH); -- Kết quả: 2023-02-01 - DATEDIFF(d1, d2): Tính số ngày chênh lệch giữa hai mốc thời gian.
- DATE_FORMAT(date, format): Định dạng ngày tháng theo yêu cầu (ví dụ: '%d/%m/%Y').
- LAST_DAY(date): Tìm ngày cuối cùng của tháng chứa ngày truyền vào.
- EXTRACT(unit FROM date): Tách lấy một phần (năm, tháng, ngày, giờ...) từ dữ liệu thời gian.
Hàm chuyển đổi kiểu dữ liệu
Sử dụng CAST() hoặc CONVERT() để thay đổi kiểu của dữ liệu:
-- Chuyển một chuỗi sang kiểu số nguyên
SELECT CAST('123' AS UNSIGNED);
-- Chuyển sang kiểu ngày tháng
SELECT CONVERT('2023-12-31', DATE);
Hàm tập hợp (Aggregate Functions)
Thường được sử dụng kết hợp với mệnh đề GROUP BY:
- COUNT(): Đếm số lượng bản ghi.
- SUM(): Tính tổng các giá trị số.
- AVG(): Tính giá trị trung bình.
- MAX() / MIN(): Tìm giá trị lớn nhất và nhỏ nhất trong nhóm.
Kỹ thuật truy vấn con (Subqueries)
Subquery cho phép lồng một câu lệnh SELECT vào bên trong một truy vấn khác để xử lý các logic phức tạp:
-- Tìm nhân viên có lương cao hơn mức trung bình
SELECT ho_ten, luong
FROM nhan_vien
WHERE luong > (SELECT AVG(luong) FROM nhan_vien);
-- Sử dụng EXISTS để kiểm tra sự tồn tại
SELECT ten_khach_hang
FROM khach_hang k
WHERE EXISTS (SELECT 1 FROM don_hang d WHERE d.khach_hang_id = k.id);
-- Truy vấn con trong mệnh đề FROM (Derived Table)
SELECT AVG(tong_chi_tieu)
FROM (
SELECT khach_hang_id, SUM(tong_tien) AS tong_chi_tieu
FROM don_hang
GROUP BY khach_hang_id
) AS doanh_thu_khach;