《Mysql必知必会》知识点整理
《Mysql必知必会》知识点整理
- 假定已有数据名 – brycenote
- 假定已有数据库表 — notebook
基础
- 语句结束符号 – ;
- SQL大小写 – 不区分
- 对表名列名应 – 小写
- 书写规范的好处 – 易于调试和阅读
- 选择数据库 – USE brycenote;
- 返回当前选择的数据库内可用表的列表 – SHOW TABLES;
- 显示指定表的列信息 – SHOW COLUMS FROM notebook;
- 列信息包括 – Field,Type,Null,Key,Default,Extra
- 在命令实用程序中,显示允许的SHOW语句 – HELP SHOW;
- 在命令实用程序中,显示(指定的模式信息) – INFORMATION_SCHEMA;
- 显示服务器的状态概要信息 – SHOW STATUS;
- 显示指定数据库的创建语句 – SHOW CREATE DATABASE brycenote;
- 显示指定表的创建语句 – SHOW CREATE TABLE notebook;
- 显示授予用户的安全权限 – SHOW GRANTS;
- 显示服务器错误信息 – SHOW ERRORS;
- 显示服务器警告信息 – SHOW WARNINGS;
检索
- 检索id列 – SELECT id FROM notebook;
- 检索的多个列使用__隔开 – ,
- 检索所有列 – SELECT * FROM notebook;
- 检索不索要的列通常会 – 降低检索速度,损耗应用程序的性能
- 检索不同值应使用关键字 – DISTINCT
- DISTINCT应用于 – 所有列
- 限制检索结果的数量就使用关键字 – LIMIT
- 从第3行开始检索出5行数据的简要语法 – LIMIT 2,5
- 从第3行开始检索出5行数据的完全语法 – LIMIT 2,5
排序
- 不明确规定排序顺序就不应假定 – 检索出的数据是有意义的
- SQL语句由__构成 – 子句
- 以指定列进行排序应使用 – ORDERY BY子句
- ORDER BY子句既可用要选择的列指定也可以用 – 非选择的列
- 指定排序为降序使用关键字 – DESC
- 指定排序为升序使用关键字 – ASC
- ORDER BY子句不能单独指定某列的排序方向 – 错
- 排序方向默认 – ASC
- ORDER BY 子句的语法位置在__子句之后 – FROM
- LIMIT子句的语法位置在__子句之后 – ORDER BY
- 找最值可组合使用 – ORDER BY和LIMIT
WHERE
- 过滤数据使用__子句 – WHERE
- 等于操作符 – =
- 不等于操作符 – !=
- 不等于操作符 – <>
- 小于操作符 – <
- 小于等于操作符 – <=
- 大于操作符 – >
- 大于等于操作符 – >=
- 介于两值之间的操作符 – BETWEEN
- 判空 – IS NULL
- 判非空 – IS NOT NULL
- 逻辑与操作 - AND
- 逻辑或操作 - OR
- AND操作优先级__OR操作 – 高于
- 同时使用AND和OR操作应使用__进行分组 – 括号
- 指定范围条件的语法 – IN(A,B,C)
- IN可以包含其它SELECT语句 – 对
- 指定范围条件的语法 – NOT IN(A,B,C)
- 可以与NOT组合取反的关键字 – IN BETWEEN EXIST
通配符
- 不限长度的通配符 – %
- 仅限单个字符的通配符 – _
- _通配符可以配空 – 错
- 使用通配符过滤数据应使用关键字 – LIKE
- 通配符可以出现在匹配模式的中间 – 对
- 使用通配符过滤数据如何匹配上尾部有空格的数据 – 用%匹配尾空格
- 通配符比较耗性能,应避免过度使用通配符 – 对
- 将通配符放在匹配模式开头时的性能要比放在后面时性能要好 – 错
正则
- MySQL仅提供了正则表达式的初步支持 – 对
- 使用正则表达式过滤数据应使用关键字 – REGEXP
- LIKE匹配整个列的值 – 对
- REGEXP匹配列内值,所以不能匹配整个列的值 – 错
- REGEXP如何做到匹配整个列的值 – 使用^和$定位符
- 使用正则时转义需要使用_个\ – 两
- 为什么使用两个\ – MySQL和正则表达库要分别解释\
字段
- 拼接字段使用__函数 – concat
- 给字段或表取别名时使用关键字 – AS
- 要执行算术计算应使用 – 算术操作符
函数
- 函数的可移植性和SQL一样 – 错
- 进行日期判断应使用Date函数 – 对
字符操作
- 将文本转为大写的函数 – Upper
- 将文本转为小写的函数 – Lower
- 去除空格的函数有 – Trim,RTrim,LTrim
- 定位子串的位置 – Locate
- 指定位置(和长度)截取子字符串 – Substring
- 指定截取关键字与其序号来截取字符串 - SubString_Index
- 指定长度截取左边的字符串 – Left
- 指定长度截取右边的字符串 – Right
- Soundex函数有助于比较拼写不同但英语__的单词 – 发音相似
时期操作
- 增加指定天数或周 – AddDate
- 增加指定时或分 – AddTime
- 获取当前日期 – CurDate
- 获取当前时间 – CurTime
- 获取日期和时间 – Date
- 计算两个日期之差 – DateDiff
- 给指定时期增加指定时期种类的数值 – Date_Add
- 获取格式化日期或时间字符串 – Date_Format
- 获取日期的对应的号数 – Day
- 获取日期对应的星期几 – DayOfWeek
- 获取时间的小时部分数值 – Hour
- 获取时间的分钟部分数值 – Minute
- 获取时间对应的月份 – Month
- 获取当前的日期和时间 – Now
- 获取时间的秒数 – Second
- 获取日期的时间部分 – Time
- 获取日期所在的年份 – Year
数值操作
- 获取绝对值 – Abs
- 获取角度余弦 – Cos
- 获取数的指数 – Exp
- 取余 – Mod
- 获取圆周率 – Pi
- 获取随机数 – Rand
- 获取角度正统 – Sin
- 获取数的平方根 – Sqrt
- 获取角度的正切 – Tan
聚合
- 获取某列的平均值 – AVG
- 获取某列的行数 – COUNT
- 获取某列的最大值 – MAX
- 获取某列的最小值 – MIN
- 获取某列值的和 – SUM
- COUNT(*)不会统计包含空值的列 – 错
- COUNT(notebook)只统计具有值的行 – 对
- AVG只能用于单个列且会忽略空值 – 对
- MAX只能用于数值类型的列 – 错
- DISTINCT可以用于聚合函数中 – 对
- 使用聚合函数时应尽量取别名 – 对
分组
- 数据分组应使用__子句 – ORDER BY
- GROUP BY子句中不能出现聚合函数 – 对
- GROUP BY子句的语法位置在ORDER BY子句之前 – 对
- 将GOUP BY子句中分组级别进行任意组合的分组应使用 – ROLLUP
- 过滤分组应使用关键字 – HAVING
- HAVING 支持所有WHERE操作符 – 对
- HAVING 可以替代WHERE进行使用 – 对
- HAVING 是分组后进行过滤,WHERE是分组前进行过滤 – 对
- 使用聚合函数可以不配合GROUP BY使用 – 错
- GOUP BY 的排序是不可靠的,应使用ORDER BY来保证排序 – 对
语法顺序
==SELECT->FROM->WHER->GROUP BY->HAVING->ORDER BY->LIMIT==
子查询
- 使用子查询应尽量格式化SQL – 对
- 可以出现子查询的关键字有 – FROM,IN,=,<>
- 使用子查询时应将父查询和子查询分别测试后再进行嵌套 – 对
联结
- 联结必须使用JOIN关键字 – 错
- 多个表不使用联结进行查询得到的结果为 – 笛卡尔积
- 使用联结尽量使用__语法 – JOIN
- JOIN 语法格式 – FROM …JOIN …ON …
- 联结的表越多,性能___ – 下降越厉害
- 联结的种类 – 自联结,自然联结,外部联结
- UNION会去除重复的行 – 对
- UNION ALL会保留重复的行 – 对
- 要对组合查询结果排序应该将ORDER BY放在第一个SELECT语句之后 – 错
全文本搜索
- 最常使用的引擎为 – MyISAM InnoDB
- MyISAM引擎不支持全文本搜索 – 错
- 全文本搜索应在建表时指定,使用的关键字是 – FULLTEXT
- 启用全文本搜索的目标列会被索引 – 对
- 进行全文本搜索时需同时使用Match函数和 – Against函数
- 传递给Match函数的值可和FULLTEXT指定的列不同 – 错
- 除非指定BINARY方式,否则全文本搜索 – 不区分大小写
- Match函数和Against函数可以用在 – WHERE子句和SELECT子句
- 查询扩展可以找出 – 可能相关的结果
- 查询扩展的语法格式 – Match(…) Against(… WITH QUERY EXPANSION)
- 布尔文本搜索需要定义FULLTEXT索引 – 错
- 布尔文本搜索的性能会随着数据量的增加而 – 降低
- 布尔文本搜索的语法格式 – Match(…) Against(… IN BOOLEAN MODE)
数据插入
- 使用INSERT语句应尽量给出列名 – 对
- 有很多索引要更新时,INSERT语句会很 – 耗时
- 可能通过在INSERT和INTO之间添加关键字__以降低INSERT语句的优先级 – LOW_PRIORITY
- 使用单条INSERT语句处理多个插入比使用多条INSERT语句__ – 快
- 插入检出的数据的语法格式 – INSERT INTO … SELECT …
更新删除
- 使用UPDATE或DELETE时应注意不要__WHERE子句 – 忽略
- UPDATE语句中不能使用子查询 – 错
- 使用UPDATE时可以关联其它表 – 对
- 批量更新时如果想要忽略期间操作的错误应在UPDATE之后使用关键字 – IGNORE
- 关联更新的语法有 – 显式关联和自然关联
- DELETE可以删除表 – 错
- TRUNCATE会逐行删除表的内容 – 错
- TRUNCATE会先删除表然后重新创建表 – 对
引擎
- 需要MySQL支持事务处理时应选用 – InnoDB
- MEMORY的数据存储在__, 适合于__ – 内存 临时表
- MyISAM支持__,但不支持事务处理 – 全文本搜索
- 外键可以跨引擎 – 错
- 数据库表的更新不能撤销 – 对
- ALTER TABLE时为了保护数据应做一个__ – 完整的备份
- 删除表使用关键字 – DROP
- 删除表没有__,也不能__ – 确认 撤销
视图
- 使用视图可以__SQL语句
- 使用视图可以__复杂的SQL操作
- 使用视图可以__数据
- 使用视图可以做到添加和更新数据,只是存在某些限制 – 对
- 视图不能嵌套 – 错
- 视图可以和表一起用 – 对
- 视图不能索引,也不能有关联的触发器或默认值 – 对
- 创建视图的语句 – CREATE VIEW … AS …
- 查看创建视图的语句 – SHOW CREATE VIEW viewname
- 更新视图可以先__再__,或者直接用__语句 – DROP,CREATE,CREATE OR REPLACE VIEW
- 利用视图可以__复杂的关联 – 简化
- 尽量创建可__的视图 – 重用
- 利用视图可以重新___化检索出的数据 – 格式
- 视图主要用于__ – 数据检索
- 视图定义中如果存在__操作,则不能进行视图的更新 – 分组,联结,子查询,并,聚集函数,DISTINCT,导出(计算)列
存储过程
- 存储过程是为以后使用面保存的一条或多条MySQL语句的集合 – 对
- 存储过程可以保证数据的完整性 - 对
- 存储过程可以提高性能 – 对
- 调用存储过程使用关键字 – CALL
- 创建存储过程的语法是 – CREATE PROCEDURE … BEGIN … END
- 删除存储过程的语法是 – DROP PROCEDURE …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
CREATE PROCEDURE productpricing( out p1 DECIMAL(8,2) out pH DECIMAL(8,2) out pa DECIMAL(8,2) ) BEGIN SELECT Min(prod_price) INTO p1 FROM products; SELECT Max(prod_price) INTO ph FROM products; SELECT Avg(prod_price) INTO pa FROM products; END;
- 参数关键字 – IN OUT INOUT
- 所有MySQL返参变量必须以_开始 – @
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
CALL productpricing(@pricelow, @pricehigh, @priceaverage); SELECT @priceaverage -- 下面同时使用IN(入参)和OUT(回参) -- Name: ordertotal CREATE PROCEDURE ordertotal( IN onumber INT, OUT ototal DECIMAL(8,2) ) BEGIN SELECT Sum(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO ototal; END; //调用 CALL ordertotal(2005, @total)
- 列出某存储过程的语法 – SHOW PROCEDURE STATUS procedurename;
- 列出所有存储过程的语法 – SHOW PROCEDURE STATUS;
- 附加限制地列出存储过程的语法 – SHOW PROCEDURE STATUS LIKE ‘ordertotal’
游标
- 当需要在检索出来的行中前进或后退一行或多行应该使用 – 游标
- MySQL游标只能用于存储过程 – 对
- 声明游标的语法格式 – DECLARE cursorname CURSON FOR …
1 2 3 4 5 6 7 8 9 10 11 12
CREATE PROCEDURE processorders() BEGIN DECLARE o INT; DECLARE ordernumbers CURSOR FOR SELECT order_num FROM Orders; OPEN ordernumbers; FETCH ordernumbers INTO O CLOSE ordernumbers; END;
- 使用DECLARE定义局部变量必须在定义任意游标或句柄之前定义 – 对
- 需要循环或重复执行语句时的语法 – REPEAT …UNTIL variala END REPEAT
触发器
- 触发器支持响应的语句分别是 – DELECT,INSERT,UPDATE
1 2
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'
- 删除触发器的语法格式 – DROP TRIGGER newproduct
- 访问被插入的行可以使用关键字 – NEW
- 在 BEFORE INSERT 触发器中NEW的值可以被更新 – 对
- 对于AUTO_INCREMENT列,插入前是0,插入后是新生成的值 – 对
- 对数据进行验证和净化可以使用 – BEFORE
- 在定义DELETE触发器时要访问被删除的行可以通过使用凑字 – OLD
1 2 3 4 5 6
CREATE TRGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num, Order_date, cust_id) VALUES(OLD.order_num, OLD.order_date, OLD.cust_id) END
- 定义触发器时使用BEGIN END块的好处是能使用多条__ – SQL语句
- 应该用触发器来保证数据的__ – 一致性
- 触发器非常适合于创建审计__ –跟踪
- MySQL触发器支持CALL语句 – 错
事务
- 有关事务处理的术语分别有 – 事务 回滚 提交 保留点
- 开始事务语法 – START TRANSACTION;
- 回滚的语法 – ROLLBACK;
- 事务中不能回滚的操作有 – SELECT CREATE DROP
- ROLLBACK只能在一个事务处理内使用 - 对
- 当COMMIT或ROLLBACK语句执行之后,事务会自动关闭 – 对
- 在事务处理块中提交不会隐藏地进行 – 对
- 设置保留点的语法 – SAVEPOINT pointname;
- 回滚到保留点的语法 – ROLLBACK TO pointname;
- 事务处理中为为理加灵活地进行回退,需要设置更多的 – 保留点
- 保留点在事务处理完成后自动释放 – 对
- 设置MySQL不自动提交更改 – SET autocommit=0
性能优化
- 要遵循MySQL的硬件建议 – 对
- 要调整内存分配、缓冲区大小时,查看当前设置的命令有 – SHOW VARIABLES; SHOW STATUS;
- MySQL是多线程DBMS,查看所有活动线程的命令是 – SHOW PROCESSLIST;
- 终止某个特定的进程应该使用命令 – KILL
- 尝试使用关联,并和子查询重新编写出最佳的 – SELECT语句
- 使用EXPLAIN语句查看MySQL是如何执行一条SELECT语句
- 存储过程一般都比逐行执行SQL要快,应尽量使用 – 存储过程
- 应该总是使用正确的 – 数据类型
- 决不要检索比需求还多的数据,即避免使用 – SELECT *
- 如果操作支持DELAY可以尝试使用__来异步执行SQL – DELAY
- 导入数据时应该关闭自动提交 – 对
- 必须__数据库表以改善数据检索的性能 – 索引
- 查找重复使用的WHERE和ORDER BY子句,耗时过长的WHERE子句使用的列就是需要__的对象 – 索引
- 尝试使用UNION语句重构__语句 – OR
- 对极少被搜索的表,如无必要就不要__它们 – 索引
- 索引改善数检索的性能,但会损害数据__,__,和__的性能 – 插入,删除,更新
- LIKE很慢,能使用__就不要使用__ – FULLTEXT,LIKE
- 随着表的使用和内容的更改,理想的优化和配置也会 – 改变
本文由作者按照 CC BY 4.0 进行授权