mysql基础知识点(复习一)


目录

  1. 其他

  2. SQL基础-DDL、DML

  3. SQL优化

  4. Mysql对象-表、视图、函数、数据类型、索引等

  5. Mysql存储引擎innodb与MyISAM特性及对比

  6. mysql事务

  7. mysql锁

  8. Mysql存储引擎innodb与MyISAM特性及对比

  9. 正则

  10. 补充

一、其他

  1. 创建数据库:create database mytest
  2. 删除数据库:drop database mytest;
  3. FOUND_ROWS()函数:
    a) 返回的是上一条 SELECT 语句(或 SHOW语句等)查询结果集的记录数。
  4. ROW_COUNT()函数:
    a) 返回的是上一条SQL语句,对表数据进行修改操作后影响的记录数。
    b) 如果上一条SQL语句不是修改操作语句(INSERT/UPDATE/DELETE 等),而是查询语句(SELECT/SHOW 等)则返回-1。
    c) 如果是修改操作语句,则返回修改(增/删/该)影响的记录数。
    d) 如果上一条SQL语句是UPDATE语句,但是UPDATE后所有数据的值并没有改变,则返回 0。
    e) 如果上一条SQL语句是建表语句(创建表或临时表),但创建的是空表,则返回 0。如果是删除表(DROP语句),则返回的还是 0。
  5. 创建表时使用FULLTEXT(),可以启用全文本搜索;用于指定被搜索的列的是MATCH();against:指定要搜索的方式。全文本搜索,mysiam支持,innodb不支持。
  6. 删除用户账号命令是:DROP USER,创建:create user
  7. 数据库系统中的数据模型是( )。
    a) A.层次模型
    b) B.网状模型【注意不是网络模型】
    c) C.关系模型
  8. 关系模型的组成:数据结构、操作集合、完整性约束
  9. SQL语言是(非过程化)的语言,轻易学习。
  10. 返回字符串字节长度的函数是:length(),char_length()返回字符个数。【java中,数组使用length属性,字符串使用length()函数返回字符串长度】
  11. 在MySQL中,不允许有空表存在,即一张数据表中不允许没有字段。
  12. 在MySQL中,对于存放在服务器上的数据库,用户可以通过任何客户端进行访问。
  13. 数据库名称合法:db1_student、db1&student
  14. Mysql的数据类型:BIGINT、TINYINT、INTEGER、INT
  15. 在MySQL中,用户在单机上操作的数据就存放在单机中。
  16. 查看由mysql自己解释的命令(BCD)
    a) A.?
    b) B.?
    c) C.help
    d) D.\h
  17. 运算符的优先级:算术>比较>逻辑
  18. 如果指定多列排序,可以在任意列使用升序或降序关键字。
  19. 创建数据表时,char的长度不可以省略的。
  20. 关系数据模型哪些优点?(ACB)
    a) A)结构简单
    b) B.)有标准语言
    c) C适用于集合操作
  21. 对某个数据库使用记录单,可以进行的记录操作有( ABC)。
    a) A.新建B.删除C.还原 D.插入
  22. 投影有两个功效,一个是消除原关系中的某些列,还有一个是额外性质即消除投影后重复的元组,因此元组也有变少的可能【做投影操作后,新关系的元组个数(<=)原来关系的元组个数】
    a) 优化查询语句:先做选择运算,再进行投影运算
  23. 数据库系统由外模式、模式【概念模式或逻辑模式】和内模式构成。
    • 外模式是局部数据的逻辑结构和特征的描述--数据视图;【应用程序】又称用户视图,一个数据库可以有多个外模式。外模式也称子模式(Subschema)或用户模式,它是数据库用户(包括应用程序员和最终用户)能看见和使用的局部数据的逻辑结构和特征描述,是数据库用户的数据视图,是与某一应用有关的数据逻辑表示。
    • 模式是全体数据的逻辑结构和特征的描述--所有用户的公共视图;【逻辑结构】是数据库中全体数据的逻辑结构和特征的描述,一个数据库只有一个模式。
    • 内模式是数据物理结构和存储方式的描述;【物理结构】也称物理模式或存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据库内部的表示方法。
  24. 数据库三级模式:数据库系统在三级模式之间提供了两级映像【物理独立性和逻辑独立性】
    a) 外模式/模式的映像保证逻辑独立性。
    b) 模式/内模式的映像则保证物理独立性。
  25. 单引号可能会导致sql注入。
  26. 在 GROUP BY 子句中提供 ALL 关键字。
    • 只有在 SELECT 语句还包括 WHERE 子句时,ALL 关键字才有意义。
    • 如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。
  27. 数据库管理技术:(ABDF)
    • A. RDBMS:(Relational Database Management System)关系数据库管理系统;
    • B. NoSQL:非关系型的数据库
    • C. Nginx:是一个高性能的HTTP和反向***web服务器,同时也提供了IMAP/POP3/SMTP服务
    • D. NewSQL:新型关系型数据库
    • E. ActiveMQ:Apache下的一个中间件
    • F. Hbase:是一个分布式的面向列的数据库
    • 关系型数据库:Oracle、MySql、SQLServer、DB2;非关系型数据库:MongoDB、BerkeyDB、Redis、IMS。
  28. 数据独立性最高的是: 关系数据模型【关系数据库系统提供三级模式与二级映像,可以实现数据库的逻辑独立性与物理独立性,因而具有最高的数据独立性。】
  29. 关系完备的系统是指:支持关系数据结构和所有关系代数操作。
  30. sql语句本质上就好比一个java文件,都是要经历先解析编译后,处理优化,最后执行返回结果 的过程
  31. 数据库设计:
    a) 需求分析阶段的任务是在调查、分析的基础上明确用户对系统的需求。
    b) 概念设计阶段的任务是设计概念模型,较著名的是E-R图。
    c) 逻辑设计阶段的任务是把概念模型转化为特定DBMS的逻辑结构(模式和外模式)【E-R图转化为二维表】,进行关系规范化
    d) 物理设计阶段的任务是设计合适的物理(存储)数据库结构。【选择合适的存储结构和存储路径】
  32. 插入失败、插入异常:该插入的没插入;
    a) 删除失败:该删的没删;
    b) 删除异常:不该删的删了,新添加的属性列,一般不允许设置为NOT NULL
  33. E-R图:矩形:实体型;椭圆:实体的属性;菱形:实体型之间的联系
  34. 数据库完整性(Database Integrity)是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。
    a) 在select查询中,select 子句是投影操作,where子句是选择操作,join子句是连接操作。【select a from table1即为查询table1关系上a属性上的投影.】
  35. DBS(数据库系统)包含DB(数据库)和 DBNS(数据库管理系统)
  36. 删除列可以省略column,添加列必须说明数据类型
  37. sql中使用了like,即使创建索引,也不会根据索引查询
  38. 数据库事务:会降低系统的并发能力
  39. 关系模式中:
    a) A->B:当 B属性函数依赖于A属性时,也可以说成A函数确定B。对于A中的每一个属性在B中只有唯一的一个值与之对应,而B中的一个值可与A中的多个值对应,所以A、B之间的联系是从A到B的多对一联系。即一个确定的B可以有多个A,但是一个确定的A只能有一个B。即多对1的关系。
    b) A<->B:1对1的关系。
  40. 关系代数运算中的基本运算包括并(∪)、差(-)、广义笛卡尔积(×)、投影(π)和选择(σ),其他运算的功能都可以由这五种基本运算来实现
  41. Union:ACD
    • A、union只连接结果集完全一样的查询语句
    • B、union可以连接结果集中数据类型个数相同的多个结果集
    • C、 union是筛选关键词,对结果集再进行操作
    • D、任何查询语句都可以用 union来连接
    • 注:使用union组合查询的时候,只能用一个order by,并且只能出现在最后一个select语句后面。
  42. char和varchar的区别:
    • char的长度是不可变的,而varchar的长度是可变的【定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的】
    • char的存取速度还是要比varchar要快得多。【因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。】
    • char的存储,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节。
  43. 建立Statement对象的作用是? ?执行SQL语句
    a) Prepared Statement 对象用于执行预编译SQL语句。
    b) Callable Statement对象用于执行对存储过程的调用。
  44. 数据模型指的是数据库的组织形式,数据模型的三要素:数据结构、数据操作、数据完整性约束
  45. 在数据库系统中,最小的存取单位是记录。
  46. 数据库使用读写分离最主要的目的是():减少X锁与S锁的竞争。
  47. 数据库系统的独立性是指:不会因为系统数据存储结构与数据逻辑结构的变化而影响应用程序
  48. 日志文件是用于记录:对数据的所有更新操作。
  49. 字段就是属性,行是元组,关系模式即是二维表,表格表示实体类型和实体之间的联系。
  50. Explain:查看SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。
    a) Extra出现 using filesort:Mysql需要在执行一次额外的排序使查询结果有序。
    b) Extra出现using index :表示查询所需的信息直接通过索引获取,未读取实际的数据行。【一种是Mysql的聚簇索引(Cluster Index),因为聚簇索引将索引信息和数据信息组织在了一起。另一种是覆盖查询,即查询所需的列已在索引中包含。】
  51. MySQL执行命令delete语句时,如果包括where条件,并不会真正的把数据从表中删除,而是将数据转换成了碎片。
  52. 由于命令optimize会进行锁表操作,所以进行优化时要避开表数据操作时间,避免影响正常业务的进行。
  53. UTF-8编码下一个汉字(包括中文形式下的符号)一般是3个字节,一个英文(包括英文下的符号)1个字节,一个数字1个字节;在GBK和GB2312编码下一个汉字(包括中文形式下的符号)是2个字节,一个英文(包括英文下的符号)1个字节,一个数字1个字节;
  54. UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复。
  55. avg(score)会忽略空值。
  56. 各分 E-R 图之间的冲突主要 有三类,即属性冲突、命名冲突和结构冲突。
    • 属性域冲突:即属性值的类型、取值范围或取值集合不同。
    • 命名冲突:
      i. 同名异义,即不同意义的对象在不同的局部应用中具有相同的名字。
      ii. 异名同义(一义多名),即同一意义的对象在不同的局部应用中具有不同的名字。
    • 结构冲突
      i. 同一对象在不同应用中具有不同的抽象。
      ii. 同一实体在不同子系统的E-R图中所包含的属性个数和属性排列次序不完全相同。
      iii. 实体间的联系在不同的E-R图中为不同的类型。
  57. Mysql每个会话独有的:join buffer、sort buffer、mrr(multi range readerbuffer)
  58. 还原一个数据库:mysql
    a) 备份一个数据库:mysqldump(mysqlbackup)
    b)
    60、 二进制日志bin-log是不能直接cat或more文件查阅日志内容。
  59. 使用SELECT语句随机地从表中挑出指定数量的行,可以使用的方法是
    a) A 在ORDER BY子句中使用RAND()函数,并用LIMIT子句定义行数
  60. innodb存储引擎可以支持全文索引:这句话是错的
    a) .MySQL中的全文索引是FultLeXT类型的索引。
    b) 2).全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建。
  61. mysql中的约束有()BCD
  62. A 检查约束 B 默认约束 C 非空约束 D 唯一约束
  63. MySQL默认隔离级别是:repeatable
  64. 查看mysql当前活跃的并发连接数:Thread_running变量
  65. 表连接算法可能会使用到join buffer:
    a) Block Nested-Loop Join
    b) Batched Key Access
  66. MySQL的哪些操作可能产生磁盘上的临时表
    a) Group by
    b) Distinct
    c) Union
    d) Union all(不需要排序,故不产生)
  67. 即使在两个表没有主外健关系的情况下,我们依然可以使用JOIN语句。
  68. INFORMATION_SCHEMA中包含的信息,一部分和SHOW语句的信息相同
  69. 使用连接JOIN代替子查询Sub-Queries:连接不需要在内存中创建临时表
  70. 使用联合UNION代替手动创建的临时表:联合可在查询会话结束后自动删.
  71. 数据不一致的原因:数据冗余、并发控制不当、故障和错误。
  72. 设计数据库概念结构时常用的数据抽象方法:分类、聚集、概括。
  73. 数据完整性(实体完整性:主键;参照完整性:外键;域完整性;用户自定义完整性):数据库中数据在逻辑上的一致性、正确性、有效性和相容性
    • ①实体完整性约束,指使用主键约束且主键不能为空值
    • ②参照完整性约束,指不允许关系引用不存在的元组,外键要么是实际存在的元组,要么就为空
    • ③用户定义的完整性约束,指在具体应用所涉及的数据必须满足的语义要求
  74. 检查约束:检查输入数值的合法性
  75. 文件后缀
    a) 数据库文件的扩展名为.DBC
    b) 数据表文件的扩展名为.DBF
    c) 表单文件的扩展名为.SCX
    d) 项目文件的扩展名为.PJX
  76. 数据库保护(数据库控制):安全性控制、完整性控制、并发性控制、数据恢复
  77. 命令顺序:select, from, where, group by, having, order by, limit
    a) 执行顺序:from, where, group by, having, select, order by, limit
  78. 本质区别:where子句是把磁盘上的数据筛选到内存上,而having子句是把内存中的数据再次进行筛选.
  79. In 和 or的功能一样,但是in效率高
  80. Update时遇到错误就会停止,可以使用ignore,继续更新。

