下面这些是我看MYSQL必知必会的笔记
- 了解sql
- 数据库基础
- 什么是数据库
- 数据库是保存有组织的数据的一个容器(通常是一个文件或者一组文件)
- 同时另一份容易混淆的概念是数据库管理系统(DBMS),数据库是通过DBMS创建和操纵的容器,我们用DBMS访问数据库
- 表
- 表示某种特定类型数据的结构化清单
- 表示一种结构化的文件
- 表名是用来标识自己的,所以应该唯一
- 模式:关于数据库和表的布局及特性的信息
- 列和数据类型
- 列就是表中的一个字段
- 数据类型就是每个列的数据类型,在优化磁盘的使用方面很重要
- 行
- 行=记录
- 主键
- 主键就是一列或者一组列,它的值可以唯一的区分表中的每一行
- 主键的要求:
- 不重复
- 不能为NULL
- 什么是数据库
- 什么是SQL
- 全称是structured query language 结构化查询语言 专门用来与数据库通信的
- 动手实践
- 小结
- 数据库基础
- MYSQL简介
- 什么是MYSQL MYSQL就是一种DBMS
- 客户机-服务器软件
- DBMS分为两类,基于共享文件系统的DBMS和基于客户机-服务器的DBMS
- 服务器部分就是在服务器上运行的负责所有数据访问和处理的软件,与数据文件打交道的只有服务器软件
- 对于数据的请求来自于运行客户机软件的计算机
- 也没啥,就是普通的服务端和客户端模型
- MYSQL版本
- 客户机-服务器软件
- MYSQL工具
- MYSQL命令行实用程序
- MYSQL Administrator
- MYSQL Query Browser
- 小结
- 什么是MYSQL MYSQL就是一种DBMS
- 使用MYSQL
- 连接
- 选择数据库
- 就是USE
- 了解数据库和表
- 就是SHOW DATABASES 和SHOW TABLES
- SHOW COLUMNS FROM TABLES_NAME 显示表列 就是navicat里的那个设计表
- 上面这个语句有个更快捷的写法DESCRIBE TABLE_NAME
- 其他SHOW语句
- SHOW STATUS
- SHOW CREATE DATABASES和SHOW CREATE TABLE
- SHOW GRANTS
- SHOW ERRORS和SHOW WARNINGS
- 小结
- 检索数据
- SELECT语句
- 检索单个列
- select的顺序可能会不一样是很正常的,这里的顺序没有特殊意义
- 检索多个列
- 逗号
- 检索所有列
- *号
- 最好别总这样,这样会降低检索和应用程序的性能
- 检索不同的行
- 检索出有不同值的列表DISTINCT
- 其实就是要是值一样就滤掉只剩一个
- 而且DISTINCT应用于其后的所有列而不只是第一个比如SELECT DISTINCT ID,NAME FROM TABLE 这里只有ID和NAME两个列完全相等的行才会被滤掉(也就是说很可能总共也滤不了几行了)
- 限制结果
- 就是讲LIMIT的花式用法
- LIMIT 5就是说从第一行开始一直到第5行输出,LIMIT5实际上是指输出不多于5,所以要是总共只有3行那就只输出3行(注意实际上对于计算机来说是输出第0行到第4行总共5行)
- LIMIT 5,5就是说输出5行,是从计算机的第5行输出输出总共最多5行,也就是说输出表中的从1数起的第6 7 8 9 10行
- 因此LIMIT 1,1输出的是表中的第2条记录 毕竟输出第1条记录应该是LIMIT 0,1
- 使用完全限定的表名
- 就是用了.这个东西有点像python用模块和其中的函数时的感觉
- 比如select products.prod_name fom products其实就等价于select prod_name fom products
- 小结
- 排序检索数据
- 排序数据
- 就是ORDER BY,ORDER BY后面接的列名不一定非得是select后面的那个列名
- 按多个列排序
- 指定排序方向
- 默认是升序
- DESC就是降序了
- 要是多个ORDER BY后面的多个列都想进行降序排列的话每个列名后面都得有一个DESC,不然没加的还是升序
- 在字典排序顺序中比如MYSQL,A和a是一样的,然后B就在A后面了
- ORDER BY 必须自FROM后面,LIMIT必须在ORDER BY后面
- 小结
- 排序数据
- 过滤数据
- 使用WHERE子句
- 最简单的相等测试
- ORDER BY得在WHERE后面
- WHERE子句操作符
- 一顿WHERE可以有的操作
- = 等于
- <>和!=一样 不等于
- < <= > >= 这几个就更不用说了
- BETWEEN 在指定的两个值之间
- 检查单个值
- 不匹配检查
- 就是不等于,也没啥
- 何时用引号呢?就是字符串就需要被引号括起来
- 范围值检查
- select * from table where price between 5 AND 10
- 就是用一波BETWEEN
- 空值检查
- IS NULL
- NULL和不匹配是不一样的。。就是比如要找出price!=5的行,那么price是NULL的不会被返回,因为数据库觉得这个NULL是不确定,那我就不能确定我这个price的值到底等不等于5,所以找出price!=5的行不会返回NULL的行
- 一顿WHERE可以有的操作
- 小结
- 使用WHERE子句
- 数据过滤(就是上一章的进阶版)
- 组合WHERE子句
- AND操作符
- OR操作符
- 计算次序
- 这个其实就是说AND的优先级比OR高,所以必要时可以加圆括号()
- 作者也表示可以多用圆括号,比较稳,反正不用白不用
- IN操作
- 可以有这种能操作 where id in (1002,1003) 其实意思和OR是一样的 IN更舒服吧
- NOT操作符
- NOT IN
- 小结
- 组合WHERE子句
- 用通配符进行过滤
- LIKE操作符
- 百分号(%)通配符
- 但是即使是LIKE '%'也不能匹配NULL
- 下划线(_)通配符
- 匹配任意单个字符
- 百分号(%)通配符
- 使用通配符的技巧
- 少用,因为通配符处理花的时间更长
- 把通配符放在开头是最慢的
- 小结
- LIKE操作符
- 用正则表达式进行搜索
- 正则表达式介绍
- 使用MYSQL正则表达式
- 基本字符匹配
- REGEXP 用法和LIKE是一样的
- REGEXP后面的东西在整个字符串中匹配,相当于python中re模块的search
- 进行OR匹配
- 就是'|'的使用
- 匹配几个字符之一
- 就是[]的使用
- 其实[123]Ton和[1|2|3]Ton是一样的,注意这里中括号不能少了,原因就是结合律之类的
- 匹配范围
- 就是'-'的使用,如[123456789]可以写成[1-9]
- 匹配特殊字符
- 就是转义字符嘛
- 要找.的话就写'\\.'
- 匹配字符类
- 就是有一些内置的已经定义好的字符集可以用
- 用的时候外面要多加一层中括号
- 匹配多个实例
- 就是{}啊*啊+啊?啊的一些列使用
- 定位符
- 就是^和$的使用还有[[:<:]]词的开头处和[[:>:]]词的结尾处
- 注意^这个符号,在[]里表示否定,在外面就是开头的意思了
- 基本字符匹配
- 小结
- 创建计算字段
- 计算字段
- 就是说啊,有时候直接存储的数据不是我们需要的,需要进行计算输出,比如表里只存了单价和数量,没有总价,这时总价就得自己算出来啦
- 拼接字段
- Concat() 就是把括号里的东西拼接在一起
- RTrim() 就是去掉右边的所有空格
- 当然自然LTrim()就是去掉左边的咯
- 使用别名
- 用AS
- 执行算数计算
- 这里就是前面提到的计算总价之类的了
- 就支持+-*/
- 小结
- 计算字段
- 使用数据处理函数
- 函数
- 就是内置了很多函数可以用比如前面说到过得RTrim()
- 书上提示了一点说函数的可移植性不行,因为各个DBMS内置的函数还不一样,移植起来很麻烦
- 使用函数
- 处理文本串的函数
- Upper()
- 进行算数操作的数值函数
- 就是一些比如sin() cos() Abs()这些的
- 日期和时间函数
- 数据库里的日期肯定是YYYY-MM-DD
- 讲了很多处理日期的函数
- 返回DBMS正使用的特殊信息的系统函数
- 处理文本串的函数
- 小结
- 函数
- 汇总数据
- 聚集函数
- 想要数据的汇总而不是每一条数据,比如找出表列中的额最大值最小值啊找出这一列的和啊之类的
- 总共有5个聚集函数
- AVG()函数
- 求平均值
- 这个函数只能用于一列
- 算的时候会忽略NULL行
- COUNT()函数
- COUNT(*)对所有的行进行计数,包括NULL的
- COUNT(column)对这一列进行计数,忽略NULL值
- MAX()函数
- 一般用在数值和日期上
- 如果用在文本上就返回最后一行
- MIN()函数
- SUM()函数
- AVG()函数
- 聚集不同值
- 就是DISTINCT的使用
- 组合聚集函数
- 就是多个函数都用起来,没啥
- 小结
- 聚集函数
- 分组数据
- 数据分组
- 创建分组
- 就是用GROUP BY
- 如果入组的列中有NULL,NULL就会被作为一个单独的分组,多个NULL的话,这多个行会被分在一组
- GROUP BY必须在WHERE后,在ORDER BY前面
- 提到了ROLLUP但是没看懂这东西是干嘛的
- 过滤分组
- 用HAVING来过滤分组,HAVING和WHERE其实就很像,反正都是过滤嘛
- 实际上HAVING可以完全代替WHERE
- 分组和排序
- 就是在使用GROUP BY的基础上还使用了ORDER BY
- SELECT子句顺序
- 小结
- 使用子查询
- 子查询
- 就是嵌套的查询SELECT
- 利用子查询进行过滤
- 说这种嵌套的SQL语句是从内向外处理,也就是先处理最里层的括号
- 作为计算字段使用子查询
- 小结
- 子查询
- 联结表
- 联结
- 关系表
- 介绍了外键
- 为何要使用联结
- 解释很清楚了,上面通过外键这种形式把信心分在了多个表上,这样确实节省了空间。但是SELECT查询的时候可就不好查了,这时就要使用联结了啦
- 关系表
- 创建联结
- WHERE子句的重要性
- 提到了联结查询的结果是个笛卡尔积的结果
- 要是没有WHERE纯联结查询的话输出会贼多
- 内部联结
- 像这种等值联结有个更专业的说法是内部联结
- 这种写法就是之久用INNER JOIN。。。ON在FROM里指定这两个表对上的是哪两类,然后比较智能的联结查询,这样就可以省去WHERE感觉比较专业
- 联结多个表
- 上面这不是联结两个表嘛,这里讲的就是联结多个表
- 然后举了个例子,用这种能够联结的方法(就是花式WHERE)也能实现用子查询实现的功能
- WHERE子句的重要性
- 小结
- 吹的很厉害,说联结是SQL中最重要最强大的特性
- 联结
- 创建高级联结
- 组合查询
- 全文本搜索
- 插入数据
- 更新和删除数据
- 创建和操纵表
- 创建表CREATE TABLE
- 表创建基础
- 使用NULL值
- 默认值是NULL
- 主键再介绍
- 用PRIMART KEY ()定义
- 主键不能是NULL
- 使用AUTO_INCREMENT
- 获得最新的自动添加的AUTO_INCREMENT的值用函数last_insert_id()
- 指定默认值
- DEFAULT
- 引擎类型
- 有很多引擎来解释SQL语句
- 更新表
- ALTER TABLE
- 如何添加一列
- 删除一列
- 定义外键
- 删除表
- DROP TABLE table_name
- 重命名表
- RENAME 。。。TO 。。。
- 小结
- 创建表CREATE TABLE
- 使用视图
- 视图
- 为什么使用视图
- 反正就是为了简化操作
- 但是要知道视图只是一种用来查看存在的数据的一种错输,视图本身是不包含数据的,所以每次使用视图时,都需要执行一次查询,性能不行
- 视图的限制和规则
- 为什么使用视图
- 使用视图
- 利用视图简化复杂的联结
- 举了个例子
- 用视图重新格式化检索出的数据
- 就是说用了视图的话这一次检索出的结果就可以当做一个表一样一直用
- 用视图过滤不想要的数据
- 就是创建视图的时候加个WHERE
- 使用视图与计算字段
- 就是创建一个新视图,为什么要用视图呢,因为这个新视图里面是有新的原本表中不存在的列的
- 更新视图
- 对于视图的更新实际上也是对原来的表的更新,因为前面说过了,视图是没有数据的
- 利用视图简化复杂的联结
- 小结
- 视图
- 使用存储过程
- 存储过程
- 就是多条SQL语句的集合,可以认为是批处理文件
- 为什么要适应存储过程
- 使用存储过程
- 执行存储过程
- 就是调用
- 语句是CALL
- 创建存储过程
- 就像定义一个函数一样
- CREATE PROCEDURE NAME()
- 删除存储过程
- DROP PROCEDURE
- 使用参数
- 讲到了变量和参数
- 参数类型有IN OUT INOUT
- OUT就是函数的结果输出赋值给这个参数
- IN相反
- 建立智能存储过程
- 即是说这个存储过程要有用啊有存在的必要啊还是得要一些业务逻辑的,比如加入IF THEN
- 检查存储过程
- SHOW CREATE PROCEDURE STATUS
- 这个语句可以获得这个存储过程的创建详细信息
- 执行存储过程
- 小结
- 存储过程
- 使用坐标
- 游标
- 使用游标
- 创建游标
- 用DECLARE语句创建
- 游标的使用只会出现在函数(存储过程)里
- 关系就是DECLARE CURSOR_NAME CURSOR FOR SELECT语句
- 这就代表了这个游标指向这个SELECT语句的结果集
- 打开和关闭游标
- OPEN
- CLOSE
- 使用游标数据
- 反正就是一直FETCH
- 每FETCH一次就得到前面SELECT结果集中的一行
- 然后就可以用这一行行了
- 创建游标
- 小结
- 使用触发器
- 触发器
- 就是设定一个碰到某个操作就会自动执行的SQL语句
- 比如这删除了某一行它就会自动备份,这就是因为自己设置了相应的触发器
- 支持触发器的sql只有三种
- DELETE
- INSERT
- UPDATE
- 创建触发器
- 语句是CREATE TRIGGER
- CREATE TRIGGER name AFTER sql
- 删除触发器
- 使用触发器
- INSERT触发器
- NEW表可用
- DELETE触发器
- OLD表可用
- 这里为了安全就用BEFORE sql了而不是AFTER
- UPDATE触发器
- 既然是更新那自然就有两个状态了,一个老的一个新的
- 所以有两个可用的虚拟表——OLD和NEW
- 关于触发器的进一步介绍
- INSERT触发器
- 小结
- 触发器
- 管理事务处理
- 事务处理
- 定义。。就是批处理的意思
- 控制事务处理
- 使用ROLLBACK
- 就是执行了这个命令后就会退到事务开始之前
- 使用COMMIT
- 平时写SQL语句都是自动提交(写或保存)的
- 但是在事务处理块中,提交要自己写COMMIT
- 执行完COMMIT或ROLLBACK后事务就算是执行完毕了
- 使用保留点
- 就是ROLLBACK太无脑了只能返回最开始的状态,于是可以设置保留点,就像游戏的存档点一样
- SAVEPOINT point_name设置保留点
- ROLLBACK TO point_name回退到这个保留点
- 更改默认的提交行为
- 这个就是说在事务外的SQL语句都是自动提交的,要是想让它不自动该怎么弄
- 使用ROLLBACK
- 小结
- 事务处理
- 全球化和本地化
- 字符集和校对顺序
- 使用字符集和校对顺序
- 小结
- 安全管理
- 访问控制
- 管理用户
- 创建用户账号
- CREATE USER
- RENAME USER
- 删除用户账号
- DROP USER
- 设置访问权限
- SHOW GRANTS FOR
- GRANT ... ON ... TO ...
- REVOKE撤销刚刚赋予的权限
- 更改口令
- 就是改密码的意思
- 创建用户账号
- 小结
- 数据库维护
- 备份数据
- 进行数据库维护
- 诊断启动问题
- 查看日志文件
- 小结
- 改善性能
- 改善性能
- 遵循硬件建议
- DBMS应该运行在专门的服务器上
- 改配置
- 看看到底是哪个进程拖了后腿
- SQL语句的优化
- 用EXPLAIN
- 一般来说存储过程比一条一条执行要快
- 使用正确的数据类型
- 别一言不合就SELECT *
- 得有索引,总是WHERE\ORDER BY\的列就得有索引
- 要是有很多OR的话就用UNION替代
- 索引改善数据检索的性能,但是会损害数据插入、删除、更新的性能。如果有一张表是用来收集数据的但是不用来搜索,那就可以没索引
- LIKE很慢,能FULLTEXT就不用LIKE
- 小结
- 改善性能
- 附录D MYSQL数据类型
- 串数据类型
- 定长串
- CHAR
- 变长串
- 不允许对变长串所在的列进行索引
- TEXT
- VARCHAR
- 定长串
- 数值数据类型
- 都可以定位有符号或者无符号
- 日期和时间数据类型
- 二进制数据类型
- 可存储任何数据,如图像、多媒体、字处理文档等
- 串数据类型