摸鱼看完的书,笔记扔在这里记录一下:)
mySQL
中IN
比OR
的速度快,原因?- 对于
IN
来说,会将匹配的行的值r
与二叉搜索树(r1,r2,r3)
进行查找,时间复杂度为 O ( l o g n ) O(logn) O(logn) - 对于
OR
来说,会将匹配的行的值r
与全部的值进行依次匹配,时间复杂度为 O ( n ) O(n) O(n)
- 对于
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
游标只能用于存储过程(和函数)