Học bằng cách đọc theo thứ tự

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.

Trước khi bắt đầu các bài thực hành, hãy xác nhận định nghĩa cộtdữ liệu mẫu của bảng staff.

① Chạy PRAGMA table_info(staff); để xem tên cột, kiểu và khóa chính.

② Chạy SELECT * FROM staff LIMIT 5; để xem trước 5 hàng đầu.

SQL Editor

Chạy truy vấn để xem kết quả

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".

Cấu trúc IF / IIF — Chuyển giá trị giữa Đúng và Sai
Gọi hàmKết quảIIF(100 < 200, 'T', 'F')'T'(điều kiện TRUE)IIF(500 > 1000, 'T', 'F')'F'(điều kiện FALSE)IIF(salary >= 5000000, 'High', 'Normal')xét salary từng hàng→ 'High' hoặc 'Normal'
Nếu điều kiện TRUE thì trả về tham số thứ 2, nếu FALSE thì tham số thứ 3. Thay vì xóa hàng như WHERE, hãy hình dung là đổi giá trị của cột kết quả.
-- 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;

Hãy hình dung một danh sách nhân viên cho cuộc họp ban điều hành, nơi bạn muốn "gắn nhãn lương từ 5,000,000 trở lên là High và còn lại là Normal". (Lời giải hiện ra khi bạn chạy đúng.)

① Từ bảng staff, lấy name, salary, và `IIF(salary >= 5000000, 'High', 'Normal')` đặt bí danh là `rank` — tổng cộng 3 cột.

SQL Editor

Chạy truy vấn để xem kết quả

Sự khác biệt giữa WHERE và IF — Xóa hàng so với Đổi giá trị

WHEREIF đề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.

Sự khác biệt giữa WHERE và IIF
WHEREIIFchỉ giữ hàng cóđiều kiện TRUEgiữ mọi hàng, chỉđổi giá trị cột→ số hàng thay đổi(xóa theo chiều dọc)→ số hàng không đổi(biến đổi chiều ngang)
WHERE thu hẹp hàng (xóa theo chiều dọc); IIF đổi giá trị cột (biến đổi theo chiều ngang). Hai vai trò độc lập và kết hợp tốt với nhau.
-- 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';

Hãy hình dung yêu cầu "liệt kê bậc lương cho các thành viên ở Tokyo".

① Từ bảng staff, lấy name, salary, và `IIF(salary >= 5000000, 'High', 'Normal')` đặt bí danh là `rank` — 3 cột.

② Thu hẹp về các hàng mà `city` là `'Tokyo'`.

SQL Editor

Chạy truy vấn để xem kết quả

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;

Hãy hình dung yêu cầu "chỉ gắn một nhãn đặc biệt cho nhân viên họ Tanaka ở Tokyo". Bạn sẽ thử viết một điều kiện ghép như `name LIKE '%Tanaka'` AND `city = 'Tokyo'` trong một IIF duy nhất.

① Từ bảng staff, lấy name, city, và `IIF(name LIKE '%Tanaka' AND city = 'Tokyo', 'Tokyo Tanaka', 'Other')` đặt bí danh là `tag` — 3 cột.

SQL Editor

Chạy truy vấn để xem kết quả

Hãy hình dung yêu cầu "hiển thị top 3 theo lương đồng thời chú thích mỗi người bằng một nhãn bậc".

① Từ bảng staff, lấy name, salary, và `IIF(salary >= 5000000, 'High', 'Normal')` đặt bí danh là `rank` — 3 cột.

② Sắp xếp theo `salary` giảm dần và giới hạn ở 3 hàng đầu.

SQL Editor

Chạy truy vấn để xem kết quả
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

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)?

Câu 2Đâu là sự khác biệt đúng giữa WHEREIIF?

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ì?