本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循 署名-非商业用途-保持一致 的创作共用协议.
MySQL是一种关系型数据库( RDBMS
), 数据库可以理解为相关文件的集合. 数据库和控制器数据库的软件称为数据库管理系统( DBMS
)
数据库提供处理数据的方法: SQL
基本概念
- 每个表由多个
行
和 列
组成 - 每行包含一个单独实体的数据, 称为
记录
- 每一列包含与该记录相关的
一项数据
, 称为 属性
安装
本博文中所有的SQL语句遵循 小写书写风格
, 不喜勿喷
初试数据库
创建表
sales_rep为表名, employee_number, surname, first_name, commission为属性, int表示整型, varchar表示变长字符, tinyint表示小整数
删除表和数据库
插入/删除/修改记录
删除记录
修改记录
数据检索
模式匹配
like和%
进行模糊查找
排序
order by
多列排序时, 使用逗号隔开排序规则, order by排序优先次序为从左到右
按照字符串部分子串排序
书中说: 找到字符串末尾(字符串长度)并减2, 则其实诶之就是字符串中倒数第二个字符
但在我测试过程用应该是建1, 则是对最后两个字符排序(疑问?)
根据数据项的键排序
使用case语句
限制数据数量
limit
从表中随机返回n条记录
-
order by
可以接受函数的返回值, 并使用它来改变结果集的顺序
最大值/最小值/计数/平均/综合
去重
改变表结构
添加列
修改列定义
重命名表
删除列
日期函数
高级查找(别名, concat, 多表查询, case表达式)
as起别名(类似pytho中import包时用as起别名)
在别名的时候用别名做限定条件
concat连接列
将多列作为一列进行输出
多表查询
创建两个表并插入数据
case表达式
对select中的列值执行 if-else
操作
查询中分组(不懂)
group by指的是按照某个属性分组, 与其他组互不干扰
常用类型
数字类型
- int(整型), 表示整数
- float/double分别表示单精度和双精度浮点数
字符类型
- char(M) 固定长度为M的字符串, 字符串长度不够会补上空格 ,
搜索时大小写无关
- varchar(M), 可变长字符串(
相比char一般比较节省内存
), 搜索时大小写无关
- text, 最大65535个字符,
搜索时大小写无关
- blob, 最大65535个字符,
搜索时大小写相关
日期和时间类型
- date, 默认格式
YYYY-MM-DD
, 可以使用 date_format()
函数更改输出方式 - timestamp(M), 时间戳,
YYYYMMDDHHMMSS
, 可以指定不同长度的时间戳( M只影响显示
) - time, 格式
HH:MM:SS
表类型
表类型 | 优点 | 缺点 |
静态表 | 速度快, 易缓存 | 要求更多的磁盘空间 |
动态表 | 占磁盘空间小 | 需要维护, 不易出问题后重建 |
压缩表 | 只读表类型, 占用很少磁盘空间 | 每条记录分开压缩, 不能同时访问 |
merge表 | 表尺寸小, 某些情况下速度快 | eq_ref搜索慢, replace不能工作 |
heap表 | 散列索引, 最快 | 数据存在内存, 出现问题易丢失 |
高级SQL
三表连接查找
sales_rep表的employee_number与sales的sales_rep关联
customer表的id和sales的customer相关, 构成了连接条件
-
等值
连接是一种内连接, 通过两个表或者多个表相等条件, 将两个表的行组合到一个表中.( 内连接是连接的原始类型, 返回的每一行都包含来自每个表的数据
)
内连接
左连接
左连接就是返回左边匹配行, 不考虑右边的表是否有相应的行. 返回匹配的全部行的必须是左表, left join关键字之前
union链接
union用来把不同的select结果连接成一个, 每个语句必须有相同个数的列
union可能会进行去重处理, 不去重可以使用union all进行连接
union语句中 order by
是在整个union上进行的, 如果只想在某一个上使用可以请用小括号, union默认不返回重复记录
查询结果添加到另一个表
索引和查询优化
在MySQL中, 有四种类型的索引, 主键, 唯一索引, 全文索引和普通索引
主键(Primary Key)就是值唯一并且没有值为NULL的域的索引
普通索引容许重复的值
全文索引
全文索引的用法
唯一索引除了不容许有重复的记录外, 与普通索引一样
删除或者改变索引
选择索引
- 有查找需要使用索引的时候, 考虑创建索引
- 创建索引返回的行越少越好
- 私用短索引
- 不要创建太多的索引
SQL Cookbook
查找空值
查找空值切记不能用 =
操作, 会返回 Empty Set
空值转换为实际值返回
coalesce()函数有1个或者多个参数, comm非空时返回comm, null时返回0, 也可以用 case语句判断实现
从一个表中查找与其他表不匹配的记录
外连接
插入更新删除
插入技巧
从一个表向另外的表中复制行
解决方案: 在insert语句后面紧跟一个用来产生索要插入行的查询
赋值表定义
只复制已有表的定义, 不复制其中的记录, 创建表的时候, 使用 一个不返回任何行的子查询, where的条件时钟为false
修改技巧
删除技巧
删除所有记录
参考链接
-
<MySQL从入门到精通>(前四章)
-
<SQL Cookbook>(前四章)
MySQL学习笔记4:完整性约束
MySQL入门书籍和方法分享