mysql全文本搜索创建删除_MySQL总结(六)——组合查询,全文本搜索,插入数据...

一.组合查询

1. 组合查询

多数SQL查询都只包含从一个或多个表中返回数据的单条select 语句。MySQL也允许执行多个查询(多个select语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并或复合查询。

两种使用组合查询的情况:在单个查询中从不同的表返回类似结构的数据

对单个表执行多个查询,按单个查询返回数据

注意:任何具有多个where 子句的select 语句都可以作为一个组合查询给出。

2. 创建组合查询

可用union操作符来组合数条SQL查询。利用union,可给出多条select语句,将它们的结果组合成单个结果集。

3. 使用union

Union的使用很简单。所需做的只是给出每条select语句,在各条语句之间放上关键字union。

假如需要价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品。即可以使用union完成。

Select vend_id, prod_id, prod_price

From products

Where prod_price <=5

Union

Select vend_id, prod_id, prod_price

From products

Where vend_id in (1001,1002);

这条语句由前面的两条select 语句组成,语句中用union 关键字分隔。Union 指示MySQL执行两条select 语句,并把输出组合成单个查询结果集。

4. Union 规则Union必须由两条或两条以上的select 语句组成,语句之间用关键词union分隔。

Union 中的每个查询必须包含相同的列,表达式或聚集函数

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

5. 包含或取消重复的行

Union从查询结果集中自动去除了重复的行(换句话说,它的行为与单条select语句中使用多个where子句条件一样)。因为供应商1002生产的一种物品的价格也低于5,所有两条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);

注意:如果需要每个条件的匹配行全部出现(包含重复行),则必须使用union all 而不是where。

6. 对组合查询结果排序

Select 语句的输出用order by 子句排序。在用union组合查询时,只能使用一条order by 子句,它必须出现在最后一条select 语句之后。对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条order by 子句。

Select vend_id ,prod_id, prod_price

From products

Where prod_price <=5

Union

Select vend_id,prod_id, prod_price

From products

Where vend_id in (1001,1002)

Order by vend_id, prod_price;

这条union 在最后一条select语句后使用order by 子句。

虽然order by 子句似乎只是最后一条select 语句的组成部分,但实际上MySQL将用它排序所有select 语句返回的所有结果。

二.全文本搜索

1. 理解全文本搜索

之前的like关键字,利用通配操作符匹配文本,以及基于文本搜索作为正则表达式匹配列值。这些搜索机制非常有用,但存在重要的限制。性能——通配符和正则表达式匹配通常需要MySQL尝试匹配表中所有行。

明确控制——使用通配符和正则表达式匹配,很难明确地控制匹配什么和不匹配什么。

智能化结果——通用符和正则表达式的搜索不能提供一个智能化的选择结果。如一个特殊词的搜索将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行。

这些限制可以通过用全文本搜索来解决,在使用全文本搜索时,MySQL不需要分别查看每个行,不需要分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。

2. 使用全文本搜索

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表列进行适当设计后,MySQL会自动进行所有的索引和重新索引。

在索引之后,select可与match()和against()一起使用以实际执行搜索。

3. 启用全文本搜索支持

一般在创建表时启动全文本搜索。Create table 语句接受FULLtext ,它给出被索引列的一个逗号分隔的列表。

Create table productnotes

(

Note_id int not null auto_increment

Prod_id char(10) not null ,

Note_date datetime not null,

Note_text text null,

Primary key (note_id),

Fulltext(note_text)

)engine=Myisam;

在这里为了进行全文本搜索,MySQL根据子句FULLTEXT(note_text)的指示对它进行索引。这里的fulltext索引单个列,如果需要也可以指定多个列。

在定义之后,MySQL自动维护该索引。在增加,更新或删除行时,索引随之自动更新。注意:

不要在导入数据时使用FULLTEXT,如果正在导入所有数据,此时不应该启用FULLTEXT索引。应该首先导入所有数据,然后再修改表,定义FULLTEXT。

