Xin chào các bạn, trong quá trình làm việc chắc hẳn nhu cầu lọc dữ liệu theo những điều kiện là một trong các nhu cầu phát sinh nhiều nhất, vậy với SQL chúng ta sẽ thực hiện các điều kiện đó như thế nào cho đúng cách và tối ưu nhất.
Các bạn hãy cùng Datapot tìm hiểu về vấn đề này một cách chi tiết nhất nhé!
Giới thiệu chung về mệnh đề WHERE
Mệnh đề WHERE là gì?
Mệnh đề WHERE trong SQL được sử dụng để lọc dữ liệu từ một bảng cơ sở dữ liệu hoặc nhiều bảng dựa trên một hoặc nhiều điều kiện.
Mục đích
Giúp thu hẹp kết quả của một truy vấn, loại bỏ những bản ghi không phù hợp, chỉ hiển thị dữ liệu thỏa mãn các điều kiện được đặt ra.
Cấu trúc cơ bản của câu lệnh chứa WHERE
Câu lệnh WHERE cơ bản:
Trong đó:
- column1, column2, …: Các trường thông tin kỳ vọng trong bảng kết quả trả ra.
- table_name: Tên của bảng ta cần truy vấn để lấy thông tin.
- condition: Điều kiện để lọc dữ liệu, các bản ghi thỏa mãn điều kiện sẽ có trong bảng kết quả; ngược lại sẽ bị loại bỏ.
Thứ tự thực hiện câu lệnh SQL khi có mệnh đề WHERE
Trong SQL mệnh đề WHERE được thực hiện sau câu lệnh FROM, trong trường hợp câu lệnh có nhiều bảng kết hợp thì WHERE sẽ được thực hiện dựa trên đầu vào là dữ liệu kết quả của truy vấn JOIN bằng điều kiện kết hợp ON.
Các điều kiện trong phần WHERE được áp dụng để lọc các hàng dựa trên các giá trị của các cột từ các bảng đã kết hợp.
Một số toán tử được sử dụng trong câu lệnh WHERE
Sau đây chúng ta cùng nhau tìm hiểu chi tiết hơn về các toán tử thường được sử dụng với mệnh đề WHERE nhất nhé.
Toán tử BETWEEN
- Toán tử BETWEEN chọn các giá trị trong một phạm vi nhất định. Trong đó, các giá trị có thể là số, văn bản hoặc ngày tháng.
- Giải thích ví dụ: Từ bảng dữ liệu DimProduct, lấy ra tất cả các bản ghi có giá trị trong cột ListPrice nằm trong khoảng 25 đến 30 (bao gồm cả giá trị 25 và 30)
Toán tử IN
- Toán tử IN cho phép ta chỉ định nhiều giá trị trong mệnh đề WHERE (chính một cách viết tắt của nhiều điều kiện OR).
- Giải thích ví dụ: Từ bảng dữ liệu DimProduct, lấy ra tất cả các bản ghi có giá trị trong cột Color là “Black” hoặc “White”.
Toán tử IS NULL
- Toán tử IS NULL được dùng để kiểm tra giá trị NULL. Giá trị NULL trong một bảng là một giá trị trong trường thông tin bị bỏ trống, hay nói cách khác, một trường không có giá trị nào.
- Giải thích ví dụ: Từ bảng dữ liệu DimProduct, lấy ra các bản ghi có giá trị ở cột ListPrice là NULL.
Lưu ý khi sử dụng các toán tử với giá trị NULL:
Trong SQL, giá trị NULL được sử dụng để đại diện cho dữ liệu bị thiếu hoặc không xác định. Khi sử dụng WHERE với giá trị NULL, cần lưu ý những điều sau:
- Toán tử “=” : Toán tử này không thể được sử dụng để so sánh giá trị NULL với bất kỳ giá trị nào khác, bởi vì kết quả của phép so sánh sẽ luôn là NULL. Thay vào đó, để kiểm tra giá trị NULL, bạn nên sử dụng toán tử IS NULL.
- Toán tử “<>”: Toán tử này cũng không thể sử dụng để so sánh giá trị NULL. Kết quả của phép so sánh sẽ luôn là NULL. Tương tự như toán tử “=”, bạn nên sử dụng toán tử IS NOT NULL để kiểm tra giá trị không phải NULL.
- Toán tử IN: Khi sử dụng toán tử IN, giá trị NULL không thể so sánh trực tiếp với danh sách giá trị. Nếu bạn muốn kiểm tra xem giá trị có trong danh sách và không phải là NULL, bạn cần thêm điều kiện OR column_name IS NULL.
- Toán tử IS NULL và IS NOT NULL: Đây là các toán tử đặc biệt được sử dụng để kiểm tra giá trị NULL. Toán tử IS NULL trả về ‘true’ nếu giá trị là NULL, toàn tử IS NOT NULL cũng trả về ‘true’ nếu giá trị không phải NULL.
Lưu ý rằng kết quả của phép so sánh với NULL (bao gồm cả các phép toán và các toán tử so sánh khác) thường sẽ trả về giá trị NULL. Do đó, cẩn thận khi sử dụng các toán tử và thực hiện kiểm tra giá trị NULL trong câu truy vấn.
Toán tử LIKE
- Toán tử LIKE được dùng để so sánh một giá trị với các giá trị tương tự bằng cách sử dụng các toán tử đại diện (wildcard).
- Wildcard trong SQL là một ký tự đặc biệt được sử dụng để thay thế hoặc mô phỏng một hoặc nhiều ký tự trong một mẫu chuỗi. Các wildcard phổ biến trong SQL bao gồm:
Một số lưu ý trong khi sử dụng mệnh đề WHERE
(1) Với trường hợp cột được chọn được lưu dưới dạng tên thay thế (Alias) là X nào đó, mệnh đề WHERE sẽ không thể tìm truy vấn theo điều kiện của X. Do mệnh đề WHERE được thực thi trước mệnh đề SELECT
=> Khi đó ta sẽ dùng bảng tạm (CTE) hay Sub-query để xác định trước các cột đó, hoặc không ta sẽ nhắc lại tên nguyên bản ban đầu của X/ hoặc công thức tạo ra X tại mệnh đề WHERE để câu lệnh được thực thi.
(2) Khi có nhiều bảng kết hợp (JOIN), mệnh đề WHERE được áp dụng sau khi các bảng đã được kết hợp. Do đó, có thể sử dụng cột từ bất kỳ bảng nào có trong mệnh đề FROM để xác định điều kiện lọc.
Tại bài này chúng ta sẽ tập trung làm rõ cách kết hợp nhiều điều kiện với nhau trong câu lệnh WHERE, hãy cùng Datapot thực hiện ngay sau đây nhé.
CÁCH DÙNG MỆNH ĐỀ WHERE kết hợp với điều kiện AND và OR
Toán tử logical: AND
Giả sử, chúng ta có yêu cầu:
& Từ bảng DimEmployee (thông tin về nhân viên) lấy ra tất cả thông tin của các nhân viên bao gồm: FirstName, Title, DepartmentName, HireDate, BirthDate, EmailAddress, VacationHours thỏa mãn các điều kiện sau:
- Làm việc tại phòng Tool Design (DepartmentName)
- Có số giờ nghỉ lễ trên 10 giờ (VacationHours)
% Phân tích đề bài: Ở đây bất cứ nhân viên nào được lấy ra cũng thỏa mãn cả hai điều kiện trên, hay các điều kiện được xét đồng thời. Tất cả các điều kiện trả về True thì bản ghi đó sẽ được hiển thị ở bảng kết quả.
Do vậy chúng ta sử dụng toán tử AND để nối hai điều kiện:
! Kết quả trả ra:
Như vậy có 02 nhân viên thỏa mãn cả 02 điều kiện, dữ liệu của họ được trả ra khi chúng ta thực hiện run.
Toán tử logical: OR
Tương tự, giả sử chúng ta có yêu cầu:
& Từ bảng DimEmployee (thông tin về nhân viên) lấy ra tất cả thông tin của các nhân viên bao gồm: FirstName, Title, DepartmentName, HireDate, BirthDate, EmailAddress, VacationHours thỏa mãn một trong các điều kiện sau:
- Làm việc tại phòng Tool Design (DepartmentName)
- Có số giờ nghỉ lễ trên 10 giờ (VacationHours)
% Phân tích đề bài: Ở đây bất cứ nhân viên nào được lấy ra chỉ yêu cầu thỏa mãn một trong hai điều kiện, hay các điều kiện được xét riêng lẻ. Chỉ cần tồn tại ít nhất một điều kiện trả về True bản ghi đó sẽ được ghi nhận tại bảng kết quả.
Do vậy chúng ta sử dụng toán tử OR để nối hai điều kiện:
! Kết quả trả ra:
Như vậy có 265 nhân viên thỏa mãn một trong hai điều kiện, dữ liệu của họ được trả ra khi chúng ta thực hiện run.
Quy tắc kết hợp AND và OR
Giả sử, chúng ta có yêu cầu:
& Từ bảng DimEmployee (thông tin về nhân viên) lấy ra tất cả thông tin của các nhân viên bao gồm: FirstName, Title, DepartmentName, HireDate, BirthDate, EmailAddress, VacationHours thỏa mãn:
- Làm việc tại phòng Tool Design (DepartmentName) <1.1>
hoặc:
- Sinh năm 1970-1980 <1.2>
Và bắt buộc có số giờ nghỉ lễ trên 10 giờ (VacationHours) <2>
% Phân tích đề bài: Với đầu bài nêu trên chúng ta không chỉ đơn thuần dùng AND hay OR là có thể giải quyết được, với bài này chúng ta sẽ kết hợp cả AND và OR
QUY ƯỚC:
(1) Điều kiện AND luôn thực hiện trước điều kiện OR
(2) Có thể dùng cặp dấu ngoặc đơn () để đánh dấu các điều kiện có cùng cấp bậc. Dấu ngoặc đơn được ưu tiên cao nhất trong một biểu thức logic. Các điều kiện bên trong ngoặc đơn sẽ được thực hiện trước các phép toán AND và OR bên ngoài.
Bạn hãy cứ tưởng tượng lại khi đi học cấp một, chúng ta luôn có “câu thần chú” : NHÂN CHIA TRƯỚC, CỘNG TRỪ SAU. Vậy khi muốn thực hiện phép cộng trước phép nhân, thì phải làm như thế nào?
Câu trả lời là, chúng ta sẽ dùng cặp dấu ngoặc đơn để tăng thứ tự ưu tiên cho phép cộng:
Ví dụ:
Phép tính: (3 + 5) x 2 = 8 x 2 = 16
Quay lại đề bài trên, chúng ta có thể viết như sau:
! Kết quả trả ra:
Như vậy có 109 nhân viên thỏa mãn.
Tối ưu hóa hiệu suất trong câu lệnh WHERE
Hạn chế sử dụng hàm (function) trong mệnh đề WHERE
Thay vì viết:
Ta hãy viết:
Sử dụng LIKE thay vì NOT LIKE
Việc sử dụng NOT LIKE trong một câu lệnh SQL có thể yêu cầu quét (scan) toàn bộ bảng để tìm kiếm các giá trị không khớp với điều kiện được chỉ định. Điều này có thể dẫn đến hiệu suất kém khi có một bảng lớn hoặc khi điều kiện không khớp được tìm thấy ở các hàng phổ biến.
Thay vào đó, nếu có thể, hãy sử dụng toán tử LIKE và loại trừ đi kết quả của nó. Việc này thường hiệu quả hơn vì nó chỉ yêu cầu quét các hàng mà thỏa mãn điều kiện cụ thể, không phải quét toàn bộ bảng.
Tránh đặt hàm số bên phải của toán tử so sánh, loại bỏ các phép toán thừa
Thay vì viết:
Hãy viết:
Các bài viết liên quan về tối ưu câu truy vấn SQL:
- SQL execution plan
- 10 kỹ thuật tối ưu câu truy vấn SQL
- Cách tối ưu truy vấn để không trở thành “kẻ huy diệt server”
Tạm kết
Như vậy là chúng ta đã nắm được những cách để lọc dữ liệu với một hoặc nhiều điều kiện với mệnh đề WHERE. Chúc các bạn có thể áp dụng vào bài học và công việc trên thực tế.
Các bạn có thể đọc thêm các bài viết khác của Datapot để thực hành và cập nhật thêm nhiều kiến thức về SQL.
Để việc tự học SQL hiệu quả bạn có thể xem chuỗi tài liệu tự học SQL có lộ trình 2024.
Và đừng quên tham khảo các khóa học về SQL của Datapot nhé!