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é!
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.
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 lệnh WHERE cơ bản:
Trong đó:
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.
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é.
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.
(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é.
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:
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.
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:
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.
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:
Như vậy có 109 nhân viên thỏa mãn.
Thay vì viết:
Ta hãy viết:
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.
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:
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