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、DATETIMETIMESTAMP

(3) 字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOBTEXT、ENUM和SET等。

在建表过程中指定整数数据类型时一般后面会有一个数字,这个数字是显示的宽度,与数据类型本身的取值范围是无关的。如INT(11),INT占据四个字节,带符号情况下取值范围是-2147483647~2147483647,11表示显示11位宽度,不足时默认补上空格(也可以指定填充字符)。超过显示宽度时只要不超过允许的取值范围则是正常显示。

DATETIME与TIMESTAMP

对于日期/时间格式,常用的类型是DATETIME和TIMESTAMP。两种类型的显示格式相同,都是YYYY-MM-DD HH:MM:SS。不同点在于对时区的处理,表示的时间范围和占用存储空间上,二者对比如下:

MYSQL数据库之父 mysql作者是谁_字符串


另外注意一点,在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包括右表中的所有记录和左表中符合连接条件的记录。