MySql5.6从零开始学这本书比较基础,也是博主很早以前看过的一本书。《高性能mysql》和《MySQL性能调优与架构设计》则偏向底层原理与实践优化,需要有一定的数据库基础。这几本都是非常经典的数据库方面的书籍。 从本章开始,博主将结合这几本书进行介绍,顺便通过这次整理让自己也回顾一遍数据库与MySql知识。
MySql是由瑞典一家公司MySql AB开发和维护的,后来被Oracle收购。MySql5.6于2013年发布,后来又推出了5.7和8.0版本。
1. 基本介绍
MySql安装这里就不介绍了(MySql5.7免安装版设置参考),安装好之后可以通过可视化工具来对数据库进行相关操作,可视化工具可使用Navicat,SQLyog或者Mysql WorkBench。
1.1 SQL语言
对数据库进行查询和修改操作的语言叫SQL(Structured Query Language),即结构化查询语言。它包含四个部分:
DDL,数据定义语言,如DROP、CREATE、ALTER语句。
DML,数据操作语言,如INSERT、UPDATE、DELETE语句。
DQL,数据查询语言,SELECT语句。
DCL,数据控制语言,如GRANT、REVOKE、COMMIT、ROLLBACK语句。
1.2 存储引擎
MySql中主要使用的存储引擎是InnoDB和MyISAM,从5.5.5版本之后,InnoDB作为默认的存储引擎。
InnoDB支持事务安全,支持外键,支持行级加锁,而这些都是MyISAM不支持的。
1.3 常用的SQL
(1)查看表结构
查看表基本结构:
DESCRIBE/DESC tableName;
查看表详细结构:
SHOW CREATE TABLE tableName;
(2)修改表结构
修改表名:
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
修改字段结构:
ALTER TABLE <表名> MODIFY <字段名> <数据类型> [约束条件]
修改字段名:
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>
添加字段:
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST | AFTER 已存在字段名]
删除字段:
ALTER TABLE <表名> DROP <字段名>
1.4 MySql数据类型
MySql支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型,如下所示:
(1) 数值类型:包括整数类型TINYINT(1字节)、SMALLINT(2字节)、MEDIUMINT(3字节)、INT(4字节)、BIGINT(8字节)。浮点数类型FLOAT和DOUBLE。定点小数类型DECIMAL。
(2) 日期/时间类型:包括YEAR、TIME、DATE、DATETIME、TIMESTAMP。
(3) 字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。
在建表过程中指定整数数据类型时一般后面会有一个数字,这个数字是显示的宽度,与数据类型本身的取值范围是无关的。如INT(11),INT占据四个字节,带符号情况下取值范围是-2147483647~2147483647,11表示显示11位宽度,不足时默认补上空格(也可以指定填充字符)。超过显示宽度时只要不超过允许的取值范围则是正常显示。
DATETIME与TIMESTAMP
对于日期/时间格式,常用的类型是DATETIME和TIMESTAMP。两种类型的显示格式相同,都是YYYY-MM-DD HH:MM:SS。不同点在于对时区的处理,表示的时间范围和占用存储空间上,二者对比如下:
另外注意一点,在5.6之后的版本中datetime类型可以指定默认当前系统时间,并可以在更新时自动设置当前时间。设置方式如下:
CREATE TABLE `example` (
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)
如果不指定的话,则默认为null,而timestamp类型不指定情况下,也会默认使用此种约束条件。
从占用存储空间和时区的国际化处理方面来看,建议优先使用timestamp类型(另外还有种说法,timestamp的索引速度更快)。
浮点数和定点数
浮点数FLOAT和DOUBLE类型容易产生误差,而且在进行数学计算时容易出问题,因此在对精度有要求或者涉及数值比较和计算时,最好使用定点数DECIMAL类型。
字符串类型
字符串类型中常用的VARCHAR,BLOB和TEXT类型都是变长类型。
(1)VARCHAR在声明时必须指定字符串长度(注意是字符长度不是字节长度)。
VARCHAR的存储空间为0-65535个字节,当字符串长度超过255字节时,需要2个字节来存储字符串的实际长度,也就是说,最多只有65533个字节用于存储字符串。在gbk编码下,一个字符最多占2个字节,最大长度不能超过32766个字符。在utf8编码下一个字符最多占3个字节,最大长度不能超过21845个字符。
(2)TEXT和BLOB
TEXT和BLOB都用于存放大容量信息。TEXT存储非二进制字符串,如文章内容、评论等,BLOB存储的是二进制字符串,主要用于存放图片、音频信息等。BLOB列没有字符集, TEXT列有字符集。
1.5 连接查询
连接是关系型数据库模型的主要特点,连接查询是关系数据中的最主要的查询,主要包括内连接、外连接。
内连接查询
在内连接查询中,只有满足条件的记录才能出现在结果关系中。
内连接查询的写法有两种,一种是使用where子句(select … from … where),一种是使用on子句(select … from … inner join … on)。使用where子句定义连接条件比较简单明了,而后一种写法,即INNER JOIN语法是ANSI SQL的标准规范,推荐使用。
如果在一个连接查询中,涉及到的两个逻辑表都是同一个物理表,这种查询称为自连接查询。自连接是一种特殊的内连接。
外连接查询
外连接分为左外连接和右外连接。LEFT JOIN包括左表中的所有记录和右表中符合连接条件的记录。RIGHT JOIN包括右表中的所有记录和左表中符合连接条件的记录。