6.6学习总结

布尔文本搜索

布尔文本提供的功能:(主要)(通过布尔文本搜索运算符实现)

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

例:

select note_text

from productnotes

where match(note_text) against('heavy'in boolean mode);

这一段语句的作用是查找note_text字段中含有heavy一词的数据。(没有使用布尔文本搜索运算符,所以有没有in heavy boolean mode搜索的结果是没区别的)。

|-------|---------------------------------------|
| 布尔操作符 | 说明 |
| + | 包含,词必须存在 |
| - | 排除,词必须不出现 |
| > | 包含,而且增加等级值 |
| < | 包含,且减少等级 |
| () | 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等) |
| ~ | 取消一个词的排序值 |
| * | 取消一个词的排序值 |
| "" | 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) |

例:

select note_text

from productnotes

where match(note_text) against('heavy -hope'in boolean mode);

//作用:搜索note_text中带有heavy一词并且不包含hope一词的数据

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中的至少一个词的行

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和carrot,增加前者的等级,降低后者的等级

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行,则全文本搜索不返回结果。
  5. 忽略词中的单引号。例如,don't索引为dont。
  6. 不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。
  7. mysql不具有邻近操作符。

插入数据

insert into关键字

  • 插入完整的行
  • 插入行的一部分
  • 插入多行
  • 插入某些查询的结果
插入数据

简单的向表中插入数据

insert into topic

values("homework",NULL,"student");

这样插入的数据会根据你的给出的顺序插入,如果想只对最后一个数据进行插入就很难做到。

所以我们可以指定列名:

insert into topic(work,answer,user)

values("homework",NULL,"student");

不管哪种insert into语法,都必须给出values的正确数目,如果不提供列名,则必须给每个列提供一个值。

如果提供列名,则必须对每个列出的列值给出一个值。

列名被明确列出时,可以省略列,如果表的定义允许则可以省略列

  • 该列定义为允许NULL值(无值或空值)
  • 在表定义中给出默认值。
插入多行

当插入多行时只需要指定列名和values一次,然后每一行的数据都用括号括起来,中间使用逗号隔开。

例:

insert into topic(work,answer,user)

values //插入两行数据

("homework",NULL,"student"),

("home",NULL,"teacher");

插入检索出的数据

insert into topic(work,answer,user)

select work,answer,user from homework;

更新数据

update关键字

  • 更新指定列(一个或多个)

更新指定列

update topic set answer=12,content=2 where id=1;

更新多列

update topic set answer=12 where id=1;

更新单列

ignore关键字:在使用update和insert关键字进行多列修改时只要有一列的修改数据出现错误那么整个update语句的修改都会被撤销(已被修改的数据会被回溯成没有修改之前的值),为了在出现错误时也可以进行修改,遇到重复插入可以不进行插入,就会使用到ignore关键字,可以使update和insert在发生错误时也可以运行。

使用格式:

update ignore 表名

insert ignore into 表名

删除数据

delete关键字

  • 删除指定行(一个或多个)

删除指定行

delete from topic where id=1;

删除单行

delete from topic where id=1 and id=2;

删除多行

更新和删除的指导原则

下面是许多SQL程序员使用UPDATE或DELETE时所遵循的习惯。

  • 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
  • 保证每个表都有主键,尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
  • 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
  • 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行。

创建表

create table关键字

  • 新表的名字,在关键字CREATE TABLE之后给出。
  • 表列的名字和定义,用逗号分隔。

例:

CREATE TABLE customers

(

cust_id int NOT NULL AUTO_INCREMENT,

cust_name char(50) NOT NULL,

cust_address char(50) NULL,

PRIMARY KEY (cust_id)

) ENGINE=InnoDB;

在创建新表时,要确保表名时唯一的,如果在创建表时发现表名有重复会报错。如果只想在表不存在时创建可以在表名后加上if not exists。

表中的列是否可以为NULL是在创建表时规定的。

主键

主键值必须唯一。可以由一个或者多个

  • 如果主键使用单个列,则它的值必须唯一。
  • 如果使用多个列,则这些列的组合值必须唯一。

例:

PRIMARY KEY (order_num, order_item)

组合主键

使用auto_increment

auto_increment告诉MySQL,本列每当增加一行时自动增量。每次 执行一个insert操作时,MySQL自动对该列增量(从而才有这个关键字auto_increment),给该列赋予下一个可用的值。这样给每个行分配一个唯一的cust_id,从而可以用作主键值。

覆盖auto_increment:如果一个列被指定为auto_increment,则它需要使用特殊的值吗?你可以简单地insert语句中指定一个值,只要它是唯一的(至今尚未使用过)即可,该值将被用来替代自动生成的值。后续的增量将开始使用该手工插入的值。

指定默认值

MySQL不允许使用函数作为默认值,只支持常量。

例:

CREATE TABLE orderitems

(

order_num int NOT NUL,

order_item int NOT NULL,

prod_id char(10) NOT NULL,

quantity int NOT NULL DEFAULT 1, //默认为1

item_price decimal(8,2) NOT NULL,

//其数据类型为十进制(decimal)总共8位数字,其中包括两位小数

PRIMARY KEY (order_num,order_item)

) ENGINE = InnoDB;

引擎类型
  • InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索;【后面版本已经支持了~】
  • MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘) 中,速度很快(特别适合于临时表);
  • MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。
  • 引擎类型可以混用。

注意:不同类型的引擎之间的表不能混合引用,即使用一个引擎的表不能引用具有使用不同引擎的表的外键。

更新表

alter table关键字用于更改表的结构,给出表名和更改的列表

例:

alter table topic

add user char(20);

为了对单个表进行多个更改,可以使用单条ALTER TABLE语句,每个更改用逗号分隔.

例:

alter table topic

add user char(20),

drop column user;

删除表

drop table topic;

重命名表

rename table topic to work;

重命名单个表

rename table

topic to work,

home to homework;

相关推荐
liu_chunhai8 分钟前
设计模式(3)builder
java·开发语言·设计模式
姜学迁16 分钟前
Rust-枚举
开发语言·后端·rust
冷白白17 分钟前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
z樾19 分钟前
Github界面学习
学习
凌云行者21 分钟前
rust的迭代器方法——collect
开发语言·rust
bug菌¹23 分钟前
滚雪球学Oracle[6.2讲]:Data Guard与灾难恢复
数据库·oracle·data·灾难恢复·guard
It'sMyGo25 分钟前
Javascript数组研究09_Array.prototype[Symbol.unscopables]
开发语言·javascript·原型模式
一般路过糸.26 分钟前
MySQL数据库——索引
数据库·mysql
睡觉然后上课36 分钟前
c基础面试题
c语言·开发语言·c++·面试
qing_04060342 分钟前
C++——继承
开发语言·c++·继承