首頁 > 軟體

Mysql實現模糊查詢的兩種方式(like子句 、正規表示式)

2022-10-02 14:01:41

通常在實際應用中,會涉及到模糊查詢的需求,查詢在 MySQL 中使用 SQL SELECT 命令來讀取資料,有條件的查詢可以在 SELECT 語句中使用 WHERE 子句來獲取記錄

有時候我們需要獲取某欄位含有 “xxxxx” 字元的所有記錄,這時就是模糊查詢,下面介紹一下在MySQL中實現模糊查詢的兩種方式

前言

MySQL 查詢資料使用SQL SELECT語句

語法

MySQL資料庫中查詢資料通用的 SELECT 語法:

SELECT column_name, column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

說明:

  • SELECT 命令可以讀取一條或者多條記錄,一個欄位資訊或者多個欄位資訊,可使用星號(*)來代替其他欄位返回表的所有欄位資料
  • SELECT 命令 from 後可以使用一個 / 多個表,表之間使用逗號( , ) 分割
  • SELECT 命令 使用 WHERE 語句來包含任何條件
  • SELECT 命令 使用 LIMIT 屬性來設定返回的記錄數。
  • SELECT 命令 使用 OFFSET指定SELECT語句開始查詢的資料偏移量。預設情況下偏移量為0。

like子句

根據上述的語法,模糊查詢的限制位置在 where 語句後,即like 在 where 中使用

語法

SELECT field1, field2,....,fieldN 
FROM table_name
WHERE field1 LIKE condition;

說明:

  • LIKE子句 在 WHERE 子句中使用,若 condition 為明確的資料,則 LIKE子句 相當於 等號 =(精準查詢)
  • 通常,condition 會包含 % ,即 LIKE 通常與 % 一同使用,進行搜尋(模糊查詢), xxx% 查詢指定字首的記錄,%xxx 查詢指定字尾的記錄,%xxx% 查詢包含指定內容的記錄

範例

前提準備:建立表與插入資料

-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `product_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '產品名稱',
  `price` decimal(10, 2) UNSIGNED NOT NULL COMMENT '產品價格',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES (1, 'Apple iPhone 13 (A2634)', 6799.00);
INSERT INTO `product` VALUES (2, 'HUAWEI P50 Pro', 6488.00);
INSERT INTO `product` VALUES (3, 'MIX4', 4999.00);
INSERT INTO `product` VALUES (4, 'OPPO Find X3', 3999.00);
INSERT INTO `product` VALUES (5, 'OPPO Find X4', 3999.00);
INSERT INTO `product` VALUES (6, 'OPPO Find Pro', 6488.00);
INSERT INTO `product` VALUES (7, 'vivo X70 Pro+', 5999.00);

初始資料:

select * from product;

結果:

需求一:查詢指定字首的記錄

查詢 產品名稱oppo(即字首為oppo) 的產品資訊

select * from product where product_name like "OPPO%";

結果:

需求二:查詢指定字尾的記錄

查詢產品系列為pro系列的產品,即 產品名稱 字尾為 pro 的產品資訊

select * from product where product_name like "%pro";

結果:

需求二:查詢包含指定內容的記錄

查詢 產品名稱 包含 3 的產品

select * from product where product_name like "%3%";

結果:

正規表示式

除了上述方法,MySQL 也支援正規表示式的匹配,通過使用 REGEXP 操作符來進行正規表示式匹配

語法

// 不區分大小寫的查詢
SELECT field1, field2,....,fieldN 
FROM table_name
WHERE field1 regexp condition;

// 區分大小寫的查詢
SELECT field1, field2,....,fieldN 
FROM table_name
WHERE field1 regexp binary condition;

說明:

  • regexp 操作符也在 WHERE 子句中使用,若 condition 不能為明確的資料,需要為正規表示式
  • 預設 regexp 操作符 的查詢不區分大小寫,如若想區分大小寫,可以在 regexp 操作符後 加上 binary 關鍵字即可

在 REGEXP 操作符中可以使用如下的正則模式:

模式描述
^匹配輸入字串的開始位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 也匹配 ‘n’ 或 ‘r’ 之後的位置
$匹配輸入字串的結束位置。如果設定了RegExp 物件的 Multiline 屬性,$ 也匹配 ‘n’ 或 ‘r’ 之前的位置
.匹配除 “n” 之外的任何單個字元。要匹配包括 ‘n’ 在內的任何字元,請使用像 ‘[.n]’ 的模式
[…]字元集合。匹配所包含的任意一個字元。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’
[^…]負值字元集合。匹配未包含的任意字元。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’
p1|p2|p3匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 則匹配 “zood” 或 “food”
*匹配前面的子表示式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價於{0,}
+匹配前面的子表示式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價於 {1,}
{n}n 是一個非負整數。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o
{n,m}m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次

範例

需求一:查詢指定字首的記錄

查詢 產品名稱oppo(即字首為oppo) 的產品資訊 不區分大小寫

select * from product where product_name regexp  "^oppo";

查詢 產品名稱oppo(即字首為oppo) 的產品資訊 區分大小寫

select * from product where product_name regexp binary "^oppo";

結果:

需求二:查詢指定字尾的記錄

查詢產品系列為pro系列的產品,即 產品名稱 字尾為 pro 的產品資訊

select * from product where product_name regexp "pro$";

結果:

需求二:查詢包含指定內容的記錄

查詢 產品名稱 包含 3 的產品

select * from product where product_name regexp "3+";

結果:

總結

上述介紹了兩種模糊匹配的實現方式,like 子句 與 正規表示式

很多場景下會使用 like 來對字串進行匹配,從而實現模糊查詢,但是這些場景往往非常簡單,而正規表示式是一個非常強大的文字檢索過濾工具,適用在很複雜的場景

到此這篇關於Mysql實現模糊查詢(like子句 、正規表示式)的文章就介紹到這了,更多相關Mysql模糊查詢方式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com