MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Cách KHÔNG THÍCH hoạt động trong MariaDB

Trong MariaDB, NOT LIKE toán tử được sử dụng để kiểm tra xem một chuỗi có không phù hợp với một mẫu. Nó trả về nghịch đảo của LIKE nhà điều hành. Nó cũng giống như áp dụng NOT toán tử so với toàn bộ LIKE biểu hiện.

Một mẫu có thể bao gồm các ký tự thông thường, cũng như %_ ký tự đại diện.

Các ký tự đại diện đó được giải thích trong bảng sau.

Ký tự đại diện Mô tả
% Đối sánh bất kỳ chuỗi nào không hoặc nhiều ký tự. Nó có thể được sử dụng như một tiền tố hoặc một hậu tố và nó cũng có thể được sử dụng ở giữa một chuỗi.
_ Khớp với bất kỳ ký tự đơn nào.

Cú pháp

Cú pháp như sau:

expr NOT LIKE pat [ESCAPE 'escape_char']

Ví dụ

Giả sử chúng ta có bảng sau:

SELECT * FROM Pets;

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Đây là một ví dụ về việc sử dụng NOT LIKE so với bảng đó:

SELECT *
FROM Pets
WHERE PetName NOT LIKE 'F%';

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Trong ví dụ này, tôi đã sử dụng NOT LIKE kết hợp với % toán tử ký tự đại diện để trả về vật nuôi có tên không bắt đầu bằng chữ cái F .

Đây là tập kết quả ngược lại mà chúng tôi sẽ nhận được nếu chúng tôi chỉ sử dụng LIKE . Trong trường hợp đó, chúng tôi sẽ chỉ nhận được kết quả khi tên của vật nuôi bắt đầu bằng chữ cái F .

Phân biệt chữ hoa chữ thường

NOT LIKE thực hiện đối sánh chuỗi con không phân biệt chữ hoa chữ thường nếu đối chiếu cho biểu thức và mẫu không phân biệt chữ hoa chữ thường.

Do đó, chúng ta có thể thay đổi ví dụ trước để sử dụng f chữ thường , và vẫn nhận được kết quả tương tự:

SELECT *
FROM Pets
WHERE PetName NOT LIKE 'f%';

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Tuy nhiên, chúng tôi có thể buộc so khớp phân biệt chữ hoa chữ thường bằng cách sử dụng COLLATE mệnh đề với một đối chiếu nhị phân. Ngoài ra, bạn có thể sử dụng CAST() để buộc nó thành một chuỗi nhị phân.

Ví dụ:

SELECT *
FROM Pets
WHERE PetName NOT LIKE 'f%' COLLATE utf8_bin;

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Lần này, cả bàn đã được trả lại. Điều này là do không có gì khớp với chữ thường f .

Nhưng nếu chúng ta thay đổi nó thành chữ hoa F :

SELECT *
FROM Pets
WHERE PetName NOT LIKE 'F%' COLLATE utf8_bin;

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Chúng tôi có được năm trận đấu, như mong đợi. Các hàng có tên vật nuôi bắt đầu bằng F bị loại trừ.

Đối số dạng số

Các đối số dạng số được ép buộc thành chuỗi nhị phân.

SELECT * 
FROM Pets 
WHERE PetId NOT LIKE 1;

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Ngày

Đây là một ví dụ về ngày tháng:

SELECT * 
FROM Pets 
WHERE DOB NOT LIKE '2020%';

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
+-------+-----------+---------+---------+------------+

Bạn cũng có thể sử dụng NOT LIKE toán tử so với kết quả của các hàm ngày, chẳng hạn như DAYNAME() , MONTHNAME() , v.v.

SELECT * 
FROM Pets 
WHERE MONTHNAME(DOB) NOT LIKE 'Nov%';

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
+-------+-----------+---------+---------+------------+

_ Toán tử ký tự đại diện

Dấu gạch dưới (_ ) toán tử ký tự đại diện khớp với bất kỳ ký tự đơn nào.

Ví dụ:

SELECT *
FROM Pets
WHERE PetName NOT LIKE '_e%';

Kết quả:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
|     7 |         3 |       2 | Bark    | NULL       |
+-------+-----------+---------+---------+------------+

Trong trường hợp này, chúng tôi đã trả lại tên vật nuôi trong đó ký tự thứ hai là không một e .

Nhân vật thoát

Đôi khi bạn có thể rơi vào tình huống cần tìm kiếm dấu gạch dưới hoặc dấu phần trăm. Trong những trường hợp như vậy, bạn có thể sử dụng dấu gạch chéo ngược (\ ) để thoát khỏi các ký tự này. Điều này sẽ ngăn chúng được hiểu là các ký tự đại diện.

