回顾之前学习数据库的相关操作,复习时顺便记录下,以便以后自己可以再次查看!!!
/*
全文本搜索
*/
(1)select note_text
from productnotes
where Match(note_text) against('rabbit');//此SELECT语句检索单个列note_text。由于 WHERE子句,一个全 文本搜索被执行。Match(note_text)指示MySQL针对指定的 列进行搜索,Against('rabbit')指定词rabbit作为搜索文本。由于有 两行包含词rabbit,这两个行被返回。
(2)select note_text
from productnotes
where note_text like '%rabbit%';//这条SELECT语句同样检索出两行,但次序不同(虽然并不总是 出现这种情况)。
(3)select note_text,
Match(note_text) against('rabbit') as rank
from productnotes;
(4)select note_text
from productnotes
where match(note_text) against('anvils');//只有一行包含词anvils,因此只返回一行
(5)select note_text
from productnotes
where match(note_text) against('anvils' with query expansion);//这次返回了7行。第一行包含词anvils,因此等级最高。第二 行与anvils无关,但因为它包含第一行中的两个词(customer 和recommend),所以也被检索出来。第3行也包含这两个相同的词,但它 们在文本中的位置更靠后且分开得更远,因此也包含这一行,但等级为 第三。第三行确实也没有涉及anvils(按它们的产品名)。
(6)select note_text
from productnotes
where match(note_text) against('heavy' in boolean mode);//此全文本搜索检索包含词heavy的所有行(有两行)。其中使用 了关键字IN BOOLEAN MODE,但实际上没有指定布尔操作符, 因此,其结果与没有指定布尔方式的结果相同。
(7)select note_text
from productnotes
where match(note_text) against('heavy -rope*' in boolean mode);//这次只返回一行。这一次仍然匹配词heavy,但-rope*明确地 指示MySQL排除包含rope*(任何以rope开始的词,包括 ropes)的行,这就是为什么上一个例子中的第一行被排除的原因。
/*
全文本布尔操作符 :
+ 包含,词必须存在
- 排除,词必须不出现
> 包含,而且增加等级值
< 包含,且减少等级值
() 把词组成子表达式(允许这些子表达式作为一个组被包含、 排除、排列等)
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语(与单个词的列表不一样,它匹配整个短语以 便包含或排除这个短语)
*/
(8)select note_text
from productnotes
where match(note_text) against('+rabbit +bait' in boolean mode);//搜索匹配包含词rabbit和bait的行
(9)select note_text
from productnotes
where match(note_text) against('rabbit bait' in boolean mode);//没有指定操作符,这个搜索匹配包含rabbit和bait中的至少一 个词的行。
(10)select note_text
from productnotes
where match(note_text) against('"rabbit bait"' in boolean mode);//这个搜索匹配短语rabbit bait而不是匹配两个词rabbit和 bait。
(11)select note_text
from productnotes
where match(note_text) against('>rabbit <carrot' in boolean mode);//匹配rabbit和carrot,增加前者的等级,降低后者的等级
(12)select note_text
from productnotes
where match(note_text) against('+safe +(<combination)' in boolean mode);//这个搜索匹配词safe和combination,降低后者的等级
/*
关于全文本搜索的某些重要的说明:
1.在索引全文本数据时,短词被忽略且从索引中排除。短词定义为 那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。
2. MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表(请参 阅MySQL文档以了解如何完成此工作)。
3.许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。 因此,MySQL规定了一条50%规则,如果一个词出现在50%以上 的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。
4.如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词 或者不出现,或者至少出现在50%的行中)。
5. 忽略词中的单引号。例如,don't索引为dont
6.不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文 本搜索结果。
7.如前所述,仅在MyISAM数据库引擎中支持全文本搜索。
*/
/*
插入数据
*/
(13)insert into Customers
values(null,'Pep E. Lapew','100 Main Street','Los Angeles','CA','90046','USA',null,null);//插入一个新客户到customers表。
/*
注意:
INSERT语句一般不会产生输出。
*/
(14)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);//此例子完成与前一个INSERT语句完全相同的工作,但在表名后 的括号里明确地给出了列名。
(15)insert into customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)
values('Pep E. Lapew','100 Main Street','Los Angeles','CA','90046','USA'),
('M. Martian','42 Galaxy Way','New York','NY','11213','USA');//实现多条语句插入,单条INSERT语句有多组值,每组值用一对圆括号括起来, 用逗号分隔
/*
更新和删除数据
*/
(16)update customers
set cust_email = 'elmer@fudd.com'
where cust_id = 10005;//UPDATE语句总是以要更新的表的名字开始。在此例子中,要更新的 表的名字为customers。SET命令用来将新值赋给被更新的列。这是更新单个列
(17)update customers
set cust_name = 'The Fudds',
cust_email = 'elmer@fudd.com'
where cust_id = 10005;//在更新多个列时,只需要使用单个SET命令,每个“列=值”对之间 用逗号分隔(最后一列之后不用逗号)。在此例子中,更新客户10005的 cust_name和cust_email列。
/*
注意:
UPDATE语句中可以使用子查 询,使得能用SELECT语句检索出的数据更新列数据
*/
/*
IGNORE关键字 如果用UPDATE语句更新多行,并且在更新这些 行中的一行或多行时出一个现错误,则整个UPDATE操作被取消 (错误发生前更新的所有行被恢复到它们原来的值)。为即使是发 生错误,也继续进行更新,可使用IGNORE关键字,如下所示: UPDATE IGNORE customers…
*/
(18)update customers
set cust_email = null
where cust_id = 10005;//其中NULL用来去除cust_email列中的值。
(19)delete from customers
where cust_id = 10006;//。DELETE FROM要求指定从中删除数据的表名。 WHERE子句过滤要删除的行。在这个例子中,只删除客户10006。如果省 略WHERE子句,它将删除表中每个客户.
/*
注意:
1.在使用DELETE时一定要注意细心。因为 稍不注意,就会错误地删除表中所有行。
2.DELETE不需要列名或通配符。DELETE删除整行而不是删除列。为了 删除指定的列,请使用UPDATE语句。
3.DELETE语句从表中删除行,甚至是 删除表中所有行。但是,DELETE不删除表本身。
4.如果想从表中删除所有行,不要使用DELETE。 可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更 快(TRUNCATE实际是删除原来的表并重新创建一个表,而不 是逐行删除表中的数据)。
*/
/*
许多SQL程序员使用UPDATE或DELETE时所遵循的习惯。:
1.除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE 子句的UPDATE或DELETE语句。
2. 保证每个表都有主键(如果忘记这个内容,请参阅第15章),尽可能 像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
3.在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进 行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不 正确。
4.使用强制实施引用完整性的数据库(关于这个内容,请参阅第15 章),这样MySQL将不允许删除具有与其他表相关联的数据的行。
*/