時間:2022-10-02來源:www.1999hs.com作者:電腦系統城
通常在實際應用中,會涉及到模糊查詢的需求,查詢在 MySQL 中使用 SQL SELECT 命令來讀取數據,有條件的查詢可以在 SELECT 語句中使用 WHERE 子句來獲取記錄
有時候我們需要獲取某字段含有 “xxxxx” 字符的所有記錄,這時就是模糊查詢,下面介紹一下在MySQL中實現模糊查詢的兩種方式
MySQL 查詢數據使用SQL SELECT語句
MySQL數據庫中查詢數據通用的 SELECT 語法:
1 2 3 4 |
SELECT column_name, column_name FROM table_name [ WHERE Clause] [LIMIT N][ OFFSET M] |
說明:
根據上述的語法,模糊查詢的限制位置在 where 語句后,即like 在 where 中使用
1 2 3 |
SELECT field1, field2,....,fieldN FROM table_name WHERE field1 LIKE condition; |
說明:
前提準備:創建表與插入數據
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- ---------------------------- -- 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); |
初始數據:
1 | select * from product; |
結果:
需求一:查詢指定前綴的記錄
查詢 產品名稱 為 oppo(即前綴為oppo) 的產品信息
1 | select * from product where product_name like "OPPO%" ; |
結果:
需求二:查詢指定后綴的記錄
查詢產品系列為pro系列的產品,即 產品名稱 后綴為 pro 的產品信息
1 | select * from product where product_name like "%pro" ; |
結果:
需求二:查詢包含指定內容的記錄
查詢 產品名稱 包含 3 的產品
1 | select * from product where product_name like "%3%" ; |
結果:
除了上述方法,MySQL 也支持正則表達式的匹配,通過使用 REGEXP 操作符來進行正則表達式匹配
1 2 3 4 5 6 7 8 9 |
// 不區分大小寫的查詢 SELECT field1, field2,....,fieldN FROM table_name WHERE field1 regexp condition; // 區分大小寫的查詢 SELECT field1, field2,....,fieldN FROM table_name WHERE field1 regexp binary condition; |
在 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) 的產品信息 不區分大小寫
1 | select * from product where product_name regexp "^oppo" ; |
查詢 產品名稱 為 oppo(即前綴為oppo) 的產品信息 區分大小寫
1 | select * from product where product_name regexp binary "^oppo" ; |
結果:
需求二:查詢指定后綴的記錄
查詢產品系列為pro系列的產品,即 產品名稱 后綴為 pro 的產品信息
1 | select * from product where product_name regexp "pro$" ; |
結果:
需求二:查詢包含指定內容的記錄
查詢 產品名稱 包含 3 的產品
1 | select * from product where product_name regexp "3+" ; |
結果:
上述介紹了兩種模糊匹配的實現方式,like 子句 與 正則表達式
很多場景下會使用 like 來對字符串進行匹配,從而實現模糊查詢,但是這些場景往往非常簡單,而正則表達式是一個非常強大的文本檢索過濾工具,適用在很復雜的場景
2022-10-02
MySQL通配符與正則表達式搜過濾數據詳解2022-09-11
MySQL樂觀鎖和悲觀鎖具體實現2022-09-11
SQL Server服務器監控CentOS7下安裝MySQL5.7.39的詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值...
2022-09-11
建立到服務器的遠程連接 用apt-get安裝mysql 設置root密碼 編輯配置文件監聽遠程連接 允許root賬號使用遠程連接 檢查ubuntu自帶的防火墻狀態 檢查云服務器廠商的防火墻狀態 測試連接...
2022-06-20