Giả sử chúng ta có bảng sau:

SELECT * FROM Owners;

Kết quả:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       1 | Homer     | Connery  | (308) 555-0100 | [email protected]  |
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
|       3 | Nancy     | Simpson  | (489) 591-0408 | NULL               |
|       4 | Boris     | Trump    | (349) 611-8908 | NULL               |
|       5 | Woody     | Eastwood | (308) 555-0112 | [email protected]  |
|       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
+---------+-----------+----------+----------------+--------------------+

Lưu ý rằng Chủ sở hữu 2 (Bart) có địa chỉ email chứa dấu gạch dưới.

Dưới đây là một ví dụ về những gì sẽ xảy ra khi chúng ta không thoát khỏi dấu gạch dưới:

SELECT * FROM Owners
WHERE Email NOT LIKE 'b_%';

Kết quả:

+---------+-----------+----------+----------------+-------------------+
| OwnerId | FirstName | LastName | Phone          | Email             |
+---------+-----------+----------+----------------+-------------------+
|       1 | Homer     | Connery  | (308) 555-0100 | [email protected] |
|       5 | Woody     | Eastwood | (308) 555-0112 | [email protected] |
+---------+-----------+----------+----------------+-------------------+

Trong trường hợp này, nó chỉ trả về hai hàng. Nó loại trừ hai hàng nơi địa chỉ email bắt đầu bằng b , và được theo sau bởi một ký tự khác, sau đó là bất kỳ số ký tự nào. Nó cũng loại trừ các hàng có null địa chỉ email.

Tuy nhiên, vì chúng tôi không thoát khỏi dấu gạch dưới, nên ký tự thứ hai là gì không quan trọng - nó khớp với bất kỳ tính cách. Việc hàng đầu tiên có dấu gạch dưới cho ký tự thứ hai chỉ là một sự trùng hợp ngẫu nhiên. Nó sẽ phù hợp ngay cả khi nó là một cái gì đó khác.

Nhưng điều gì sẽ xảy ra nếu chúng ta chỉ muốn đối sánh những địa chỉ email có dấu gạch dưới thực sự làm ký tự thứ hai của chúng?

Đó là lúc nhân vật trốn thoát xuất hiện.

SELECT * FROM Owners
WHERE Email NOT LIKE 'b\_%';

Kết quả:

+---------+-----------+----------+----------------+-------------------+
| OwnerId | FirstName | LastName | Phone          | Email             |
+---------+-----------+----------+----------------+-------------------+
|       1 | Homer     | Connery  | (308) 555-0100 | [email protected] |
|       5 | Woody     | Eastwood | (308) 555-0112 | [email protected] |
|       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]  |
+---------+-----------+----------+----------------+-------------------+

Chúng ta có thể thấy rằng Burt đã được thêm vào kết quả.

Thay đổi ký tự thoát

Có thể thay đổi ký tự thoát. Bạn có thể thực hiện việc này với ESCAPE đối số.

Ví dụ:

SELECT * FROM Owners
WHERE Email NOT LIKE 'b*_%' ESCAPE '*';

Kết quả:

+---------+-----------+----------+----------------+-------------------+
| OwnerId | FirstName | LastName | Phone          | Email             |
+---------+-----------+----------+----------------+-------------------+
|       1 | Homer     | Connery  | (308) 555-0100 | [email protected] |
|       5 | Woody     | Eastwood | (308) 555-0112 | [email protected] |
|       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]  |
+---------+-----------+----------+----------------+-------------------+

Trong trường hợp này, tôi đã gán dấu hoa thị (* ) là ký tự thoát.

Điều này có thể hữu ích khi bạn cần sử dụng dấu gạch chéo ngược cho các mục đích khác, chẳng hạn như mã hóa các ký tự đặc biệt. Trong những trường hợp như vậy, bạn có thể thấy mình phải “thoát kép” những ký tự này, điều này có thể trở nên khó hiểu. Do đó, thay đổi ký tự thoát có thể hữu ích trong những tình huống như vậy.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tự động quản lý chuyển đổi dự phòng của cơ sở dữ liệu MySQL cho Moodle

  2. 3 cách lấy tên tháng từ ngày trong MariaDB

  3. MariaDB JSON_KEYS () Giải thích

  4. Thiết lập một cụm cơ sở dữ liệu phân tán theo địa lý bằng cách sử dụng MySQL Replication

  5. Xử lý các truy vấn chạy dài của MySQL