二、SQL基础-DDL、DML

1. 数据库定义语句(DDL:Data Definition Language):用来创建数据库中的表、索引、视图、存储过程、触发器等,常用的语句关键字有:CREATE,ALTER,DROP,TRUNCATE,COMMENT,RENAME。
 * 创建表:CREATE TABLE 表名
 * 查询表:SHOW 表名
 * 修改表名:ALTER TABLE<旧表名>RENAME[TO]<新表名>;
 * 修改表字段:ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型[属性]
 * 添加字段:ALTER TABLE表名ADD字段名 数据类型 约束
 * 删除表:DROP TABLE [IF EXISTS] 表名
 * 删除表字段:ALTER TABLE 表名 DROP 字段名
 * 增加一列:ALTER TABLE S ADD(CN CHAR(8))
2. 数据操纵语句(DML:Data Manipulation Language),用来查询、添加、更新、删除等,常用的语句关键字有:SELECT,INSERT,UPDATE,DELETE,MERGE,CALL,EXPLAIN PLAN,LOCK TABLE,包括通用性的增删改查。
 * 插入语句:INSERT INTO 表名[字段名] VALUES (值列表)
 * 更新语句:UPDATE 表名 SET 列名=更新值[WHERE 更新条件]
 * 删除行数据语句:DELETE [FROM] 表名[WHERE <删除条件>]
