Khi bạn đang làm việc với cơ sở dữ liệu, bạn có thể muốn chạy if/then
trong truy vấn của bạn. Ví dụ:bạn có thể muốn xem qua danh sách nhân viên và thay đổi trạng thái thử việc của họ nếu họ đã làm việc với bạn hơn một năm. Hoặc bạn có thể muốn xem qua danh sách những người chơi trên bảng xếp hạng và đánh dấu họ là người chiến thắng nếu họ xếp hạng trong ba người hàng đầu.
Để chạy các hoạt động này trong SQL
, bạn phải sử dụng CASE
tuyên bố. SQL CASE
câu lệnh cho phép bạn chạy if/then
, tương tự như cách bạn có thể chạy if/then
thủ tục trong Microsoft Excel.
Trong hướng dẫn này, chúng ta sẽ phân tích những điều cơ bản về SQL CASE
và thảo luận về cách bạn có thể sử dụng nó trong các truy vấn của mình. Chúng ta cũng sẽ thảo luận về cách sử dụng nhiều SQL CASE
và khám phá cách thực hiện CASE
có thể được sử dụng với các hàm tổng hợp.
Trình làm mới truy vấn
Để lấy thông tin từ cơ sở dữ liệu, bạn cần viết một truy vấn. Các truy vấn hầu như luôn bắt đầu bằng SELECT
câu lệnh, được sử dụng để cho cơ sở dữ liệu biết cột nào sẽ được trả về bởi truy vấn. Các truy vấn cũng thường bao gồm FROM
mệnh đề này cho cơ sở dữ liệu biết hoạt động sẽ tìm kiếm bảng nào.
Đây là cú pháp cho một truy vấn trong SQL
:
SELECT column_name FROM table_name WHERE conditions_are_met;
Hãy sử dụng một ví dụ để minh họa điều này trong thực tế. Đây là một truy vấn sẽ trả về tên của tất cả nhân viên trong employees
của chúng tôi bảng:
SELECT name FROM employees;
Truy vấn của chúng tôi trả về kết quả:
name |
Luke Mike Hannah Geoff Alexis Emma Jonah Adam |
(8 hàng)
81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.
Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.
Nếu chúng tôi muốn truy xuất nhiều cột, chúng tôi có thể làm như vậy bằng cách tách tên của chúng bằng một cột. Hoặc nếu chúng tôi muốn thu thập thông tin về mọi cột, chúng tôi có thể sử dụng dấu hoa thị (*
), đại diện cho tất cả các cột trong SQL
bảng.
Ngoài ra, nếu chúng ta muốn lọc các bản ghi dựa trên một tập hợp các điều kiện cụ thể, chúng ta có thể sử dụng WHERE
mệnh đề. Dưới đây là ví dụ về truy vấn tìm tên của tất cả nhân viên làm việc tại chi nhánh Albany của một công ty:
SELECT name FROM employees WHERE branch = 'Albany';
Đây là kết quả của truy vấn của chúng tôi:
name |
Emma Jonah |
(2 hàng)
Đây là tất cả các truy vấn tương đối đơn giản. Nhưng điều gì sẽ xảy ra nếu chúng ta muốn thực hiện if/then
hoạt động khi chúng tôi đang chạy một truy vấn? Đó là nơi mà SQL
CASE
tuyên bố có thể hữu ích.
TRƯỜNG HỢP SQL
CASE
câu lệnh có thể được sử dụng trong SQL
để xác định if/then
logic trong mã của chúng tôi. Ví dụ:nếu chúng tôi muốn tăng lương cho mọi nhân viên đã làm việc với doanh nghiệp của chúng tôi từ năm năm trở lên, chúng tôi có thể muốn sử dụng CASE
tuyên bố.
Đây là cú pháp cho SQL CASE
tuyên bố:
SELECT column1_name CASE WHEN column2_name = 'X' THEN 'Y' ELSE NULL END AS column3_name FROM table_name;
Có rất nhiều điều xảy ra trong truy vấn này, vì vậy hãy sử dụng một ví dụ để minh họa cách hoạt động của nó. Giả sử chúng tôi muốn cung cấp cho mọi nhân viên có hơn năm employee of the month
thưởng 200 đô la tăng. Đây là SQL
tuyên bố có thể hoàn thành mục tiêu đó:
SELECT name, CASE WHEN employee_month_awards > 5 THEN 200 ELSE NULL END AS pending_raise FROM employees;
Truy vấn của chúng tôi trả về thông tin sau từ biểu thức chữ hoa thường đã tìm kiếm của chúng tôi:
name | pending_raise |
Luke | |
Mike | |
Hannah | |
Geoff | |
Alexis | |
Emma | 200 |
Jonah | |
Adam | 200 |
(8 hàng)
Hãy chia nhỏ điều này. CASE
câu lệnh kiểm tra từng bản ghi và đánh giá xem câu lệnh điều kiện, employee month awards > 5
, là đúng. Nếu câu lệnh điều kiện là đúng, giá trị 200
sẽ được in trong pending_raise
cột. Trong trường hợp câu lệnh điều kiện sai, giá trị null vẫn còn.
Cuối cùng, truy vấn của chúng tôi trả về danh sách tên nhân viên, cũng như mức tăng lương đang chờ xử lý của những nhân viên đó.
Điều quan trọng cần lưu ý là SQL CASE
câu lệnh không thêm một cột mới vào bảng của chúng tôi. Đúng hơn, nó tạo một cột trong SELECT
của chúng tôi truy vấn đầu ra , để chúng tôi có thể biết ai đủ điều kiện được tăng lương.
Ngoài ra, nếu chúng tôi muốn tất cả những người không đủ điều kiện tăng lương sẽ được tặng một đang chờ tăng lương, chúng tôi có thể chỉ định
thay vì
NULL
trong ELSE
của chúng tôi tuyên bố. Chúng tôi cũng có thể sử dụng ORDER BY
mệnh đề đặt hàng cho tuyên bố của chúng tôi nếu chúng tôi muốn xem dữ liệu của mình theo một thứ tự cụ thể.
SQL CASE và nhiều điều kiện
CASE
câu lệnh có thể được sử dụng nhiều lần trong cùng một truy vấn. Nếu chúng tôi muốn tặng cho mọi nhân viên có ba giải thưởng trở lên được tăng 50 đô la và tất cả những người có từ năm giải thưởng trở lên được tăng 200 đô la, chúng tôi có thể sử dụng câu sau:
SELECT name, CASE WHEN employee_month_awards > 5 THEN 200 WHEN employee_month_awards > 3 THEN 50 ELSE 0 END AS pending_raise FROM employees;
Kết quả từ truy vấn của chúng tôi như sau:
name | pending_raise |
Luke | 50 |
Mike | |
Hannah | |
Geoff | |
Alexis | |
Emma | 200 |
Jonah | 50 |
Adam | 200 |
(8 hàng)
Trong ví dụ của chúng tôi, CASE
các câu lệnh sẽ được đánh giá theo thứ tự mà chúng được viết.
Vì vậy, truy vấn của chúng tôi trước tiên sẽ kiểm tra những người có hơn năm giải thưởng và đặt mức tăng đang chờ xử lý của họ lên 200
. Sau đó, truy vấn của chúng tôi sẽ kiểm tra những người có nhiều hơn ba giải thưởng và đặt mức tăng đang chờ xử lý của họ lên 50
. Cuối cùng, nếu một nhân viên không đáp ứng bất kỳ tiêu chí nào, mức tăng lương đang chờ xử lý của họ sẽ được đặt thành .
Tuy nhiên, mã này có thể hiệu quả hơn. Thay vì viết các câu lệnh theo một thứ tự nhất định để chương trình của chúng ta hoạt động, chúng ta nên viết các câu lệnh không trùng nhau. Dưới đây là ví dụ về truy vấn hoạt động theo cách tương tự như trên, nhưng sử dụng AND
báo cáo để kiểm tra số lượng giải thưởng mà một nhân viên đã giành được:
SELECT name, CASE WHEN employee_month_awards >= 3 AND employee_month_awards <= 5 THEN 50 WHEN employee_month_awards > 5 THEN 200 ELSE 0 END AS pending_raise FROM employees;
Truy vấn của chúng tôi trả về giống như truy vấn ở trên của chúng tôi. Tuy nhiên, điều này không phụ thuộc vào thứ tự của CASE
, có nghĩa là chúng tôi ít có khả năng mắc lỗi với một tuyên bố không đúng chỗ.
SQL CASE và hàm tổng hợp
Bạn cũng có thể sử dụng CASE
với một hàm tổng hợp. Điều này có thể hữu ích nếu bạn chỉ muốn đếm các hàng đáp ứng một điều kiện nhất định. Ví dụ:nếu bạn muốn biết có bao nhiêu nhân viên đã kiếm được khoản tiền thưởng 200 đô la, bạn có thể sử dụng CASE
với một chức năng tổng hợp.
Đây là cú pháp để sử dụng CASE
với một hàm tổng hợp:
SELECT column1_name CASE WHEN column2_name = 'X' THEN 'Y' ELSE NULL END AS column3_name, COUNT(1) AS count FROM table_name GROUP BY column3_name;
Hãy sử dụng một ví dụ để minh họa cách hoạt động của điều này. Giả sử chúng tôi muốn tìm hiểu xem có bao nhiêu nhân viên đủ điều kiện nhận khoản tiền thưởng từ 50 đô la trở lên. Chúng tôi có thể sử dụng truy vấn sau để lấy thông tin này:
SELECT CASE WHEN employee_month_awards >= 3 AND employee_month_awards <= 5 THEN 50 WHEN employee_month_awards > 5 THEN 200 ELSE 0 END AS pending_raise, COUNT(1) AS count FROM employees GROUP BY pending_raise;
Truy vấn của chúng tôi trả về như sau:
pending_raise | số lượng |
50 | 3 |
3 | |
200 | 2 |
Như bạn có thể thấy, truy vấn của chúng tôi đã trả về danh sách các khoản tăng lương đang chờ xử lý mà nhân viên kiếm được, cũng như số lượng từng loại tăng lương mà nhân viên phải trả. Trong trường hợp này, ba nhân viên đến hạn phải tăng 50 đô la, ba nhân viên không đến hạn tăng lương và hai nhân viên đến hạn tăng 200 đô la.
Kết luận
Trong hướng dẫn này, chúng tôi đã chia nhỏ những điều cơ bản về SQL
máy chủ CASE
và thảo luận về cách nó có thể được sử dụng để triển khai if/then
logic trong các truy vấn của chúng tôi. Chúng tôi cũng đã thảo luận về cách CASE
có thể được sử dụng với nhiều điều kiện và các hàm tổng hợp.
Xin nhắc lại, mọi CASE
đơn giản biểu thức phải tuân theo các quy tắc sau:
-
CASE
câu lệnh phải nằm trongSELECT
mệnh đề; -
CASE
câu lệnh phải bao gồmWHEN
,THEN
vàEND
thành phần; - Nhiều
WHEN
câu lệnh vàELSE
mệnh đề có thể được sử dụng tùy ý; - Các câu lệnh có điều kiện, chẳng hạn như
AND
hoặcOR
, có thể được sử dụng trongCASE
truy vấn giữaWHEN
vàTHEN
mệnh đề.
Giờ đây, bạn đã được trang bị kiến thức cần thiết để sử dụng CASE
các câu lệnh như SQL
chuyên nghiệp!