Mysql必知必會(3):模糊查詢(LIKE)

本文介紹什麼是通配符,如何利用通配符進行數據庫數據過濾查詢。sql

本文使用的數據表在本文最後附錄數據庫

簡介

以前幾篇文章的全部例子查詢的條件都是肯定的值,好比大於20,或者用戶ID爲1.可是,有些時候咱們須要查詢一些不太肯定的值。好比用戶在輸入框輸入關鍵字查詢相關文章,這個時候就須要模糊查詢。也就是使用通配符進行過濾。segmentfault

通配符:用來匹配值得一部分的特殊字符。工具

搜索模式:由字面值、通配符或者二者組合構成的搜索條件。spa

在Mysql中使用通配符搜索,必須使用關鍵字LIKE,跟在LIKE後面的值會進行統配匹配而不是精選匹配。3d

LIKE不屬於操做符,而屬於謂詞,這裏只是作個概念輸出,其實我也不知道啥意思,之後遇到專業的不要不認識就OKcode

百分號(%)通配符

在開發中咱們最多見到的通配符就是百分號通配符。百分號表明的含義是包含一切字符出現一切的次數。blog

SELECT * FROM my_user WHERE `name` LIKE '小%';

圖片描述

上面的SQL中咱們使用了LIKE '小%',這裏的%在字的後面,因此他會匹配以字開頭的全部名字。圖片

若是咱們把百分號放在前面資源

SELECT * FROM my_user WHERE `name` LIKE '%穎';

圖片描述

該語句表示查詢全部以結尾的名字。

通配符還可使用多個

SELECT * FROM my_user WHERE `name` LIKE '%空%';

這樣咱們就能夠查詢包含字的全部名字,不管在開頭仍是結尾仍是中間。

圖片描述

還有一種狀況,比較少見,可是也能夠查詢,就是通配符在字符中間,那麼就表示已X開頭Y結尾的字符。

SELECT * FROM my_user WHERE `name` LIKE '星%穎';

圖片描述

因此,上面的SQL意思爲,查詢已開頭的,而且以結尾的名字。

提醒

  1. Mysql默認的配置中,模糊查詢不區分大小寫。可是修改設置,區分大小寫,則小寫字母不能匹配大寫,反之亦然。

  2. 若是在一個字符最後有一個空格,好比小穎 後面有個空格,那麼%穎沒法匹配小穎。解決辦法就是在最後加個%,變成%穎%

  3. %能夠匹配不少東西,可是不能夠匹配NULL,即便使用LIKE '%'也不能匹配NULL

  4. LIKE後面匹配的內容須要使用單引號括起來,好比LIKE '%小%'

下劃線(_)通配符

下劃線通配符(_)與(%)通配符有點兒類似,可是也不一樣。%能夠匹配任意多個字符,而(_)只能匹配一個字符。

SELECT * FROM my_user WHERE `name` LIKE '_穎';

圖片描述

該例子與上面一個很類似,可是上面的例子匹配到了小穎星空幻穎兩個用戶。這是因爲(_)只能匹配一個字符,因此星空幻穎的穎字前面有3個字符,因此沒法被匹配。而小穎正好符合。

其餘狀況也是同樣,當(_)放在後面,表示只能匹配後面一個字符。

經驗:

  1. %通配符能夠匹配任意多個,包括0個字符。而(_)只能匹配一個,一個也不能多,一個也不能少。

  2. 因爲通配符查詢時間會比其餘搜索時間長,因此不要過分使用。儘可能優選其餘解決方案。

  3. 通配符放在開始處,搜索速度最慢,能不放在最前面就不要放在最前面。

  4. 通配符擺放位置必定要注意,不然會返回不想要的結果。

通配符在開發中仍是很是經常使用的。若是隻是作簡單的搜索,是個不錯的選擇。若是數據量太大,則須要考慮其餘解決方案。後面的文章中咱們會說起各類大量數據搜索狀況。

附錄

建立my_user表的語句:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for my_user
-- ----------------------------
DROP TABLE IF EXISTS `my_user`;
CREATE TABLE `my_user` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `password` varchar(40) NOT NULL,
  `code` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of my_user
-- ----------------------------
INSERT INTO `my_user` VALUES ('1', '小紅', '20', '7c4a8d09ca3762af61e59520943dc26494f8941b', '2arfs5dr6m');
INSERT INTO `my_user` VALUES ('2', '小明', '19', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'd59tg6dr5h');
INSERT INTO `my_user` VALUES ('3', '小黃', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'w56tg9hjn3');
INSERT INTO `my_user` VALUES ('4', '小穎', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'a5d23e9yh5');
INSERT INTO `my_user` VALUES ('5', '星空幻穎', '22', '7c4a8d09ca3762af61e59520943dc26494f8941b', '86d2sadft9');

圖片所示的軟件工具是navicat,更多的 數據庫管理軟件,也能夠百度:筆點資源,更多開發乾貨資源集合

圖片描述

星空幻穎,嚴穎

我的主頁:segmentfault

相關文章
相關標籤/搜索