3. 数据控制语句(DCL:Data Control Language)即,用于授权/撤销数据库及其字段的权限,常用的语句关键字有:GRANT,REVOKE。
4. 事务控制语句(TCL:Transaction Control Language),用于控制事务,常用的语句关键字有:COMMIT,ROLLBACK,SAVEPOINT,SET TRANSACTION。
 * savepoint保存点来实现事务的部分回滚
5. limit、offset:
 * 当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量;
 * 当 limit后面跟一个参数的时候,该参数表示要取的数据的数量;
 * 当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 

三、SQL优化

1. 优化
 a)	选取最适用的字段属性:字段尽量设置为not null;设置数值型数据,比文本型快
 b)	使用连接JOIN代替子查询Sub-Queries:连接不需要在内存中创建临时表
 c)	使用联合UNION代替手动创建的临时表:联合可在查询会话结束后自动删除临时表
 d)	事务:保证数据库中数据的一致性和完整性。BEGIN开启;COMMIT结束
 e)	锁定表:维护数据的完整性
 f)	外键:保证数据的关联性
 g)	索引:建立在将用于JOIN、WHERE和ORDER BY的字段上,不要对数据库中某个含有大量重复值的字段建立索引
 h)	优化查询语句:先做选择运算,再进行投影运算

四、Mysql对象-表、视图、函数、数据类型、索引等

  1. 对数据表的操作:

    a) 查看表结构:describe employees(desc employees);desc是缩写,和降序“desc”是一样。
    b) 查询出表的列信息:show columns from employees。【和上面的结果一样】
    c) 查询建表语句:show create table employees;
    d) 查找数据库中所有的数据表:SHOW TABLES,有s。

    1. 视图:【视图一般用于查询select,作为一个select语句存在数据字典中】
    • 创建视图

      i. create [algorithm = undefined | merge | temptable] view 视图名称 [(字段列表)] as sql语句

      ii. 语法解析:

      • 视图名必须唯一,同时不能与表重名.
      • 指定视图执行的算法,通过algorithm指定.
      • merge: 合并算法,将视图的语句和外层的语句合并后再执行.
      • temptable: 临时表算法,将视图执行的结果生成一张临时表,再执行外层语句.
      • undefined: 未定义型,用哪种算法有MySQL决定,默认算法merge.
      • "字段列表"如果存在,数目必须等于select语句检索的列数。
    • 修改视图结构
      alter view 视图名称 [(字段列表)] as sql语句

    • 视图名必须唯一,并且不能与表重名。

    • 一个视图可以对应一个基本表,也可以对应多个基本表。

    • 视图与表的区别

      视图
      不是编译好的sql语句 已经编译好的sql语句
      有实际的物理记录 没有实际的物理记录
    • 在视图上不能完成的操作是:在视图上定义新的表。
      解析:视图是从基本表导出的表,是虚表,数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍然存放在原来的基本表中。

    • 删除一个视图的命令:DROP

    • 视图VIEW是数据库的外模式。

    • 使用视图不可以加快查询语句的执行速度【索引】

    • 视图建立后,在数据字典中存放的是:视图的定义

    • 视图是一种常用的数据对象,它是提供( 查看)和(存放 )数据的另一种途径,可以简化数据库操作

    • 视图是一种查看存储在别处的数据的一种设施,本身不包含数据。【隐含复杂的SQL】

    • 视图不能索引,也不能有关联的触发器或默认值。

    • 更新视图:【更新一个视图将更新其基表】
      i. 先DROP,再CREATE
      ii. 或者直接使用CREATE OR REPLACE VIEW
      iii. 更新限制:如果视图定义中含有以下操作则不能进行更新

      • 分组(group by、having)
      • 联结
      • 自查询
      • 聚集函数(min(),count(),sum())
      • DISTINCT
      • 导出(计算)列
  2. 游标:【是一个存储在mysql服务器上的数据库查询;它不是一条sql语句,而是被该条语句检索出来的结果集;只能用于存储过程和函数】

    1. 声明游标:DECLARE cursor_name CURSOR FOR select_statement。

    2. 给游标赋值:FETCH cur1 INTO flag1;

    3. 游标的使用:
      i. 使用前必须声明(定义)它;
      ii. A.声明后必须打开游标以供使用
      iii. B.结束游标使用时,必须闭游标
      iv. C.使用游标前必须声明它
      v. D.游标只能用于存储过程和函数

    4. 创建游标:
      i. Declare ordernumbers CURSOR【和定义变量一样】
      ii. 打开游标:open ordernumbers,关闭游标:close ordernumbers;

    5. 使用过的游标不需要再次声明,用open打开就行了。

    6. 游标的声明、打开、关闭都是在存储过程中完成。

    7. 使用游标:
      游标打开后使用fetch语句分别访问它的每一行【fetch order into o】

    8. 查询表:Select

      1. SELECT语句的完整语法较复杂,但至少包括的部分是:select,from。
      2. 查询的关键字:
        i. GROUP BY子句用来分组WHERE子句的输出
        ii. WHERE子句用来筛选FROM子句中指定的操作所产生的行。
        iii. 聚合函数需要和group by一起使用
        iv. HAVING子句用来从group by的结果中筛选行
      3. 查询 正在执行的事务:
        i. SELECT * FROM information_schema.INNODB_TRX
      4. 查看正在锁的事务
        i. SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
      5. 可以观察SHOW INNODB STATUS的输出结果来确认未提交事务。
    9. 删除表:

      1. 当你不再需要该表时:drop table tb,无法找回
      2. 当你仍要保留该表,但要删除所有记录时:truncate (table) tb,删除表中所有数据,但不能与where一起使用。
        i. 回滚:truncate删除后不记录mysql日志,因此不可以rollback,更不可以恢复数据;
        ii. truncate 不会触发任何 DELETE触发器;
        iii. truncate 返回的是0或者-1(成功则返回0,失败返回-1);
      3. 当你要删除部分记录或者有可能会后悔的话:delete from tb (where)
        i. 删除表中所有数据:delete from user;
        ii. 删除指定行:delete from user where username ='Tom';
        iii. delete 是可以 rollback ;(原因:truncate 相当于保留原mysql表的结构,重新创建了这个表,所有的状态都相当于新的,而delete的效果相当于一行行删除,所以可以rollback;);
        iv. delete 操作后返回删除的记录数。
      4. truncate 比 delete快,而且 truncate 删除后将重建索引(新插入数据后id从0开始记起),而 delete不会删除索引 (新插入的数据将在删除数据的索引后继续增加)
    10. 索引:【索引对于 增删改操作的性能影响比较大。但是加快查询速度】

      1. 索引的分类【单列索引:全文索引、主键索引、唯一索引、普通索引】
        i. (1)普通索引: 仅加速查询
        ii. (2)唯一索引: 加速查询 + 列值唯一(可以有null)
        iii. (3)主键索引: 加速查询 + 列值唯一(不可以有null)+ 表中只有一个,它 是一种特殊的唯一索引,不允许有空值。
        iv. (4)组合索引: 多列值组成一个索引,专门用于组合搜索,其效率大于索引合并,为了更多的提高mysql效率,遵循”最左前缀“原则。
        v. (5)全文索引: 对文本的内容进行分词,进行搜索 (注意:目前仅有MyISAM引擎支持)

      2. 一个表可以有多个单列索引。

      3. 主键是一种约束,唯一索引是一种索引。唯一索引不一定是主键。

      4. UNIQUE惟一索引的作用是:A.保证各行在该索引上的值都不得重复。

      5. 建表时创建唯一索引:1)设置主键约束;2)Create index。

      6. 创建索引的语句是create index indexname on tablename (username (length))
        i. 其中若是char和varchar类型,length可以小于字段实际长度
        ii. 若是blob或text类型,必须指定length!

      7. 建索引的作用:
        i. 大大加快数据的检索速度,这也是创建索引的最主要的原因;
        ii. 加速表和表之间的连接;
        iii. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;
        iv. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;

      8. 索引的缺点:
        i. 创建索引和维护索引要耗费时间,时间随着数据量的增加而增加
        ii. 索引需要占用物理空间和数据空间
        iii. 表中的数据操作插入、删除、修改, 维护数据速度下降。故不是越多越好。

      9. 覆盖索引:如果我们要查询的东西,能够直接从索引上得到,而不用再去表中取数据,那么这个使用的索引就是覆盖索引。
        i. type中的index,仅仅是说,查询类型index,表示本次查询仅仅扫描索引树,没有其他读取操作。
        ii. Extra中的using index,意思是说,查询使用到了“覆盖索引”。
        iii. 使用like %%的时候,也会遇到即使是%在开头,也会有using index的场景。那也是用到了覆盖索引的思想。

      10. 当用Explain查看SQL的执行计划时,里面有列显示了key_len 的值,根据这个值可以判断索引的长度,在组合索引里面可以更清楚的了解到了哪部分字段使用到了索引。
        k) 普通索引:查找到满足条件的第一个记录(5,500)后,需要查找下一个记录,直到碰到第一个不满足k=5条件的记录。

      11. 唯一索引:由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

      12. 索引是不可更改的,想更改必须删除重新建。

      13. 查看某张表的索引统计信息:show index from

      14. Innodb引擎不会走索引扫描:
        i. 在where子句中使用!=或<>操作符
        ii. 在where子句中对字段进行null值判断
        iii. 不符合索引的最左前缀原则

      15. 在Innodb引擎中,关于唯一索引和普通索引,下列说法正确的是哪三项?
        i. 只有普通索引能够使用change buffer
        ii. 普通索引适合频繁写入,不实时读取的情况
        iii. 对于写完即读的情况,二者没有区别

      16. 避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用。

      17. 如果order by排序利用了索引,那么select中的字段必须出现在所用索引中。

      18. 创建索引

        1. 创建唯一索引:

          create [unique唯一索引][clustered聚集索引] index <索引名>on <表名>(<列名称>[<排序>],<列名称>[<排序>]…);例如:create unique index number on student(seat_number desc);

        2. 创建普通索引

          例如:create index name_class on student(name asc,class desc);

        3. 创建主键索引:
          例如:create table student(id int(10) unsigned not null auto_increment comment 'id主键索引', name char(20) not null default '' comment '名字', class varchar(50) not null default '' comment '班级', seat_number smallint(5) not null default 0 comment '座位编号', primary key (id))engine=InnoDB default charset=utf8 comment='学生表';

      19. 删除索引
        i. drop index <索引名> on 表名;

        例如:drop index number on student;

    11. 主键

      • 主键的建立有( 3 )种方法?
        i. uid INT PRIMARY KEY;
        ii. uid INT,PRIMARY KEY(uid);
        iii. uid INT。ALTER TABLE user ADD PRIMARY KEY(uid);
      • 联合主键的创建方式:PRIMARY KEY(uid,uname)
      • 删除主键约束:ALTER TABLE USER DROP PRIMARY KEY;
      • 主键的作用:
        i. A.主键的值对用户而言是没有什么意义
        ii. B.主键的主要作用是将记录和存放在其他表中的数据进行关联。
        iii. C.一个主键是唯一识别一个表的每一记录
        iv. D.主键是不同表中各记录之间的简单指针
      • 超键(候选键+其他属性)>候选键(主键+其他候选键)>主键
      • 关键码key:数据元素中能起标识作用的数据项
      • 超键Super key:在关系中能唯一标识元素属性的集
      • 候选键Candidate Key:不含有多余属性的超键,候选码中的属性为主属性
      • 主键Primary Key:用户选作元组标识的候选键
      • 外键Foreign Key:某个属性在其他关系中是主键
    12. 触发器

      • 触发器不是响应以下哪一语句而自动执行的Mysql语句:select。
      • 触发器的名字必须是表中唯一,而非数据库中唯一;
      • 只有表支出触发器,视图不支持,临时表也不支持。
      • 每个表每个事件每次只能只允许一个触发器。因此每张表最多支持6个触发器【insert、update、delete的之前和之后】
      • 单一触发器不能与多个事件或多个表关联
      • 触发器不能更新或覆盖【为了修改一个触发器只能删除它,再重建】
      • 触发器中不支持CALL,表示不能从触发器内调用存储过程。
    13. 存储过程:【实际上是一种函数】

      • 存储过程是一组预先定义并(编译)的Transact-SQL语句。
      • 存储过程的执行叫:调用【CALL productpring()】
      • 创建存储过程【create producer ()/ begin/ 一系列的sql操作/ end】
      • 存储过程创建之后被保存在服务器上以供使用,直至被删除。
      • 删除:drop producer Pro,如果不存在就会报错;使用drop producer Pro if exists 不会报错
      • 不能通过一个参数返回多个行和列。
      • Mysql变量都必须以@开始【定义局部变量declare total decimal(8,2)】,形参不用加@。
      • 若要显示执行存储过程后的数据,使用select @money
      • 查看所有的存储过程:show producer status。
      • 查看存储过程的创建等信息:show create producer pro。
    14. 更新update:

      • B.不能在一个子查询中更新一个表,同时从同一个表中选择
      • C.不能把ORDER BY或LIMIT与多表语法的UPDATE语句同时使用
      • D.如果把一列设置为其当前含有的值,则该列不会更新
      • Mysql中被定义为NOT NULL的列可以被更新为NULL
    15. alter:

      • A.alter table user drop column sex;
      • B.alter?table?user?add?sex?varchar(20);
      • C.alter?table?user?drop?sex;
      • D.alter?table?user?modify?id?int?primary?key;
    16. 插入insert:
      a) B.insert?into?表名?values(字段名1对应的值,字段名2对应值);
      b) D.?insert?into?表名(字段名1,字段名2)??values(字段名1对应的值,字段名2对应值);

    17. 范式:
      a) 范式是个递推的约束关系:
      i. 1NF:属性的原子性 【列不可再分】
      ii. 2NF:第二范式(2NF)要求实体的属性完全依赖于主关键字【非主键属性全部依赖于主键属性】
      iii. 3NF:即当2NF消除了非主属性对码的传递函数依赖,则称为3NF 【非主键属性之间无依赖关系】
      a) BCNF:对3NF关系进行投影,将消除原关系中主属性对码的部分与传递依赖,得到一组BCNF关系。【主键属性之间无依赖关系】

    18. Having:
      a) where在分组前过滤,having在分组后过滤,两者之间不冲突。
      b) group by 限定分组条件,即用按照那一列进行分组,相同列值被分为一组。
      c) 没有聚合函数的使用也可以用having过滤。
      d) having子句即可包含聚合函数作用的字段也可包括普通的标量字段
      e) having子句必须于group by 子句同时使用,不能单独使用

    19. 字段修改:alter table 表名 alter column 字段名 set default 默认值;
      a) change 用来修改字段名字以及类型
      b) modify 用来修改字段类型和长度
      c) alter column ... set用来修改字段数据(修改表的数据结构)
      d) update:修改数据内容的。

    20. 表的复制:【select * into book2 from book】
      a) select into from 和 insert into select都是用来复制表
      b) select into from 要求目标表不存在,因为在插入时会自动创建。
      c) insert into select from 要求目标表存在

    21. 键:
      a) 外键:关系与关系间的相关联系就是表和表之间的连接【外键不能夸引擎】
      b) 超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键【(姓名)、(姓名,性别,年龄) 都是唯一 所以都是一个超键】
      c) 候选键(candidate key):不含有多余属性的超键称为候选键【但是只有(姓名)是候选键,因为不能有多余的属性】,候选关键字中的属性称为
      d) 主键(primary key):用户选作元组标识的一个候选键程序主键【主键从候选键中挑中的一个】

    22. 表连接:

      • 内连接:在每个表中找出符合条件的共有记录【用的比较多】
        i. 第一种写法:(只使用where)select t.teacher_name, s.student_name from teacher t,student s where t.id = s.teacher_id;
        ii. 第二种写法:(join .. on.. )select t.teacher_name, s.student_name from teacher t join student s on t.id = s.teacher_id;
        iii. 第三种写法:(inner join .. on.. )select t.teacher_name, s.student_name from teacher t inner join student s on t.id = s.teacher_id;
      • 外连接:外连接有三种方式:左连接,右连接和全连接(mysql不支持全外连接,使用union来联合左右连接)。
      • 左连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,如果找不到与左表匹配的,用null表示。[x left [outer] join y on...
        i. 第一种写法:(left join .. on ..)select t.teacher_name, s.student_name from teacher t left join student s on t.id = s.teacher_id;
        ii. 第二种写法:(left outer join .. on ..)select t.teacher_name, s.student_name from teacher t left outer join student s on t.id = s.teacher_id;
        iii. 第三种写法:"(+)" 所在位置的另一侧为连接的方向select t.teacher_name, s.student_name from teacher t, student s where t.id = s.teacher_id(+);
        iv. 左连接时,如果 left join on的条件在右表中有所重复,那么最终记录数目会大于原表数量
      • 右连接和左连接相反
      • 全连接:返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)
        i. 第一种写法:(full join .. on ..)select t.teacher_name, s.student_name from teacher t full join student s on t.id = s.teacher_id;
        ii. 第二种写法:(full outer join .. on)select t.teacher_name, s.student_name from teacher t full outer join student s on t.id = s.teacher_id;
      • 自连接:自连接,连接的两个表都是同一个表,同样可以由内连接,外连接各种组合方式,按实际应用去组合。
        i. SELECT a., b. FROM table_1 a,table_1 b WHERE a.[name] = b.[name]
      • 交叉连接是两个表数据笛卡尔积(相当于不加连接条件)【交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。】
        i. SELECT S., T. FROM STUDENT S CROSS JOIN TEACHER T ;
        ii. 等价于:SELECT S., T. FROM STUDENT S , TEACHER T ;
      • 自然连接:是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。【不能加限定条件】
        i. SELECT * FROM STUDENT NATURAL JOIN TEACHER;
    23. 函数

      CHAR_LENGTH() 长度计算
      字符串函数
      INSTR() 首次出现位置
      STRCMP() 比较
      CONCAT() 拼接(可多个参数,拼接NULL即为null)
      REVERSE() 翻转
      LEFT() 显示左侧相应个数字符
      RIGHT() 显示右侧相应个数字符
      LOWER() 转小写
      UPPER() 转大写
      LPAD() 左补字符
      RPAD() 右补字符
      SUBSTRING() 截取
      SUBSTRING_INDEX() 从某个位置截断
      TRIM() 字符剔除
      日期时间
      NOW() 当前日期时间
      CURDATE() 当前日期
      CURTIME() 当前时间
      数字运算
      SIGN(-42) 正负
      FLOOR(-1.23) 最近最小数
      CEILING(1.23) 最近最大数
      COUNT([DISTINCT] column_name) 计数
      MIN(column_name) 最小
      MAX(column_name) 最大
      SUM([DISTINCT] column_name) 求和
      AVG([DISTINCT] column_name) 平均
      GROUP_CONCAT([DISTINCT] column_name) 结果集拼接
      • Dayofweek、weekday返回日期对应的星期:
        i. DAYOFWEEK(date)返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六);
        ii. WEEKDAY(date)返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
      • LAST_DAY()函数是取某个月最后一天的日期。
        i. SELECT LAST_DAY('2019-04-01') # 2019-04-30
      • 关于SUM()和SVG()函数的限制是:ABD
        i. 不支持字符类型
        ii. 不支持临时数据
        iii. 不能在同一条SQL语句中出现
        iv. 不能用其他的聚合函数作为参数
      • innodb引擎中,count(),count(1),count(主键),count(列名):
      • count()和count(1)速度相似且最快,count(列名)最慢?
      • AVG() 、COUNT(列名)、sum()、max()、min() 忽略null的行。COUNT()不忽略null的行
      • Distinct 指定列名则不能用于count(),但是可以用于count(列)
    24. 数据类型:

      • 整型:

        image-20201130193048660
      • 字符型:

        image-20201130193109081
      • 日期时间

        image-20201130193120459

