zoukankan      html  css  js  c++  java
  • 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,转义字符。
    

    十、 补充

  • 相关阅读:
    golang json处理
    关于单例模式中懒汉模式和饿汉模式的学习
    关于Lambda表达式的研究
    左值和右值得研究
    关于epoll的详解说明关于epoll的详解说明
    关于c++中条件变量的分析
    关于c++种std::function和bind的用法
    关于iterator_traits的使用
    STL容器之deque数据结构解析
    STL容器之Array的用法
  • 原文地址:https://www.cnblogs.com/mengxiangtiankongfenwailan/p/14059047.html
Copyright © 2011-2022 走看看