引言:虽然LIKE关键字利用通配符能够匹配文本、正则表达式能够匹配列值,从而搜索到我们需要的信息。但它们存在几个重要的限制,其一,性能方面。通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行,如果搜索行数不断增加,这些搜索则可能非常耗时。其二,明确控制。使用通配符和正则表达式匹配,很难明确控制匹配什么和不匹配什么,例如,指定一个词必须匹配,一个词必须不匹配,而一个词仅在第一个词确实匹配的情况下才可以匹配或者才可以不匹配。其三,智能化的结果。虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但它们都不能提供一种智能化的选择结果的方法。例如,一个特殊词的搜索将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行。类似的,一个特殊词的搜索将不会找出不包含该词但包含其它相关词的行。正因如此,所以,全文本搜索可以解决这些限制。在使用全文本搜索时,MySQL不需要分别查看每个行,不需要分别分析和处理每个词。这样,MySQL可以快速有效地决定哪些词匹配,哪些词不匹配,它们匹配的频率,等等。为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。
示例1:创建表productnotes并列出它包含的列,并堆note_text列索引,进行全文本搜索。
SQL语句:
CREATE TABLE productnotes
(
note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_data datatime NOT NULL,
note_test text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE=MyISAM;
示例2:对指定列note_text检索,并指定词rabbit作为搜索文本,返回包含rabbit的行。
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');
SQL语句:SELECT note_text FROM productnotes WHERE note_text LIKE '%rabbit%';
2.查询扩展:查询扩展用来设法放宽所返回的全文本搜索结果的范围。
示例:找出所有提到anvils的注释,以及可能与你搜索有关的其它行,即使它们不包含词anvils。
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION) ;
3.布尔文本搜索:提供关于细节的全文本查询,即使没有定义FULLTEXT索引,也可以使用。
示例1:全文本搜索包含词heavy的所有行
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE);
示例2:匹配包含heavy但不包含任意以rope开始的词的行
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against('heavy - rope*' IN BOOLEAN MODE);
示例3:搜索匹配包含rabbit和bait的行。
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);
示例4:没有指定操作符,搜索匹配包含rabbit和bait中的至少一个词的行。
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);
示例5:搜索匹配短语rabbit bait而不是匹配两个词rabbit和bait。
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against(' "rabbit bait" ' IN BOOLEAN MODE);
示例6:匹配rabbit和carrot,增加前者的等级,降低后者的等级。
SQL语句:SELECT note_text FROM productnotes WHERE Match(note_text) Against('>rabbit <carrot' IN BOOLEAN MODE);
示例7:搜索匹配词safe和combination,降低后者的等级。
二、插入数据
使用INSERT语句插入数据到数据库表中。插入可以用以下几种方式
- 插入完整的行;
- 插入行的一部分;
- 插入多行;
- 插入某些查询的结果。
1.插入完整的行
示例:插入一个新客户到customers表。
SQL语句:INSERT INTO customers VALUES(NULL,'pe','199 main','Los');
SQL语句:INSERT INTO customers(cust_name,cust_addr,cust_city,cust_nn) VALUES(NULL,'pe','199 main','Los');
2.插入多行
示例:插入多行信息到customers表。
SQL语句:INSERT INTO customers(cust_name,cust_addr,cust_city,cust_nn) VALUES(NULL,'pe','199 main','Los'),(NULL,'OO','19 main','Ls');
3.插入检索出的数据
示例:将表custnew的信息合并到customers表。
SQL语句:INSERT INTO customers(cust_id,cust_contact,cust_email,cust_name,cust_addr,cust_city) SELECT cust_id,cust_contact,cust_email,cust_name,cust_addr,cust_city FROM custnew;
使用UPDATE语句更新或者修改表中的数据,DELETE语句删除表中的数据。其中,更新操作包括对表中特定的行更新以及更新表中所有行,在更新表中特定行时,不可省略WHERE子句。
1.更新操作
UPDATE操作包括三部分,即要更新的表、列名和它们的新值、以及确定要更新行的过滤条件。
示例1:更新客户1005的信息
SQL语句:UPDATE customers SET cust_email = 'ele@163.com' WHERE cust_id = 1005;
SQL语句:UPDATE customers SET cust_email='ee@163.com', cust_name = 'zhang san' WHERE cust_id = 1005;
示例2:删除cust_email列的值,并将它设置为NULL
SQL语句:UPDATE customers SET cust_email = NULL WHERE cust_id = 1005;
2.删除操作
删除操作包括两种方式,即从表中删除特定的行和删除所有行。
示例1:删除表customers中的一行
SQL语句:DELETE FROM customers WHERE cust_id = 1006;
示例2:删除表customers中的所有行
SQL语句:DELETE FROM customers;
SQL语句:TRUNCATE TABLE customers;
DELETE和TRUNCATE区别:
参考博客https://www.cnblogs.com/zhizhao/p/7825469.html
注意事项:
使用UPDATE或DELETE时需要遵循的习惯
- 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句;
- 保证每个表都有主键,尽可能像WHERE子句那样使用它,可以指定各主键、多个值或值的范围;
- 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确;
- 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其它表相关联的数据的行。