五、Mysql存储引擎innodb与MyISAM特性及对比

  1. 执行计划:

    Explain:查看SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。

    • Extra出现 using filesort:Mysql需要在执行一次额外的排序使查询结果有序。

    • Extra出现using index :表示查询所需的信息直接通过索引获取,未读取实际的数据行。【一种是Mysql的聚簇索引(Cluster Index),因为聚簇索引将索引信息和数据信息组织在了一起。另一种是覆盖查询,即查询所需的列已在索引中包含。】

  2. 存储引擎的对比

    image-20201130193432082
  3. 表的行数查询,innodb要全表扫描【count(*)很慢】,mysiam内置计数器,效率高。

  4. Innodb支持行锁和表锁,mysiam只支持表锁。

  5. 对于Delete from table,mysiam会重新建表,而innodb会一行行删除,不会删除表结构。

  6. Mysiam崩溃后无法恢复,而innodb可以完全恢复。

六、Mysql事务

  1. 开启一个事务:A.START TRANSACTION或者begin

  2. 修改事务自动提交 set autocommit = 0 | 1 (0:取消自动提交;1:自动提交

  3. 注意:数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,创建、取消或更改表或存储的子程序的语句。

  4. 事务不能被嵌套。

  5. SET TRANSACTION;用来设置事务的隔离级别

  6. RELEASE SAVEPOINT identifier;删除一个事务的保存点。

  7. 在mysql中,以下哪种方式可以开启一个事务:start transaction和 begin

  8. 不能回退select(回退也是没有意义的),不能回退create和drop操作。可以使用,但是不起作用。

  9. 当执行commit或rollback语句后,事务会自动关闭(将来的更改会隐含提交)

  10. sync_binlog=0和innodb_flush_log_at_trx_commit=0都可以提高事务的执行速度。

  11. 事务隔离级别:
    a) 未提交读(read uncommitted):所有事务都能看到其他未提交事务的结果。脏读、不可重复读、幻读
    b) 提交读(read committed):一个事务只能看到已经提交事务所做的改变。不可重复读、幻读
    c) 可重复读(repeatable read):同一事务的多个实例在并发读取数据时,看到同一数据行【事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。】。MySQL默认事务隔离级别。幻读
    d) 串行读(serializable):最高隔离级别。强制事务排序,数据行上加共享锁。
    i. 幻读【事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读】而【如果事务A 按一定条件搜索, 期间事务B 删除了符合条件的某一条数据,导致事务A 再次读取时数据少了一条。这种情况归为 不可重复读】

  12. 事务日志:
    a) Redo log重做日志,提供前滚操作
    b) Undo log回滚日志,提供回滚操作

