Mysql学习day3 UNION 和索引

1-子查询

所有的子查询都是从内向外处理

2-UNION


  1. 注意这两个是不一样的,UNION自动过滤相同结果,但是UNION ALL不是
select id ,notification_name from notification where id <5
UNION 
select id ,notification_name from notification where id >2 AND id <10

select id ,notification_name from notification where id <5
UNION ALL
select id ,notification_name from notification where id >2 AND id <10

而且如果查询的列完全相同的情况下,可以UNION 不同的表


SELECT id , user_id
from admin_advertiser WHERE   id <10
UNION ALL
SELECT id, user_id  
from admin_agency h where  h.id<15 and h.id >7

3-索引学习


看一个表里面的索引

 show index from table_name;

3.1创建表的时候建立一个全文索引

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body)
) ENGINE=MyISAM

3.2创建数据

INSERT INTO articles (title,body) VALUES
    ('MySQL Tutorial','DBMS stands for DataBase ...'),
    ('How To Use MySQL Well','After you went through a ...'),
    ('Optimizing MySQL','In this tutorial we will show ...'),
    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    ('MySQL vs. YourSQL','In the following database comparison ...'),
    ('MySQL Security','When configured properly, MySQL ...');


3.3全文索引测试
—————注意 MATCH (title,body) 里面的值必须是前面建立全文索引的两个字段不能少。
against的意思是反对,靠着,相反,在这里是靠着的意思

SELECT * FROM articles   WHERE MATCH (title,body) AGAINST ('database'); 


3.4创建全文索引


在看完上面的例子之后,难免会问索引是什么,干嘛的,怎么创建的,下面将详细说明
3.4.1创建表的同时创建索引这个就是上面示例,不重复介绍
3.4.2通过alter table的方式来添加
注意括号里面的包括表名都是用 ESC下面的键打出来的,不是英文的单引号,但是表名可以不加

//ft_stu_name是索引名,可以随便起

ALTER TABLE `student` ADD FULLTEXT INDEX ft_stu_name  (`name`)  
或者:
ALTER TABLE `student` ADD FULLTEXT ft_stu_name  (`name`)

3.4.3直接通过create index的方式创建索引

CREATE FULLTEXT INDEX myindex3 ON `te` (`char`)

3.5删除索引
删除索引有两种方法,一个时直接删,另一个时用alter table

DROP INDEX 索引名on 表名
ALTER table 表名 drop index 索引名

3.6索引优化
特别注意:50%的门坎限制(当查询结果很多,几乎所有记录都有,或者极少的数据,都有可能会返回非所期望的结果) 。可用IN BOOLEAN MODE即可以避开50%的限制。于是上面的查询就变成了

SELECT * FROM articles   WHERE MATCH (title,body) AGAINST
 ('database' IN BOOLEAN MODE);

在AGAINST的两个单引号中间可以有多个词,但是里面有一些语法规则

  • +用在词的前面,表示一定要包含该词,而且一定要放在开始位置
 AGAINST  ('  +Apple ')
  • : -不包含该词,所以不能只用「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。
    AGAINST ('-林志玲 +张筱雨')匹配到: 所有不包含林志玲,但包含张筱雨的记录

  • 空(也就是默认情况),表示可选的,包含该词的顺序较高。
    AGAINST('APPLE BANANA')找至少包含上面词中的一个的记录行apple banana


  +apple +juice     两个词均在被包含

  +apple macintosh     包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些

 +apple -macintosh   包含 “apple” 但不包含 “macintosh”
  • 提高该字的相关性,查询的结果会排在比较靠前的位置。

  • < :降低相关性,查询的结果会排在比较靠后的位置。

  • ( ):可以通过括号来使用字条件。

  • ~ :将其相关性由正转负,表示拥有该字会降低相关性,但不像「-」将之排除,只是排在较后面。

  • eg: +apple ~macintosh 先匹配apple,但如果同时包含macintosh,就排名会靠后。
  • : * 通配符*,这个只能接在字符串后面。
MATCH (girl_name) AGAINST ('+*ABC*')   #错误,不能放前面
MATCH (girl_name) AGAINST ('+张筱雨*')  #正确
  • ” ” :整体匹配,用双引号将一段句子包起来表示要完全相符,不可拆字。
eg:  "tommy huang" 可以匹配  tommy huang xxxxx   但是不能匹配  tommy is huang。

3.7索引查询方法

  • 3.7.1 全文本查询

SELECT * FROM articles   WHERE MATCH (title,body) AGAINST ( 'database'); 
  • 3.7.2使用查询扩展
//查询扩展的结果让返回的行数增加,但是也同样增加了不想要的数据
SELECT * FROM articles   WHERE MATCH (title,body) AGAINST ( 'database' with query expansion); 
  • 3.7.3布尔文本搜索
//布尔搜索不同于其它的全文搜索语法在于,即使没有定义FULLTEXT索引,也可以使用,但是这时一种非常慢的操作,上面的那些规则都是布尔搜索里面的
SELECT * FROM articles   WHERE MATCH (title,body) AGAINST
 ('database  ' in boolean mode ); 

你可能感兴趣的:(MySql)