当前位置:数据库 > MySQL >>

mysql 模糊查询

mysql> SELECT * FROM pet WHERE name LIKE "b%";

为了找出以“fy”结尾的名字:
mysql> SELECT * FROM pet WHERE name LIKE "%fy";

为了找出包含一个“w”的名字:
mysql> SELECT * FROM pet WHERE name LIKE "%w%";

为了找出包含正好5个字符的名字,使用“_”模式字符:
mysql> SELECT * FROM pet WHERE name LIKE "_____";

由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用

REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

扩展正则表达式的一些字符是:

“.”匹配任何单个的字符。
一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。
为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任
何数字。
“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”
匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。
正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,
“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。
如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的
结尾用“$”。
为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:

为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:
mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

既然如果一个正规表达式出现在值的任何地方,其模式匹配了,就不必再先前的查询中在模式的两
方面放置一个通配符以使得它匹配整个值,就像如果你使用了一个SQL模式那样。
为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在
两者之间:
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";

你也可以使用“{n}”“重复n次”操作符重写先前的查询:
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";

查找数字和其他的模糊查询语句
Select * from pet where name REGEXP "[^a-zA-Z].";

SELECT * FROM oneself WHERE name like '%'
like 是模糊查询的关键字。
% 是通配符,代表多个任意匹配,比如 '%人民' 就是搜索前半段是任意字符,结尾是人民的记录,类似的可以将 % 放在条件字段的任意位置。
_ 是单个字符的统配符,可以匹配单个任意字符。

PHP 不需要像你这样写,双引号中出现的变量将自动被解析。
$sql = "SELECT * FROM oneself WHERE name like '%{$colname_Recordset1}' LIMIT {$startRow_Recordset1}, {$maxRows_Recordset1}";
$Recordset1 = mysql_query($sql) or die(mysql_error());

{} 放在变量两边是直接指明这是个变量及该变量的名字,如果遇到数组类型的变量效果比较明显,不然可能会造成数组型变量名解析出错。

全文章搜索

CREATE TABLE `t3` (
`name` char(12) NOT NULL default '',
`name2` char(12) NOT NULL default '',
FULLTEXT KEY `name` (`name`,`name2`)
) TYPE=MyISAM;
 
#
# Dumping data for table 't3'
#
INSERT INTO `t3` (`name`, `name2`) VALUES("1", "安换岚缮");
INSERT INTO `t3` (`name`, `name2`) VALUES("2", "不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("3", "不会吧1");
INSERT INTO `t3` (`name`, `name2`) VALUES("4", "不会吧 1");
INSERT INTO `t3` (`name`, `name2`) VALUES("5", "真的不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("6", "真的 不会吧");
 
mysql> SELECT * FROM t3;
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 1 ¦ 安换岚缮 ¦
¦ 2 ¦ 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 5 ¦ 真的不会吧 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
6 rows in set (0.01 sec)
# 查找词 "不会吧"
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧'IN BOOLEAN MODE);
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
3 rows in set (0.00 sec)
# 查找以词 "不会吧" 开头的任意词句
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧*' IN BOOLEAN MODE);
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 6 ¦ 真的 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
+------+-------------+
4 rows in set (0.01 sec)
# 查找以词 "不会吧" 开头的任意词句 并 去除词 "真的"
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('+不会吧* -真的' IN BOOLEAN MODE);
+------+----------+
¦ name ¦ name2 ¦
+------+----------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 3 ¦ 不会吧1 ¦
+------+----------+
3 rows in set (0.00 sec)

在上例中,
我们可以看出 MySQL 的全文索引对双字节处理的支持还不太好,
¦ 5 ¦ 真的不会吧 ¦
这一行记录始终未能查询出来,
这是因为在西文中词是以一个空格为分隔的,
:(
希望在将来的版本中
MySQL 对此能有所改进

而用正则表达式也是会有问题的,

# 查找词 "不会吧"
mysql> SELECT * FROM t3 WHERE name2 REGEXP "不会吧";
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 1 ¦ 安换岚缮 ¦
¦ 2 ¦ 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 5 ¦ 真的不会吧 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
6 rows in set (0.00 sec)

# 查找以词 "不会吧" 开头的
mysql> SELECT * FROM t3 WHERE name2 REGEXP "^不会吧";
+------+----------+
¦ name ¦ name2 ¦
+------+----------+
¦ 2 ¦ 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
¦ 4 ¦ 不会吧 1 ¦
+------+----------+
3 rows in set (0.00 sec)

# 查找以词 "不会吧" 结束的
mysql> SELECT * FROM t3 WHERE name2 REGEXP "不会吧$";
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 5 ¦ 真的不会吧 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
3 rows in set (0.00 sec)

补充:数据库,mysql教程
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,