七、 Mysql锁

  1. 两段锁协议:

    a. 对任何数据读取、修改之前,事务先获得锁。
    b. 释放一个封锁,事务不再获得其他锁。

  2. 共享锁S锁又称为读锁。

  3. 排它锁X锁又称为写锁。

  4. MDL锁加在数据上而非数据行上

  5. 查看锁信息:show engine innodb status、information_schema.innodb_lock

  6. mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。

  7. mysql临时表是仅对当前用户会话可见的数据库对象,并且一旦会话结束,这些表将自动删除。

  8. 表锁:是MySQL中最基本的锁策略,并且是开销最小的策略。【写锁比读锁有更高的优先级,写锁可以插入到锁队列中读锁的前面,读锁不能插入到写锁的前面。】不会出现死锁。

  9. 行级锁:可以最大程度地支持并发处理(同时也带来了最大的锁开销)。行级锁只在存储引擎层实现,而MySQL服务器层没有实现。行锁是现在索引上,如果不走索引就退化为表锁。

  10. 如果只读考虑使用myisam,又读又写考虑使用innodb。

  11. InnoDB使用不同的锁策略(Locking Strategy)以及MVCC机制来实现不同的隔离级别。

  12. 下面哪些方法可以观察到锁信息
    a) Information_schema.innodb_lock
    b) Show engine innodb status

  13. 死锁的产生:互斥条件、请求与保持条件、不剥夺条件、循环等待条件。

