分页: 1 - 2010年7月26日 爱促销电脑网 开发频道
全文索引——CONTAINS 语法 我们通常 WHERE 子句中解决 CONTAINS 就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column 'search contents')
我们通过实例来学习 假设 表 students 其中 address 全文本检索 列 1. 查询住址 北京 学生 SELECT student_id student_name FROM students WHERE CONTAINS( address 'beijing' ) remark: beijing 一个单词 要用单引号括起来
2. 查询住址 河北省 学生 SELECT student_id student_name FROM students WHERE CONTAINS( address '"HEIBEI province"' ) remark: HEBEI province 一个词组 单引号里还要用双引号括起来
3. 查询住址 河北省或北京 学生 SELECT student_id student_name FROM students WHERE CONTAINS( address '"HEIBEI province" OR beijing' ) remark: 可以指定逻辑操作符(包括 AND AND NOT OR )
4. 查询 '南京路' 字样 地址 SELECT student_id student_name FROM students WHERE CONTAINS( address 'nanjing NEAR road' ) remark: 上面 查询将返回包含 'nanjing road' 'nanjing east road' 'nanjing west road' 等字样 地址 A NEAR B 就表示条件: A 靠近 B
5. 查询以 '湖' 开头 地址 SELECT student_id student_name FROM students WHERE CONTAINS( address '"hu*"' ) remark: 上面 查询将返回包含 'hubei' 'hunan' 等字样 地址 记住 * 不 %
6. 类似加权 查询 SELECT student_id student_name FROM students WHERE CONTAINS( address 'ISABOUT (city weight (.8) county wright (.4))' ) remark: ISABOUT 这种查询 关键字 weight 指定了一个介于 0~1之间 数 类似系数(我 理解) 表示不同条件 不同 侧重
7. 单词 多态查询 SELECT student_id student_name FROM students WHERE CONTAINS( address 'FORMSOF (INFLECTIONAL street)' ) remark: 查询将返回包含 'street' 'streets'等字样 地址 对于动词将返回它 不同 时态 如:dry 将返回 dry dried drying 等等
以上实例都解决英文 不解决中文 因为 查询方式中文不支持 而且我 计算机 英文系统
mysql having介绍
在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 SELECT SUM(population) FROM bbc 这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有 国家的总人口数。 通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。 当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值. 也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值. HAVING子句可以让我们筛选成组后的各组数据. WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. 而 HAVING子句在聚合后对组记录进行筛选。 让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。 SQL实例: 一、显示每个地区的总人口数和总面积. SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region 先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中 的不同字段(一或多条记录)作运算。 二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。 SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000 在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。 相反,HAVING子句可以让我们筛选成组后的各组数据
三、mysql like 语句通配符 (一)MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。
_ 表示一个字符,而%表示0到任意个字符
如果你的查询语句含有%这种特殊字符那么/% 或者[%]都可以
起到转义符的作用
like '5[%]' 表示 5%
like '5%' 表示5后跟0多更多字符
like '[_]h' 表示-n
like '_n' 表示 an,bn,on(and so on)
like '[a-cdf]' 表示 a, b, c, d, or f
like '[-acdf]' 表示 - ,a, c, d, or f
like '[[]' 表示 [
like ']' 表示 ]
(二)实例说明:
在表PersonalMember中查找strloginname字段中含有"["的记录。
可用三条语句: 1、 select strloginname,* from PersonalMember where strloginname like '%[%' escape ''
2、(说明""与"/"均可与escape关键字结合作为转义符) select strloginname,* from PersonalMember where strloginname like '%/[%' escape '/'
3、 select strloginname,* from dbo.PersonalMember where charindex('[',strloginname)>0 --------------------------- Microsoft Internet Explorer--------------------------
转载请注明本文地址:http://www.1366.me/xgjc/sjk_33_405.html
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)
转载请注明本文地址:http://www.1366.me/xgjc/sjk_33_404.html 更多 数据库 关键词Tags: 模糊 查询