Thứ sáu, 18/12/2020 | 00:00 GMT+7

Sử dụng So sánh Null trong Sql

Trong một số câu lệnh Ngôn ngữ truy vấn có cấu trúc (SQL) , WHERE có thể được sử dụng để giới hạn thao tác với hàng. Điều này được thực hiện bằng cách xác định các tiêu chí cụ thể mà mỗi hàng phải đáp ứ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 được chọn

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 UPDATEDELETE

Yêu cầu

Để 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:

  • Server chạy Ubuntu 20.04, với user không phải root có quyền quản trị và tường lửa được cấu hình bằng UFW, như được mô tả trong hướng dẫn cài đặt server ban đầu cho Ubuntu 20.04.
  • MySQL được cài đặt và bảo mật trên server, như được nêu trong Cách cài đặt MySQL trên Ubuntu 20.04 . Hướng dẫn này đã được xác minh với user mới tạo, như được mô tả trong Bước 3 .
  • Bạn cũng cần một cơ sở dữ liệu với một số bảng được tải với dữ liệu mẫu mà bạn có thể sử dụng để thực hành sử dụng các toán tử 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.

Kết nối với MySQL và cài đặt cơ sở dữ liệu mẫu

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:

  • ssh sammy@your_server_ip

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 :

  • mysql -u sammy -p

Từ dấu nhắc, hãy tạo một cơ sở dữ liệu có tên là comparison_null_db :

  • CREATE DATABASE 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:

Output
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

  • USE comparison_null_db;

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

  • CREATE TABLE running_goals (
  • name varchar(15),
  • goal int,
  • result int
  • );

Output
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ọ:

  • INSERT INTO running_goals
  • VALUES
  • ('Michelle', 55, 48),
  • ('Jerry', 25, NULL),
  • ('Milton', 45, 52),
  • ('Bridget', 40, NULL),
  • ('Wanda', 30, 38),
  • ('Stewart', 35, NULL),
  • ('Leslie', 40, 44);

Output
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.

Vị trí 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ứ hai

Null : 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 .

Dự đoán so sánh

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:

  • SELECT column_list
  • FROM table_name
  • WHERE column_name OPERATOR value_expression;

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

  • SELECT name, goal
  • FROM running_goals
  • WHERE 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 đó:

Output
+---------+------+
| 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 :

  • SELECT name, goal
  • FROM running_goals
  • WHERE goal <> 40;

Output
+----------+------+
| 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:

  • SELECT name, goal
  • FROM running_goals
  • WHERE goal < 40;

Output
+---------+------+
| 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:

  • SELECT name, goal
  • FROM running_goals
  • WHERE goal > 40;

Output
+----------+------+
| 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:

  • SELECT name, goal
  • FROM running_goals
  • WHERE goal <= 40;

Output
+---------+------+
| 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:

  • SELECT name, goal
  • FROM running_goals
  • WHERE goal >= 40;

Output
+----------+------+
| 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' :

  • SELECT name
  • FROM running_goals
  • WHERE 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 đó:

Output
+--------+
| name   |
+--------+
| Leslie |
+--------+
1 row in set (0.00 sec)

Khi so sánh các giá trị chuỗi, các toán tử < , > , <=>= đề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ề namegoal 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:

  • SELECT name
  • FROM running_goals
  • WHERE name < 'M';

Output
+---------+
| 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.

Dự đoán không có giá trị

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:

  • . . .
  • WHERE column_name IS NULL
  • . . .

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

  • SELECT name, result
  • FROM running_goals
  • WHERE result IS NULL;

Đ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ả:

Output
+---------+--------+
| 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ả.

Kết luận

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 .


Tags:

Các tin liên quan