八、Mysql管理-权限、日志、主从等

  1. 数据库并发常见问题:
    i. 丢失更新:一个事务的更新覆盖了另一个事务的更新
    ii. 脏读:一个事务读取了另一个事物未提交的数据
    iii. 不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致
    iv. 幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据

  2. 主从同步:
    i. 设置主从数据库实现读写分离,主数据库负责“写操作”,从数据库负责“读操作”,通过实现数据库的读写分离提高系统的性能。此过程需要解决主从数据库数据同步的问题,在主数据库写入数据后要保证从数据库的数据也要更新。
    ii. 主服务器master激励数据库操作日志到二进制日志binary log,从服务器开启I/O线程将二进制日志记录的操作同步到中继日志relay log(存在从服务器的缓存中),另外sql线程将中继日志relay log记录的操作在从服务器执行。

  3. 日志:记录更新操作

    日志名 作用 适用性
    查询日志general query log 记录每一条sql语句 访问量较大时不建议开启,否则影响服务器性能
    慢查询日志slow queries log 记录运行时间超过long_query_time值的sql语句 作为数据优化可查的分析项
    二进制日志binary log 记录所有更改数据的语句 可用于数据的恢复,且为针对时间点的还原;主从架构、数据备份、数据恢复
    事务日志 1. Redo log重做日志,提供前滚操作 ;2.Undo log回滚日志,提供回滚操作
    错误日志error log 包含启动和关闭的次数;错误、警告和注释的相关诊断信息;自动检查或修复的信息;主从复制架构中从服务器线程时产生的信息;event scheduler运行一个event时产生的日志信息
    中继日志relay log 复制架构中,被服务器用于保存主服务器的二进制日志中读取到的事件
  4. 权限:

    • mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表
    • mysql权限表的验证过程为:
      1. 先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
      2. 通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
    • Procs_priv表:存放存储过程和函数级别的权限
    • Host权限表:配合db权限表对给定主机上数据库级操作权限做更细致的控制,此权限表不受grant和revoke语句的影响
    • Root:MySQL默认管理员,管理数据库
    • 修改用户权限:
      a) 执行Grant,revoke,set password,rename user命令修改权限之后, MySQL会自动将修改后的权限信息同步加载到系统内存中。
      b) 如果执行insert/update/delete操作上述的系统权限表之后,则必须再执行刷新权限命令才能同步到系统内存中。
    • revoke命令收回用户权限;
    • 有两种方式创建MySQL授权用户
      1. 执行create user/grant命令(推荐方式)
      2. 通过insert语句直接操作MySQL系统权限表
    • 分配权限给用户
      1. grant 权限列表 on *|库名 . *|表名 to 用户名[@主机地址] [identified by "用户密码"] [with grant option];
      2. 权限列表: all [privileges]: 表示所有权限; delete:允许使用delete; select:允许使用select; update:允许使用update; insert:允许使用insert 等...
      3. .* :表示所有库的所有表
      4. 库名.表名 :表示某库下面的某表
    • 撤消权限
      1. revoke 权限列表 on *|库名 . *|表名 from 用户名[@主机地址];
      2. revoke all privileges, grant option from 用户名[@主机地址];-- 撤销所有权限
      3. 例如:revoke update on . from 'user_one'@'localhost';
    • 审计:记录所有操作(包括查询)

九、 正则表达式

1. 匹配任意一个字符的符号是:.
2. 零次或一次:?
3. 零次或多次:
4. 正则表达式的转义符是( )A.\\*
5. MySql的like语句中的通配符:百分号、下划线和escape
 a)	%:表示任意个或多个字符。
 b)	_:表示任意单个字符。
 c)	使用escape,转义字符。

十、 补充