摸鱼看完的书,笔记扔在这里记录一下:)
mySQL
中IN
比OR
的速度快,原因?
- 对于
IN
来说,会将匹配的行的值r
与二叉搜索树(r1,r2,r3)
进行查找,时间复杂度为 - 对于
OR
来说,会将匹配的行的值r
与全部的值进行依次匹配,时间复杂度为
-
IN
的最大优点?IN
能够包含其他SELECT
语句 -
MYSQL
中NOT
支持对什么语句进行取反?NOT
支持对IN
、BETWEEN
、EXISTS
取反 -
MYSQL
中LIKE
是什么?LIKE
是谓词,不是操作符 -
NULL
能被%
通配符匹配吗?NULL
不能被%
通配符匹配 - 使用通配符
%
、_
的技巧
- 花费时间更长,能不使用就不适用
- 尽量不要置于开头,匹配时间最长
- 仔细注意位置
- 正则表达式匹配的谓词?
REGEXP
LIKE
和REGEXP
的区别?
-
LIKE
匹配整个列值 -
REGEXP
匹配时,当匹配文本在列值中出现,就会返回 - 当
REGEXP
在匹配的时候,开头和结尾分别加上^
和$
就可以实现和LIKE
一样的作用
-
MYSQL
中正则表达式匹配区分大小写的关键字?BINARY
-
SOUNDEX
函数的作用?
采用算法,将串变成其语音表示的字母数字算法,实现能够对串进行发音比较。 -
COUNT(*)
会对NULL
进行匹配吗?COUNT(*)
会对NULL
进行匹配,但是COUNT(column)
就不会对该列为NULL
的行进行计数 -
DISTINCT
能用于COUNT(*)
吗?
不能,如果使用的话,语句为COUNT(DISTINCT)
,产生错误,故不能 -
GROUP BY
对于NULL
值的处理?
当分组列中存在NULL
值的时候,把所有的NULL
值放在一起,作为一个单独的分组 -
GROUP BY
和ORDER BY
的语句顺序?GROUP BY
一定要放在WHERE
语句后,ORDER BY
前 -
WITH ROLLUP
的作用
当使用GROUP BY
的时候,在GROUP BY
语句后加上WITH ROLLUP
,会在每一个分组下面加上一行,表示该分组的汇总数据 SLECT
语句顺序?
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
- 给表名起别名的理由?
- 缩短
SQL
语句 - 允许在单条
SELECT
语句中多次使用相同的表
- 自联结通常比子查询要更加迅速?
-
MYSQL
中的自然联结需要自己实现,内部没有预实现 -
*=
和=*
在MYSQL
中不支持,在其他DBMS
中用于表示左外部联结和右外部联结 - 使用
UNION
的规则
-
UNION
必须由两条及以上的SELECT
语句组成,SELECT
语句中用关键字UNION
分隔 -
UNION
中每个查询中必须包含相同的列、表达式或聚集函数 - 列数据类型必须兼容
-
UNION
会自动去除重复的行吗?UNION
会自动去除重复的行,如果不想要去除重复的行,可以使用UNION ALL
- 对
UNION
的输出进行排序?
此时的ORDER BY
必须放在最后一条SELECT
语句之后,并作用在整个UNION
并集中 - 所有引擎都支持全文本搜索吗?
并不是,常见的引擎有MyISAM
和InnoDB
,其中MyISAM
支持全文本搜索,InnoDB
不支持全文本搜索(MYSQL 5.6
后两者均支持) - 使用全文本搜索的时候,
MYSQL
不会分别查看每个行,不需要分别分析和处理每个词。而是创建列中各词的索引,搜索可以针对这些词进行。 - 全文本搜索必须索引搜索的列
- 使用
FULLTEXT(column, column, ...)
来标明全文本搜索的列 - 导入数据时,应当先不开始全文本搜索,待所有数据导入到新表中,再开启全文本搜索,时间更快?
- 全文本搜索会对结果进行排序,等级高的行先返回
- 布尔文本搜索一定要在
FULLTEXT
开启的情况下才能进行吗?
不是,即使没有定义FULLTEXT
索引,也可以使用,只是非常缓慢 - 布尔方式搜索时,会进行排序吗?
不会,在布尔方式中,不按等级值降序排序返回的行 - 全文本搜索的重要说明?
- 索引全文本数据时,短词(具有3个或3个以下字符的词)被忽略并从索引中删除
-
MYSQL
中有内建的非用词(stopword)列表,其中的词在创建索引时会被忽略 -
MYSQL
中有50%规则:如果一个词出现在50%的行中,会作为非用词 - 表中的行少于3行,全文本搜索不返回结果
- 全文本搜索忽略词中的单引号
-
INSERT
语句一般不会产生输出 - 简单的
INSERT
语句中各个列必须以他们在表定义中出现的次序进行填充 - 当使用
INSERT
语句的时候,总是使用包含列的列表的INSERT
语句 INSERT
语句的列名可以被省略,省略的列应当满足的条件:
- 该列允许被定义为
NULL
- 表定义中存在默认值
- 插入多个行数据时,尽量在一条
INSERT
语句中解决,因为用单条INSERT
语句处理插入比使用多条INSERT
语句快 -
UPDATE
更新多行,如果其中一行发生错误,整个UPDATE
操作被取消;如果想要发生错误也可以继续,那么要使用UPDATE IGNORE tableName
- 为什么
TRUNCATE TABLE
比DELETE FROM TABLE
更快?
因为TRUNCATE
相当于是删掉原来的表,并重新建立一个新的表 - 如何仅在创建的表明不存在时创建新表?
CREATE TABLE tableName IF NOT EXISTS
- 主键只能使用
NOT NULL
的列 -
AUTO_INCREMENT
允许存在一个表的多列上吗?
不允许,每个表只允许一个AUTO_INCREMENT
,而且它必须被索引 -
MYSQL
在使用默认值DEFAULT
的时候,允许函数定义吗?MYSQL
不允许使用函数作为默认值,只允许使用常量 MYSQL
中常见的引擎类型?
-
InnoDB
:事务处理引擎,5.6前不支持全文本搜索 -
MEMORY
:功能上等同于MyISAM
,但是数据存储在内存中,速度很快,适用于临时表 -
MyISAM
:性能很高,支持全文本搜索,但不支持事务处理
- 外键不能跨引擎使用
-
MYSQL 5
之后提供了对视图的支持 - 多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会造成性能下降很厉害
- 视图不能有索引,也不能有关联的触发器或者默认值
-
CREATE OR REPLACE VIEW
常用于更新视图 - 如果从视图检索数据时使用了一条
WHERE
字句,那么在视图中的WHERE
字句和传递给视图的WHERE
字句会自动合并 - 更新一个视图将更新其基表
- 应将视图用于检索而不是更新
- 存储过程:多条
MYSQL
语句的集合 - 使用存储性能的三个主要好处:
- 简单
- 安全
- 高性能
- 仅当存在时删除过程:
DROP PROCEDURE IF EXISTS
- 所有的
MYSQL
变量必须以@
开头 -
MYSQL
游标只能用于存储过程(和函数)