4. 启用全文本搜索

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

Select note_text

From productnotes

Where match(note_text) against(‘rabbit’);

此select语句检索单个列note_text。由于where子句,一个全文本搜索被执行。Match(note_text)指示MySQL针对指定的列进行搜索,Against(‘rabbit’)指示词rabbit作为搜索文本。

这样的可以使用简单地使用Like子句完成。

Select note_text

From productnotes

Where note_text like ‘%rabbit%’;

这条select语句同样检索出两列,但次序不同。注意:

上述两条SELECT语句都不包含order by 子句。后者(使用LIKE)以不特别有用的顺序返回数据。全文本搜索的一个重要部分就是对结果排序,具有较高等级的行先返回。

Select note_text,.

Match(note_text) against (‘rabbit’) as rank

From productnotes;

这里,在select而不是where 子句中使用Match()和Against()。这使所有行都被返回,match()和against()用来建立一个计算列,此列包含全文本搜索计算出的等级值。Rank为行等级,这里包含词rabbit的两个行每行都有一个等级值,文本中词靠前的行的等级值比词靠后的行的等级值高。注意:

‘rank’列的使用有助于全文本搜索如何排除行,如何排序结果。

5. 使用查询扩展

查询扩展用来设法放宽所返回的全文本搜索结果的范围。假如想要所有提到anvils的注释。只有一个注释包含词anvils,还想找出可能与搜索有关的所有其他行。注意:

首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行

其次,MySQL检查这些匹配行并选择所有有用的词

再其次,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词。

Select note_text

From productnotes

Where match(note_text) against (‘anvils’ with query expansion);

这样结果将返回7行,不仅是包含anvil的行,还有包含customers以及recommend的行。

6. 布尔文本搜索

MySQL支持全文本搜索的另外一种形式,称为布尔方式。

具体功能为:要匹配的词;

要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此)排列提示(指定某些词比其他词更重要,更重要的词等级更高)

表达式分组

为了演示IN BOOLEAN MODE

SELECT note_text

From productnotes

Where match(note_text) against (‘heavy’ in Boolean mode);

这里并没有使用到布尔操作符。

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

Select note_text

From productnotes

Where match(note_text) against(‘heavy-rope*’ in Boolean mode);

这里使用了两个全文本搜索布尔操作符-和*,-排除一个词,而*是截断操作符。

例如:

Select note_text

From productnotes

Where match(note_text) against (‘+rabbit +bait’ in Boolean mode);

这里搜索匹配包含词rabbit和bait的行。

Select note_text

From productnotes

Where match(note_text) against (‘rabbit bait’ in Boolean mode);

这里搜索匹配短语rabbit bait 而不是匹配两个词rabbit和bait。

Select note_text

From productnotes

Where match(note_text) against (‘>rabbit

匹配rabbit 和carrot,增加前者的等级,降低后者的等级。

三. 插入数据

1. 数据插入

Select 是最常用的SQL语句。INSERT也是常用的SQL语句。

INSERT 是用来插入(或添加)行到数据库表的,插入可以用以下几种方式:插入完整的行

插入行的一部分

插入多行

插入某些查询的结果

2. 插入完整的行

这样需要指定表名和被插入到新行中的值。

Insert into customers

Values ( null,

‘pep E.LaPew’,

‘100 main street’,

‘Los Angeles’,

‘CA’,

‘90046’,

‘USA’,

‘null’

‘null’);

虽然这里语法比较简单但要避免使用,这里的SQL语句过度依赖于表中列的次序

编写insert 语句更安全的方法如下:

Insert into customers( cust_name,

Cust_address,

Cust_city,

Cust_state,

Cust_zip,

Cust_country,

Cust_contact,

Cust_email)

Values(‘pep e.lapew’,

‘100 main street’,

‘Los Angeles’,

‘CA’,

‘90046’,

‘USA’,

‘null’

‘null’);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值