Trong một số câu lệnh Ngôn ngữ truy vấn có cấu trúc (SQL) , WHERE
được dùng để giới hạn những hàng mà hoạt động đã cho sẽ ảnh hưởng. Họ thực hiện điều này bằng cách xác định các tiêu chí cụ thể mà mỗi hàng phải đáp ứng để nó được tác động, được gọi là điều kiện tìm kiếm . Các điều kiện tìm kiếm được tạo thành từ một hoặc nhiều vị từ , là các biểu thức đặc biệt đánh giá thành “đúng”, “sai” hoặc “không xác định” và các phép toán chỉ ảnh hưởng đến những hàng mà mọi vị từ trong WHERE
đánh giá là “đúng . ”
SQL cho phép user viết các điều kiện tìm kiếm bao gồm nhiều loại vị từ khác nhau, mỗi loại sử dụng một toán tử cụ thể để đánh giá các hàng. Hướng dẫn này sẽ phác thảo hai loại vị từ và các toán tử mà chúng sử dụng: toán tử so sánh và toán tử IS NULL
.
Mặc dù hướng dẫn này sẽ chỉ sử dụng các SELECT
trong các ví dụ của nó, nhưng các khái niệm được giải thích ở đây được dùng trong một số hoạt động SQL. Đặc biệt, WHERE
và điều kiện tìm kiếm của chúng là các thành phần quan trọng của hoạt động UPDATE
và DELETE
Để làm theo hướng dẫn này, bạn cần một máy tính chạy một số loại hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) sử dụng SQL. Các hướng dẫn và ví dụ trong hướng dẫn này đã được kiểm nghiệm bằng cách sử dụng môi trường sau:
IS NULL
Ta khuyến khích bạn xem qua phần Kết nối với MySQL và Cài đặt Database Mẫu sau đây để biết chi tiết về cách kết nối với server MySQL và tạo cơ sở dữ liệu thử nghiệm được sử dụng trong các ví dụ xuyên suốt hướng dẫn này.Lưu ý : Xin lưu ý nhiều RDBMS sử dụng các triển khai SQL duy nhất của riêng họ. Mặc dù các lệnh được nêu trong hướng dẫn này sẽ hoạt động trên hầu hết các RDBMS, bao gồm PostgreSQL và SQLite, nhưng cú pháp hoặc kết quả chính xác có thể khác nếu bạn kiểm tra chúng trên một hệ thống không phải MySQL.
Nếu hệ thống cơ sở dữ liệu SQL của bạn chạy trên một server từ xa, hãy SSH vào server từ máy cục bộ của bạn:
Sau đó, mở dấu nhắc server MySQL, thay thế sammy
bằng tên tài khoản user MySQL của bạn. Nếu bạn đang sử dụng thiết bị terminal tương tác được nhúng trên trang này, hãy lưu ý mật khẩu để sử dụng khi được yêu cầu là từ secret
:
Từ dấu nhắc, hãy tạo một cơ sở dữ liệu có tên là comparison_null_db
:
Nếu cơ sở dữ liệu được tạo thành công, bạn sẽ nhận được kết quả như sau:
Query OK, 1 row affected (0.01 sec)
Để chọn cơ sở dữ liệu comparison_null_db
sánh_null_db, hãy chạy câu lệnh USE
Database changed
Sau khi chọn comparison_null_db
, hãy tạo một bảng trong đó.
Để làm theo các ví dụ được sử dụng trong hướng dẫn này, hãy tưởng tượng rằng bạn và một group bạn bè của bạn đều quyết định trở nên hoạt động thể chất nhiều hơn và chạy bộ như một bài tập thể dục. Vì vậy, tất cả bạn bè của bạn đều đặt ra mục tiêu cá nhân là họ muốn chạy bao nhiêu dặm trong tháng tới. Bạn quyết định theo dõi mục tiêu quãng đường đi của bạn bè cũng như số dặm họ đã thực sự chạy, trong bảng SQL có ba cột sau:
name
: tên của mỗi người bạn của bạn, được thể hiện bằng varchar
với tối đa 15 ký tựgoal
mỗi người bạn về việc họ hy vọng chạy được bao nhiêu dặm trong tháng qua, được biểu thị dưới dạng số nguyên sử dụng kiểu dữ liệu int
result
: số dặm mà mỗi người bạn cuối cùng đã chạy trong suốt tháng, được biểu thị dưới dạng số int
Chạy câu CREATE TABLE
sau để tạo một bảng có tên running_goals
có ba cột sau:
Query OK, 0 rows affected (0.012 sec)
Sau đó tải running_goals
với một số dữ liệu mẫu. Chạy INSERT INTO
sau để thêm bảy hàng dữ liệu đại diện cho bảy người bạn của bạn, mục tiêu chạy và kết quả của họ:
Query OK, 7 rows affected (0.004 sec)
Records: 7 Duplicates: 0 Warnings: 0
Lưu ý ba trong số các giá trị result
NULL
. Với mục đích của ví dụ này, giả sử rằng những người bạn này chưa báo cáo số dặm mà họ đã chạy trong tháng qua nên result
của họ được nhập là NULL
.
Như vậy, bạn đã sẵn sàng làm theo phần còn lại của hướng dẫn và bắt đầu học cách sử dụng các IS NULL
trong SQL.
WHERE
Trong bất kỳ hoạt động SQL nào đọc dữ liệu từ một bảng hiện có, bạn có thể tuân theo mệnh đề FROM
WHERE
để giới hạn dữ liệu mà hoạt động sẽ ảnh hưởng. WHERE
thực hiện điều này bằng cách xác định điều kiện tìm kiếm; bất kỳ hàng nào không đáp ứng điều kiện tìm kiếm sẽ bị loại trừ khỏi hoạt động, nhưng bất kỳ hàng nào không được bao gồm.
Điều kiện tìm kiếm được tạo thành từ một hoặc nhiều vị từ hoặc biểu thức có thể đánh giá một hoặc nhiều biểu thức giá trị và trả về kết quả là “true”, “false” hoặc “không xác định”. Trong SQL, một biểu thức giá trị - đôi khi còn gọi là biểu thức vô hướng - là bất kỳ biểu thức nào sẽ trả về một giá trị duy nhất. Một biểu thức giá trị có thể là một giá trị chữ, như một chuỗi hoặc giá trị số, một biểu thức toán học hoặc một tên cột. Lưu ý luôn xảy ra trường hợp ít nhất một biểu thức giá trị trong một WHERE
là tên của một cột trong bảng được tham chiếu trong mệnh đề FROM
Khi chạy các truy vấn SQL có chứa WHERE
, DBMS sẽ áp dụng điều kiện tìm kiếm cho mọi hàng trong bảng logic được xác định bởi mệnh đề FROM
Sau đó, nó sẽ chỉ trả về các hàng mà mọi vị từ trong điều kiện tìm kiếm đánh giá là “true”.
Tiêu chuẩn SQL xác định 18 loại vị từ, mặc dù không phải mọi RDBMS đều bao gồm mỗi loại trong số chúng trong việc triển khai SQL. Dưới đây là năm trong số các loại vị từ được sử dụng phổ biến nhất, cũng như giải thích ngắn gọn về từng loại và các toán tử chúng sử dụng:
So sánh : Các vị từ so sánh so sánh một biểu thức giá trị này với một biểu thức giá trị khác; trong các truy vấn, luôn có trường hợp ít nhất một trong những biểu thức giá trị này là tên của một cột. Sáu toán tử so sánh là:
=
: kiểm tra xem hai giá trị có tương đương nhau không<>
: kiểm tra xem hai giá trị có tương đương không<
: kiểm tra xem giá trị đầu tiên có nhỏ hơn giá trị thứ hai hay không>
: kiểm tra xem giá trị đầu tiên có lớn hơn giá trị thứ hai hay không<=
: kiểm tra xem giá trị đầu tiên nhỏ hơn hoặc bằng giá trị thứ hai>=
: kiểm tra xem giá trị đầu tiên lớn hơn hoặc bằng giá trị thứ haiNull : Các dự đoán sử dụng IS NULL
kiểm tra xem các giá trị trong một cột nhất định có phải là Null hay không
Phạm vi : Các vị từ phạm vi sử dụng BETWEEN
để kiểm tra xem một biểu thức giá trị có nằm giữa hai biểu thức giá trị khác hay không
Thành viên : Loại vị từ này sử dụng IN
để kiểm tra xem một giá trị có phải là thành viên của một tập hợp nhất định hay không
Đối sánh mẫu : Các vị từ đối sánh mẫu sử dụng LIKE
để kiểm tra xem một giá trị có trùng với mẫu chuỗi hay không
Như đã đề cập trong phần giới thiệu, hướng dẫn này tập trung vào cách sử dụng IS NULL
của SQL để lọc dữ liệu.Nếu bạn muốn tìm hiểu cách sử dụng BETWEEN
hoặc IN
với các vị từ phạm vi và thành viên tương ứng, ta khuyến khích bạn xem hướng dẫn này về Cách sử dụng toán tử GIỮA và IN trong SQL . Ngoài ra, nếu bạn muốn tìm hiểu cách sử dụng LIKE
để lọc dữ liệu dựa trên mẫu chuỗi chứa các ký tự đại diện, hãy làm theo hướng dẫn về Cách sử dụng ký tự đại diện trong SQL . Cuối cùng, nếu bạn muốn tìm hiểu thêm về WHERE
nói chung, bạn có thể quan tâm đến hướng dẫn về Cách sử dụng mệnh đề WHERE trong SQL .
WHERE
vị từ so sánh mệnh đề WHERE sử dụng một trong sáu toán tử so sánh để so sánh một biểu thức giá trị với một biểu thức giá trị khác. Chúng thường tuân theo một cú pháp như sau:
Theo sau WHERE
là một biểu thức giá trị, trong hầu hết các phép toán SQL, là tên của một cột. Việc cung cấp tên cột dưới dạng biểu thức giá trị trong điều kiện tìm kiếm yêu cầu RDBMS sử dụng giá trị của mỗi hàng từ cột đó làm biểu thức giá trị cho lần lặp lại điều kiện tìm kiếm của hàng đó. Bởi vì hệ thống cơ sở dữ liệu áp dụng các điều kiện tìm kiếm cho từng hàng theo thứ tự, toán tử so sánh sau đó sẽ bao gồm hoặc lọc ra một hàng dựa trên việc liệu điều kiện tìm kiếm có đúng với giá trị của nó từ cột được chỉ định hay không.
Để minh họa, hãy chạy truy vấn sau đây sẽ trả về giá trị từ các cột goal
và name
của bảng running_goals
Lưu ý cách WHERE
sử dụng vị từ so sánh sẽ khiến truy vấn chỉ trả về các hàng có giá trị goal
40
:
Chỉ có hai mục tiêu của bạn bè bạn là chạy chính xác 40 dặm trong tháng qua, vì vậy truy vấn chỉ trả về hai hàng đó:
+---------+------+
| name | goal |
+---------+------+
| Bridget | 40 |
| Leslie | 40 |
+---------+------+
2 rows in set (0.00 sec)
Để minh họa cách hoạt động của các toán tử so sánh khác, hãy chạy các truy vấn sau đây giống với ví dụ trước ngoại trừ mỗi truy vấn sử dụng một toán tử so sánh khác nhau.
<>
kiểm tra xem hai giá trị có tương đương hay không , vì vậy truy vấn này trả về mọi hàng có giá trị goal
40
:
+----------+------+
| name | goal |
+----------+------+
| Michelle | 55 |
| Jerry | 25 |
| Milton | 45 |
| Wanda | 30 |
| Stewart | 35 |
+----------+------+
5 rows in set (0.00 sec)
<
kiểm tra xem biểu thức giá trị đầu tiên có nhỏ hơn giá trị thứ hai hay không:
+---------+------+
| name | goal |
+---------+------+
| Jerry | 25 |
| Wanda | 30 |
| Stewart | 35 |
+---------+------+
3 rows in set (0.00 sec)
>
kiểm tra xem biểu thức giá trị đầu tiên có lớn hơn biểu thức thứ hai hay không:
+----------+------+
| name | goal |
+----------+------+
| Michelle | 55 |
| Milton | 45 |
+----------+------+
2 rows in set (0.00 sec)
<=
kiểm tra xem giá trị đầu tiên nhỏ hơn hoặc bằng giá trị thứ hai:
+---------+------+
| name | goal |
+---------+------+
| Jerry | 25 |
| Bridget | 40 |
| Wanda | 30 |
| Stewart | 35 |
| Leslie | 40 |
+---------+------+
5 rows in set (0.00 sec)
>=
kiểm tra xem giá trị đầu tiên lớn hơn hoặc bằng giá trị thứ hai:
+----------+------+
| name | goal |
+----------+------+
| Michelle | 55 |
| Milton | 45 |
| Bridget | 40 |
| Leslie | 40 |
+----------+------+
4 rows in set (0.00 sec)
Các toán tử tương đương ( =
) và không tương đương ( <>
) hoạt động với các giá trị chuỗi như người ta có thể mong đợi. Truy vấn sau đây trả về giá trị name
'Leslie'
:
Vì chỉ có một người bạn trong bảng tên là “Leslie”, nên truy vấn chỉ trả về hàng đó:
+--------+
| name |
+--------+
| Leslie |
+--------+
1 row in set (0.00 sec)
Khi so sánh các giá trị chuỗi, các toán tử <
, >
, <=
và >=
đều đánh giá cách các chuỗi liên quan theo thứ tự bảng chữ cái. Nói cách khác, nếu bạn viết một vị từ để kiểm tra xem một chuỗi có "nhỏ hơn" chuỗi khác hay không, bạn đang kiểm tra xem chuỗi đầu tiên có đứng trước chuỗi thứ hai theo thứ tự bảng chữ cái hay không. Tương tự như vậy, nếu vị từ của bạn kiểm tra xem một chuỗi có “lớn hơn” chuỗi khác hay không, bạn đang kiểm tra xem chuỗi đầu tiên có đứng sau chuỗi thứ hai theo thứ tự bảng chữ cái hay không.
Để minh họa, hãy chạy truy vấn sau. Kết quả sẽ trả về name
và goal
của mọi hàng có name
"nhỏ hơn" chữ cái 'M'
. Nói cách khác, điều kiện tìm kiếm sẽ đánh giá là “true” cho mọi hàng có giá trị name
M
theo thứ tự bảng chữ cái:
+---------+
| name |
+---------+
| Jerry |
| Bridget |
| Leslie |
+---------+
3 rows in set (0.00 sec)
Lưu ý tập hợp kết quả này không bao gồm Michelle
hoặc Milton
. Điều này là do, theo thứ tự bảng chữ cái, chữ cái “M” đứng trước bất kỳ chuỗi nào bắt đầu bằng chữ “M” và có nhiều hơn một chữ cái, nên hai bạn này bị loại khỏi tập kết quả này.
Trong SQL, NULL
là một từ khóa dành riêng được sử dụng để đại diện cho các giá trị bị thiếu hoặc không xác định. Null là một trạng thái, chứ không phải là một giá trị thực tế; nó không đại diện cho số không hoặc một chuỗi rỗng.
Bạn có thể sử dụng IS NULL
để kiểm tra xem một biểu thức giá trị đã cho có phải là Null hay không:
Với loại vị từ này, hệ thống cơ sở dữ liệu sẽ xem xét mọi giá trị của hàng từ cột được chỉ định và đánh giá xem mỗi hàng có phải là Null hay không. Nếu các giá trị trong cột thực sự là Null, điều kiện tìm kiếm sẽ đánh giá là "true" cho các hàng đó và chúng sẽ được đưa vào tập kết quả.
Để minh họa, hãy chạy truy vấn sau để trả về name
và cột result
Điều kiện tìm kiếm trong WHERE
của truy vấn này kiểm tra xem result
của mỗi hàng có là Null hay không. Nếu vậy, vị từ đánh giá là "true" và hàng có trong tập kết quả:
+---------+--------+
| name | result |
+---------+--------+
| Jerry | NULL |
| Bridget | NULL |
| Stewart | NULL |
+---------+--------+
3 rows in set (0.00 sec)
Bởi vì ba người bạn của bạn chưa báo cáo số dặm cuối cùng họ đã chạy trong tháng qua, những giá trị đó được ghi lại là NULL
khi bạn tải dữ liệu vào bảng. Do đó, điều kiện tìm kiếm trong truy vấn đánh giá là "true" cho ba hàng này, vì vậy chúng là những hàng duy nhất có trong tập kết quả.
Theo hướng dẫn này, bạn đã học cách sử dụng toán tử IS NULL
WHERE
để giới hạn các hàng mà một phép toán sẽ ảnh hưởng. Mặc dù các lệnh hiển thị ở đây sẽ hoạt động trên hầu hết các cơ sở dữ liệu quan hệ, nhưng hãy lưu ý mọi cơ sở dữ liệu SQL sử dụng cách triển khai tiêu chuẩn SQL duy nhất của riêng nó. Bạn nên tham khảo tài liệu chính thức của DBMS để có mô tả đầy đủ hơn về từng lệnh và tập hợp đầy đủ các tùy chọn của chúng.
Nếu bạn muốn tìm hiểu thêm về cách làm việc với SQL, ta khuyến khích bạn xem các hướng dẫn khác trong loạt bài này về Cách sử dụng SQL .