Mệnh đề WHERE trong SQL: làm chủ truy vấn lọc dữ liệu

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 đó:

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ệnh đề WHERE

Một số toán tử được sử dụng trong câu lệnh WHERE

A close-up of a text Description automatically generated

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ử IN

Toán tử IS 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:

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

Ký tự WildcardMô tảMinh họa

%

% Bất kỳ chuỗi nào có hoặc nhiều ký tự.

WHERE Title LIKE ‘%computer%’: tìm tất cả các tiêu đề có chứa từ ‘computer’

_

Một ký tự đơn lẻ

WHERE Firstname LIKE ‘_ean’: tìm tất cả các tên có bốn chữ cái kết thúc bằng ean (VD: Sean, Dean,…)

Bất kỳ ký tự đơn nào trong phạm vi đã chỉ định

WHERE Firstname LIKE ‘[A-P]an’: tìm tất cả tên kết thúc bằng “an” và bắt đầu với bất kỳ ký tự đơn nào giữa A và P, ví dụ “Lan”, “Han”,…

Bất kỳ ký tự đơn nào không nằm trong phạm vi đã chỉ định

WHERE Name LIKE ‘%[^ab]%: tìm tất cả tên chứa ký tự khác ngoài ‘a’ và ‘b’

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:

% 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:

A screenshot of a computer Description automatically generated

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:

% 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:

A screenshot of a computer Description automatically generated

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:

hoặc:

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:

Mệnh đề WHERE trong SQL: làm chủ truy vấn lọc dữ liệu

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:

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é!

Link nội dung: https://world-link.edu.vn/index.php/hay-cho-biet-y-kien-nao-la-sai-voi-mot-bang-du-lieu-he-quan-tri-co-so-du-lieu-cho-phep-a38239.html