MySQL数据检索+查询+全文本搜索

【0】README

0.1)本文部分文字描述转自“MySQL 必知必会”,旨在review“MySQL数据检索+查询+全文本搜索” 的基础知识;

【1】使用子查询

1)查询定义:任何sql 语句都是查询。但此术语一般指 select语句;SQL 还允许创建子查询,即嵌套在其他查询中的查询;

2)利用子查询进行过滤(where子句,in子句)

2.1)可以把一条select语句返回的结果用于另一条select语句的where子句;

3)作为计算字段使用子查询

3.1)使用子查询的另一种方式是创建计算字段:如需要显式供应商的订单总数和供应商的id和name;

Attention)显然, select id,name,(select count(*) from product p where p.vendor=v.id group by vendor) as my_count from vendor v;与其他的SQL不同,因为 where p.vendor=v.id group
by vendor) as my_count from vendor v 子句 使用了完全限定名比较 内部表和外部表的id是否相等;


【2】联结表

1)主键+外键:

1.1)主键:能够唯一标识每一行数据;

1.2)外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系;

2)创建联结:

3)笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目是第一个表中的行数乘以第二个表中的行数;

Attention)不要忘记where子句:应该保证所有联结都有where 子句,否则MySQL 将返回比想要的数据多得多的数据;

4)内部联结(=等值联结)

4.1)定义:目前为止使用的联结称为等值联结,它基于两个表之间的相等测试。这种联结也称为内部联结;

select v.id,v.name from product p, vendor v where p.vendor = v.id;
select v.id,v.name from product p inner join vendor v on p.vendor = v.id;

5)联结多个表

5.1)我们需要找出购买wang供应商的生产商品的客户id;

select customer_id from t_order o,product p,vendor v where o.prod_id=p.id and p.vendor = v.id and v.name='wang';

【3】创建高级联结

 for spec info,please visit  MySQL的自然联结+外部联结(左外连接,右外连接)+内部联结



【4】组合查询

1)MySQL允许执行多个查询(多条select),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询;

2)有两种case,需要使用组合查询;

case1)在单个查询中从不同的表返回类似结构的数据;

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

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

4)使用union

5)使用union规则(rules)

r1)union必须由两条或两条以上的select 语句组成,语句之间用关键字 union分割;

r2)union 中的每个查询必须包含系统的列,表达式或聚集函数(不过各个列不需要以相同的次序给出);

r3)列数量类型必须兼容:类型不必完全相同,但必须是 DBMS可以隐含地转换的类型;

6)包含或取消重复的行

6.1)problem+solution:

problem)第一条select语句返回4行,第二条select语句返回3行,而在用union组合两条select语句后,只返回了6行而不是7行;原因是 union从查询结果集中自动去除了重复的行(在使用union时,重复的行被自动取消);

solution)如果想要返回所有匹配行,可以使用 union all 而不是 union;

7)对组合查询结果排序:在使用union 组合查询时,只能使用一条 order by 语句,它必须出现在最后一条select
语句之后。

Attention)使用union时,也可以使用不同的表进行组合;


【5】全文本搜索

1)只有 myisam 引擎支持全文本搜索;

2)为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引;

2.1)启用全文本搜索支持:一般在创建表时启用全文本搜索;create table 语句接收fulltext 子句,它给出被索引列的一个逗号分隔的列表;

看个荔枝)通过create演示fulltext子句的使用:

对以上代码的分析(Analysis):

A1)MySQL根据子句fulltext(note_text)的指示对它进行索引。这里的fulltext索引单个列,如果需要也可以索引多个列;

A2)在定义之后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新;

Attention)不要在导入数据时使用fulltext: 更新索引要花时间,虽然不是很多,但毕竟要花时间。如果正在导入数据到一个新表,此时不应该启用fulltext索引。应该首先导入所有数据,然后再修改表,定义 fulltext,这样有助于更快地导入数据;

2.2)进行全文本搜索:使用match()函数和against()函数质心全文本搜索,match()函数指定被搜索的列,而against()指定要使用的搜索表达式;

Attention)以下荔枝转自:http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#fulltext-search

2.3)全文搜索带查询扩展

全文搜索支持查询扩展功能 (特别是其多变的“盲查询扩展功能” )。若搜索短语的长度过短, 那么用户则需要依靠全文搜索引擎通常缺乏的内隐知识进行查询。这时,查询扩展功能通常很有用。例如, 某位搜索
“database” 一词的用户,可能认为“MySQL”、“Oracle”、“DB2” and “RDBMS”均为符合
“databases”的项,因此都应被返回。这既为内隐知识。

在下列搜索短语后添加WITH QUERY EXPANSION,激活盲查询扩展功能(即通常所说的自动相关性反馈)。它将执行两次搜索,其中第二次搜索的搜索短语是同第一次搜索时找到的少数顶层文件连接的原始搜索短语。这样,假如这些文件中的一个
含有单词 “databases” 以及单词 “MySQL”, 则第二次搜索会寻找含有单词“MySQL”
的文件,即使这些文件不包含单词 “database”。下面的例子显示了这个不同之处:

