Câu 1Trong các phát biểu sau, phát biểu nào mô tả đúng IIF(điều kiện, X, Y)?
Hàm ④ — IF / IIF để rẽ nhánh theo một điều kiện
Bài thứ tư về hàm SQL. Rẽ nhánh một giá trị theo một điều kiện đúng/sai với IF / IIF, sự khác biệt so với WHERE, kết hợp với LIKE và AND, và xếp chồng ORDER BY / LIMIT — trên tập dữ liệu staff được tải từ CSV.
Dữ liệu dùng trong bài này — bảng staff
Đến giờ chúng ta đã đi qua các hàm trong ba bài; bài này và hai bài tiếp theo bàn về chuyển đổi nội dung hiển thị dựa trên một điều kiện. Từ cùng một giá trị cột, bạn có thể gắn nhãn phân loại như "High" hay "Normal" tùy điều kiện có thỏa hay không, hoặc gộp nhiều giá trị vào một cột kết quả duy nhất.
IF / IIF — Chuyển đổi một giá trị theo một điều kiện
Hàm cơ bản nhất để chuyển đổi giá trị hiển thị dựa trên một điều kiện là IF / IIF. Cú pháp như bên dưới, và hai dạng này hoàn toàn cùng ý nghĩa.
- MySQL: IF(điều kiện, giá trị khi đúng, giá trị khi sai)
- Console của khóa học này / SQL Server: IIF(điều kiện, giá trị khi đúng, giá trị khi sai)
Console của khóa học này không có hàm IF, nên các bài thực hành dùng IIF. Khác với WHERE, nó không lọc hàng — chỉ thay đổi giá trị của cột kết quả, nên bạn dùng nó khi muốn "giữ tất cả các hàng nhưng đổi nhãn hiển thị theo giá trị từng cột".
-- 1) Kiểm tra nhanh với hằng
SELECT IIF(100 < 200, 'T', 'F'); -- 'T'
SELECT IIF(500 > 1000, 'T', 'F'); -- 'F'
-- 2) Dùng cột — 'HQ' nếu city là Tokyo, ngược lại 'Branch'
SELECT name, city,
IIF(city = 'Tokyo', 'HQ', 'Branch') AS office
FROM staff;
-- Tham khảo: trong MySQL, dùng IF()
-- SELECT IF(city = 'Tokyo', 'HQ', 'Branch') FROM staff;
Sự khác biệt giữa WHERE và IF — Xóa hàng so với Đổi giá trị
WHERE và IF đều nhận một điều kiện, nhưng tác động lên kết quả thì hoàn toàn khác nhau.
- `WHERE`: chỉ giữ các hàng mà điều kiện TRUE, và xóa các hàng FALSE / NULL
- `IF` / `IIF`: giữ mọi hàng và chỉ đổi giá trị cột theo điều kiện
Hai cái kết hợp được. Một mẫu điển hình là "chỉ hiển thị nhân viên ở Tokyo, và chia bậc lương từng người thành High / Normal": trước hết thu hẹp hàng với WHERE, rồi biến đổi hiển thị bằng IIF trong danh sách cột SELECT.
-- Kết hợp WHERE và IIF
-- 1) Dùng WHERE chỉ giữ nhân viên ở Osaka
-- 2) Dùng IIF phân loại lương từ 6,000,000 trở lên là 'Senior'
SELECT name, salary,
IIF(salary >= 6000000, 'Senior', 'General') AS grade
FROM staff
WHERE city = 'Osaka';
Kết hợp với LIKE và AND, và xếp chồng ORDER BY / LIMIT
Vì điều kiện của IIF chấp nhận các biểu thức giống WHERE, bạn có thể kết hợp nó với LIKE (khớp mẫu) hoặc AND / OR (điều kiện ghép). Các nhánh như "gắn nhãn họ Tanaka nếu tên chứa Tanaka" hay "ace nếu từ 30 tuổi trở lên và ở Tokyo" gọn trong một dòng.
AS bí_danh trên cột kết quả cũng có thể là đối tượng của `ORDER BY`, nên sắp xếp theo cột nhãn do IIF tạo ra rồi giới hạn hàng với LIMIT là một mẫu cơ bản cho việc xuất báo cáo trong thực tế.
-- 1) IIF + LIKE: gắn nhãn 'Tanaka' nếu họ là Tanaka
SELECT name,
IIF(name LIKE '%Tanaka', 'Tanaka', 'Other') AS surname_check
FROM staff;
-- 2) IIF + AND: điều kiện ghép theo tuổi-tương-đương + thành phố
SELECT name, birthday, city,
IIF(strftime('%Y', birthday) <= '1989' AND city = 'Osaka',
'Osaka senior', 'Other') AS tag
FROM staff;
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Đâu là sự khác biệt đúng giữa WHERE và IIF?
Câu 3Cách viết lại đúng khi chạy IF(salary >= 5000000, 'High', 'Normal') của MySQL trong console của khóa học này là gì?