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;

相关推荐
hairenjing11231 分钟前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
江深竹静,一苇以航1 分钟前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
远望清一色8 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself17 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq041522 分钟前
J2EE平台
java·java-ee
小码的头发丝、25 分钟前
Django中ListView 和 DetailView类的区别
数据库·python·django
小黄人软件26 分钟前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio
XiaoLeisj29 分钟前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man32 分钟前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
小兜全糖(xdqt)33 分钟前
mysql数据同步到sql server
mysql·adb