2.4)布尔全文索引:利用IN BOOLEAN MODE修改程序, MySQL 也可以执行布尔全文搜索,提供关于如下内容的细节(Details)

D1)要匹配的词;

D2)要排斥的词;

D3)排列提示(某些词比其他词更重要,更重要的词等级更高);

D4)表达式分组;

关于全文本搜索的使用说明(specification)

s1)在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数字3可以修改);

s2)MySQL 带有一个内建的非用词列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表;

s3)许多词出现的频率很高,搜索它们没有用处,因此,MySQL规定了一条50%规则,如果一个词出现在 50% 以上的行中, 则将它作为一个非用词忽略,50%规则不用于 in boolean mode 中;

s4)如果表中的行数少于3行,则全文本搜索不返回结果(因为每个次或者不出现,或者至少出现在50%的行中);

s5)忽略词中的单引号,如,don‘t == dont;

s6)不具有词分隔符的语言(包括日文和中文)不能恰当地返回全文本搜索结果;

s7)仅在 MyISAM数据库引擎中支持全文本搜索;

时间: 2024-08-10 07:06:56

MySQL数据检索+查询+全文本搜索的相关文章

数据库9:联结表 高级联结 组合查询 全文本搜索

第十五章联结表 Sql最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结是利用sql的select能执行的最重要的操作,能很好的理解联结及其语法是学习sql的一个极为重要的组成部分.   外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系. 好处:供应商信息不重复,不浪费空间和时间,方便日后修改,一个表信息改动不影响另一个表的信息 联结是一种机制,使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行.   创建联结          

MySQL.MATCH() AGAINST()全文本搜索

SELECT note_text -> FROM productnotes -> WHERE Match(note_text) Against('rabbit'); +----------------------------------------------------------------------------------------------------------------------+ | note_text | +------------------------------

【转】MYSQL入门学习之三:全文本搜索

转载地址:http://www.2cto.com/database/201212/173873.html 一.理解全文本搜索 www.2cto.com 1.MyISAM支持全文本搜索,而InnoDB不支持. 2.在使用全文本搜索时,MySQL不需要分别查看每个行,不需要分别分析和处理每个词.MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行.这样MySQL可以快速有效地决定哪些词匹配,哪些词不匹配,它们匹配的频率,等等. 二.使用全文本搜索 1.为了进行全文本搜索,必须索引被搜索的列,

第十八章 全文本搜索

1.使用like和regexp进行文本的搜索有几个缺点: A:性能不高,通配符和正则表达式通常要求mysql尝试匹配表中所有行,由于行数多,这些搜索可能很耗时 B:使用正则表达式和通配符很难明确空值 C:虽然基于通配符和正则表达式的搜索提供了非常灵活的效率,但它们都不能提供一种智能化的选择结果 2.为了进行全文本搜索,必须索引被搜索的列,而且随着数据的改变不断重新索引.在索引之后select可与match()和against()一起使用. 3.一般在创建表时启用全文本搜索.create tabl

全文本搜索

仅在MyISAM引擎中支持全文本搜索 1.创建表时启用全文本搜索 e.g. CREATE TABLE productnotes ( note_id int NOT NULL AUTO_INCREMENT, prod_id char(10) NOT NULL, note_text text NULL, PRIMARY KEY(note_id), FULLTEXT(note_text) )ENGINE=MyISAM 这里FULLTEXT一个列,也可以指定多个列,用逗号隔开 2.索引之后,使用Matc

第十八章:全文本搜索

@author: Tobin @date: 2019/11/4 16:03:15 MyISAM不支持全文本搜索,InnoDB支持. # 在创建表时启用全文本搜索 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), FULLTE

mysql 文本搜索

全文本搜索 MySQL支持几种基本的数据库引擎,但并非所有的引擎都支持全文本搜索.两个最常使用的引擎为MyISAM和InnoDB,前者支持全文本搜索,后者就不支持. 理解全文本搜索 在前面的学习中,我们都知道有两种方式来匹配文本.一种是使用like关键字来进行匹配,另外一种就是使用正则表达式来进行匹配. 虽然使用正则表达式就可以编写查找所需行的足够复杂的匹配模式.但是,这些存在几个重要的限制影响: 1.性能:通配符和正则表达式时尝试匹配表中所有行,而这些搜索极少使用了表索引,因此,相当慢 2.明

MySQL慢日志查询全解析:从参数、配置到分析工具【转】

转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbaplus.cn/news-11-694-1.html 一.慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.long_query_time的默认值为

MySQL联合查询语法内联、左联、右联、全联

MySQL联合查询效率较高,以下例子来说明联合查询(内联.左联.右联.全联)的好处: T1表结构(用户id,用户名,密码)   userid   username  password 1   jack jackpwd    2   owen   owenpwd T2表结构(用户id,用户积分,用户等级)   userid(int)   jifen   dengji     1    20   3       3    50    6 第一:内联( inner join )如果想把用户信息.积分.