MySQL必知必会笔记(7)

2019-01-19 15:54

OR语句也能实现上面的查询

SELECT vend_id ,prod_id , prod_price FROM products

WHERE prod_price <= 5 OR vend_id IN (1001,1002)

从上面这个简单的例子中,使用UNION可能比使用WHERE子句更为复杂。但对于更复杂的过滤条件,或者从多个表而不是单个表中检索数据的情形,使用UNION肯会使处理更简单

UNION规则

正如所见,并是非常容易使用的,但在进行并时有几条规则需要注意

1 UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔

2 UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各列不需要以相同的次序列出)

3 列数据类型必须兼容:类型不完全相同,但不想是DBMS可以隐含滴转换的类型。

包含或取消重复的行

如果SELECT语句中返回的行相同,UNION会自动的去除重复的行。这是他的默认行为,但是如果需要,可以改变它,可以使用UNION ALL 而不是UNION

SELECT vend_id ,prod_id , prod_price FROM products WHERE prod_price <= 5

UNION ALL

SELECT vend_id ,prod_id , prod_price FROM products WHERE vend_id IN (1001,1002)

对组合查询结果排序

SELECT语句的输出用ORDER BY子句排序。在UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。

SELECT vend_id ,prod_id , prod_price FROM products WHERE prod_price <= 5

UNION ALL

SELECT vend_id ,prod_id , prod_price FROM products WHERE vend_id IN (1001,1002)

GROUP BY vend_id,prod_price;

第十八章 全文本搜索

理解全文本搜索

并非所有的引擎都支持全文本搜索。最常使用的是MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。如果你需要全文本搜索功能,应该记住这一点

关键字LIKE,它利用通配操作匹配的文本(和部分文本)。使用LIKE,能够查找包含特殊值或部分值的行(不管这些值位于那些位置)

基于文本的搜索作为正则表达式匹配列值的更进一步的介绍。使用正则表达式,可以编写查找所有行的非常复杂的匹配模式

虽然这些搜索机制非常有用。但存在几个重要的限制:

1 性能——通配符和正则表达式匹配通常要求MYSQL尝试匹配表中所有的行(而且这些搜索极少使用表索引),因此,由于被搜索行数不断增加,这些搜索非常耗时

2 明确控制——使用通配符和正则表达式匹配,很难(而且并不总能)明确的控制匹配什么和不匹配什么

3 智能化的结果——虽然前两者都能提供了非常灵活的搜索,但它们都不能提供非常智能化的匹配结果。

前面的很多限制都可以使用全文本搜索来解决。使用全文本搜索。Mysql创建指定列中各词的一个索引, 搜索可以针对这些词进行。

使用全文本搜索

启用全文本搜索

一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句。它给出被索引列的一个逗号分隔的列表。

CREATE TABLE productontes

(

note_id int NOT_NULL AUTO_INCREMENT,

prod_id char(10) NOT_NULL,

note_date datetime NOT_NULL,

note_text text NOT_NULL,

PRIMARY KEY(note_id),

FULLTEXT(note_text)

)ENGINE=MyISAM;

为了进行全文本搜索,mysql根据子句FULLTEXT(note_text)的指示对它进行索引。这里FUNLL_TEXT索引了单个列,如果需要可以索引多个列,多列之间用逗号分隔

在定义之后mysql对自动维护该索引,在增加、更新和删除行时,索引随之自动更新。

不要在导入数据时使用FUNLLTEXT,否则会耗费很多时间,应该先导入数据,再定义FULLTEXT这样有助于更快的导入数据

进行全文本搜索

在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()指定被搜索的列Against()指定要使用的搜索表达式。

SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');

使用完整的Match()说明: 传递给Match()的值必须和与FULLTEXT()定义中的相同。如果指定了多个列,则必须列出它们(而且次序正确)

除非使用BINARY方式,否则全文本搜索不区分大小写

使用SELECT 语句同样可以检索出两行,但次序不同。

全文本搜索返回一文本匹配的良好程度的数据。具有较高等级的行先返回。

使用查询扩展

查询扩展用来设法放宽所返回的全文本搜索结果的范围。想找出与搜索有关的其他行。不包含要搜索才字母。

如SELECT note_text FROM productnotes WHERE Match(note_text) Against('anvils');

返回一行数据

使用查询扩展

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);

返回7行

布尔文本搜索

Mysql支持全文本搜索的另一种形式,称为布尔方式。布尔方式可以提供以下细节:

1 要匹配的词

2 要排斥的词(如果该行包含这个词,则不返回该行,即使它已经包含指定的词也是如此)

3 排列提示(指定某些词比其他词重要,更重要的词的词等级更高)

4 表达式分组

5 另外一些内容

即使没有FULLTEXT索引也可以使用 布尔方式不同迄今为止使用的全文本搜索语法的地方在于,即使没有定义FULLTEXT索引,也可以使用它,但这是一种非常缓慢的操作(其性能将随着数据量的增加而降低)

例如:匹配包含heavy但不包含任意以rope开始的词的行,可以使用以下查询:


MySQL必知必会笔记(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:结构设计原理-1997-2007试题集

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: