MySQL必知必会

第1章:了解SQL

  1. 模式(schema):关于数据库和表的布局及特性的信息

2. 主键:一列(或一组列),其值能够唯一区分表中每个行,应保证每个表具有一个主键(难道不是强制要求的么) 4. SQL:结构化查询语言(Structured Qeury Language)

第2章:MySQL简介

MySQL是客户机-服务器形式的,也就是说你总是要通过服务端去操作客户端的东西,即使是在同一台电脑上也是这样,客户机既可以是MySQL提供的客户端,也可以是脚本语言和程序设计语言

第3章:使用MySQL

基本的命令:

(1)USE db;
(2)SHOW DATABASES;
(3)SHOW TABLES;
(4)SHOW COLUMNS FROM tbl; 查看表列,这个可以用来查看表列的所有构建信息,可以替代的语句是 DESCRIBE tbl;
(5)SHOW CREATE DATABASE/TABLE; 查看创建特定表或数据库的MySQL语句
(6)SHOW GRANTS; 显示授权用户的安全权限
(7)SHOW ERRORS/WARNINGS; 用来显示服务器错误或警告消息,不太清楚是怎么用的

第4章:检索数据

SQL语句不区分大小写,忽略空格,其他都是一些简单的查询,没什么好说的

第5章:排序检索数据

略过

第6章:过滤数据

SQL过滤比应用过滤要好

第7章:数据过滤

AND的处理层级高于OR,和大多数其他语言一样,写的时候最好还是加括号比较好,但是也要理解原理

第8章:用通配符进行过滤

  1. 使用通配符需要使用LIKE操作符
  2. %表示任何字符出现任意次数(包括0)
  3. _表示任意字符出现一次
  4. 通配符不要过度使用,因为其效率较低

第9章:用正则表达式进行搜索

  1. 使用REGEXP关键词可以使用正则表达式
  2. 正则表达式与LIKE不同的地方在于后者匹配整列,而前者在列值当中匹配,除非使用^和$定位符
  3. 正则表达式的匹配默认不区分大小写,要想区分需要使用BINARY关键词
  4. 使用 '1000|2000' 这种方式可以匹配两者之一
  5. 使用 '[123]Ton' 可以匹配123三个字符之一
  6. 使用 '[0-9]' 可以匹配一个范围
  7. 匹配特殊字符要使用 ``\``作为前导
  8. 可以使用预定义的字符集进行匹配,比如 [:blank:]
  9. 正则表达式的重复元字符匹配
../_images/WX20170911-140858@2x.png
  1. 可以使用这种方式进行正则表达式检测
../_images/WX20170911-141623@2x.png
  1. 正则表达式对于所有类型的字段都可以使用,并不是非得字符串类型

第10章:创建计算字段

  1. 使用concat()函数可以拼接两个列,注意会按照字面的字符串进行拼接,相当于强制类型转换为str
  2. 拼接出来的字段可以使用别名进行命名
  3. 算数计算只能对数字类型的使用,如果强行使用的话字符串会被当做0来处理

第11章:使用数据处理函数

  1. 函数没有SQL的可移植性强
  2. MySQL中的函数包括几种类型:
(1)文本处理函数
(2)日期和时间处理函数
(3)数值处理函数

第12章:汇总数据

  1. 聚集函数:运行在行组上,计算和返回单个值的函数
  2. AVG:返回平均值
  3. 其他都很清楚了

第13章:分组数据

略过

第14章:使用子查询

  1. 查询:任何SQL语句都是查询,但此术语一般指SELECT语句
  2. 子查询要注意列匹配,一般只返回单个列
  3. 子查询也可以用于计算字段,并不是非要用在where子句当中
  4. 子查询若涉及到外部表必须使用完全限定的列名

第15章:联结表

  1. 为什么要进行分表存储,将关联信息以外键相连?
(1)有些信息对于同属某个类目的记录是相同的,重复浪费时间又浪费空间
(2)如果这些相同的信息需要改变,使用分表存储只需要改变一次
(3)如果有重复数据,很难保证其在修改之后都相同(即无法确保一致性)
  1. 外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系,外键的意义是通过外键约束保证这些引用的值都是合法的(不会存在在对应的表的主键当中不存在的情况)
  2. 联结的点永远是关联字段,相当于是把两张表合并成一张有重复数据的表
  3. 在引用的列可能出现二义性的时候,必须使用完全限定列明
  4. 使用where进行连结表的时候,实际上是将第一个表的每一行与第二个表的每一列进行配对,where子句是作为过滤条件的,由没有连结条件的表返回的结果为笛卡尔积(笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。)
  5. 使用where相当于inner join,ANSI SQL规范要求首先inner join语法(即等值联结/内部联结)

第16章:创建高级联结

外部联结:使用left或者right,能包含前表或后表的所有被用来关联的字段,即使匹配不上(相当于有匹配,那最好,没有匹配的话会给一个NULL作为默认匹配

第17章:组合查询

  1. 有两种需要使用组合查询的基本情况
(1)在单个查询中从不同的表返回类似结构的数据
(2)对单个表执行多个查询,按单个查询返回数据
  1. UNION要求每个查询必须包含相同的列、表达式或聚集函数
  2. 对组合结果进行排序要在最后一条SELECT语句当中

第18章:全文本搜索

  1. InnoDB引擎不支持全文本搜索
  2. 需要在创建表的时候使用FULLTEXT子句启用全文本搜索支持
  3. 使用Match()可以进行全文本搜索
  4. 全文本搜索的好处在于高性能和功能更加强大
  5. 目前不用管这块,还用不到

第19章:插入数据

  1. 插入完整的行:INSERT INTO tbl(...columns) VALUES(...values1),(...values2)
  2. 插入时要省略列必须满足以下条件之一:
(1)该列定义为允许NULL值
(2)在表定义中给出了默认值(自增好像也是可以的)
  1. 是用那个LOW_PRIORITY可以降低INSERT的语句的优先级(因为INSERT常常是耗时操作)
  2. 使用INSERT SELECT可以直接将现有的数据组合从而插入新表

第20章:更新和删除数据

  1. 更新数据:UPDATE tbl SET column = xxx WHERE ...
  2. 更新数据的时候切记不要忽略条件,不然会更新所有行的值
  3. 删除数据:DELETE FROM tbl WHERE ...
  4. 删除也需要带条件

第21章:创建和操纵表

  1. 使用CREATE TABLE tbl (...)创建表
  2. 每个表列要么允许NULL要么不允许,这是在创建表的时候规定的,允许NULL的可以在插入表行的时候不给出该字段的信息(默认为NULL)
  3. 每个表只允许一个AUTO_INCREMENT的列,而且其必须被索引
  4. 可以使用last_insert_id()这个函数来获取最后一个AUTO_INCREMENT的值
  5. 几种不同的引擎:
(1)InnoDB:可靠的事务处理引擎,不支持全文本搜索
(2)MyISAM:性能极高,支持全文本搜索,但不支持事务处理
(3)MEMORY:功能上等同于MyISAM,但数据存储在内存中,速度极快,适合用于临时表
  1. 外键不能跨引擎
  2. 使用ALTER TABLE tbl 可以更新表定义,虽然在理想情况下,表应当被充分设计而非被更新
  3. 最好再更新表的之前做好备份
  4. 使用DROP TABLE tbl可以删除表
  5. 使用RENAME TABLE tbl1 TO tbl2可以重命名表

第22章:使用视图

  1. 视图只包含使用时动态检索数据的查询,并不包含数据
  2. 视图的意义:
(1)重用SQL语句
(2)简化复杂的SQL操作,在编写查询后可以方便重用而不需要知道其实现细节
(3)保护数据,可以给用户授权表的特定部分的访问权限而非整个表
(4)更改数据格式和表示
  1. 由于视图不包含数据,所以在使用复杂视图的时候会有很严重的性能问题
  2. 可以使用CREATE VIEW view AS SELECT ...来创建视图
  3. 更新视图将更新其基表,但很多情况下会无法更新,所以没有太大意义
  4. 使用DROP VIEW view可以删除视图

第23章:存储过程

  1. 存储过程:为以后的使用而保存的一条或多条MySQL语句的集合
  2. 其实就是对一个过程所需要的一系列SQL语句的封装,并抽象出来这么一个过程,对于使用者来说拿来即用即可,就像一个函数一样(听名字就知道了,过程那不就是java当中不返回值的函数么)
  3. 执行存储过程CALL procedure(...)
  4. 创建存储过程
  5. 如果使用mysql的自带客户端,还需要创建分隔符来进行分割,很麻烦
  6. 使用DROP PROCEDURE procedure来删除存储过程
  7. 现在基本用不上,先不管了,了解一个大概就好

第24章:使用游标

  1. 游标是一个存储在Mysql服务器上的数据库查询,是一个结果集
  2. 游标只能用于存储过程,所以现在看没有什么意义

第25章:使用触发器

  1. 存在三种触发器:INSERT、UPDATE和DELETE

第26章:事务处理

  1. 事务处理可以用来维护数据库的完整性,其能保证成批的MySQL操作要么完全执行,要么完全不执行
  2. 事务处理过程当中如果发生错误,那么将进行回滚
  3. 事务:指一组SQL语句
  4. 回滚:指撤销指定SQL语句的过程(不能回滚CREATE和DROP)
  5. 原来SQLAlchemy的原子性操作就是靠事务处理来保证的呀
  6. 可以通过设置保留点来回滚事务至保留点处,否则就会回滚整个事务

第27章:全球化和本地化

  1. 校对:为规定字符如何比较的指令
  2. 使用DEFAUT CHARACTER SET可以为表制定字符集

第28章:安全管理

  1. 实际使用过程当中不要使用root账号
  2. 使用CREATE USER来创建一个新用户账号
  3. 使用GRANT语句可以授予用户权限

第29章:数据库维护

  1. 使用mysqldump可以备份数据
  2. 可以在data目录当中找到mysql的日志

第30章:改善性能

  1. 可以通过建立索引来优化查询速度,但其会损害数据插入、删除和更新的性能,因此最好用于经常需要被查询的数据
  2. LIKE很慢