第一章 Mysql入门
1.1 了解数据库
1.1.1什么是数据库?
v MySQL: 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL 是应用软件。
v 数据库:数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加,修改,删除及查询操作。
v 关系型数据库:数据库中的记录是有行有列的数据库就是关系型数据库,与之相反的就是NoSQL数据库了。
v 常见的数据库管理系统
A MYSQL :开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL5.5版本之后都是由Oracle发布的版本。
B Oracle :收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
C SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
D 还有DB2,SyBase,SQLite数据库
1.1.2 Mysql的发展史
l MySQL的历史可以追溯到1979年,一个名为Monty Widenius的程序员在为TcX的小公司打工,并且用BASIC设计了一个报表工具,使其可以在4MHz主频和16KB内存的计算机上运行。当时,这只是一个很底层的且仅面向报表的存储引擎,名叫Unireg。
l 1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。Monty直接借助于mSQL的代码,将它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,决心自己重写一个SQL支持。
l 1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。
l 到了1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版本。一个月后,Linux版本出现了。在接下来的两年里,MySQL被依次移植到各个平台。
l 1999~2000年,MySQL AB公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发出了Berkeley DB引擎, 由于BDB支持事务处理,因此MySQL从此开始支持事务处理了。
l 2000,MySQL不仅公布自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。同年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。
l 2001年,集成Heikki Tuuri的存储引擎InnoDB,这个引擎不仅能持事务处理,并且支持行级锁。后来该引擎被证明是最为成功的MySQL事务存储引擎。MySQL与InnoDB的正式结合版本是4.0
l 2003年12月,MySQL 5.0版本发布,提供了视图、存储过程等功能。
l 2008年1月,MySQL AB公司被Sun公司以10亿美金收购,MySQL数据库进入Sun时代。在Sun时代,Sun公司对其进行了大量的推广、优化、Bug修复等工作。
l 2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系统,同时修复了大量的Bug。
l 2009年4月,Oracle公司以74亿美元收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。
l 2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5不是时隔两年后的一次简单的版本更新,而是加强了MySQL各个方面在企业级的特性。Oracle公司同时也承诺MySQL 5.5和未来版本仍是采用GPL授权的开源产品。
1.1.3 Mysql的安装
- mysql安装与使用
登录
格式1:cmd> mysql –u用户名 –p密码
例如:mysql -uroot –proot
格式2:cmd> mysql --user=用户名 --host=ip地址 --password=密码
1.2 Sql语句
1.2.1 Sql语句介绍
l 什么是SQL?
全称Structured Query Language,简称SQL,中文叫结构化查询语言。
关系数据库语言的国际标准。SQL92、SQL99
不只是mysql还有其他数据库,在SQL92或者SQL99这些国际SQL标准基础之上,它们还扩展了自己的一些SQL语句,比如MySQL中的limit关键字
l SQL分类:
n 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
n 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等
n 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;关键字:grant等
n 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等
1.2.2 子段类型
数字型:int
浮点型:double
字符型:varchar(可变长字符串)
日期类型:date(只有年月日,没有时分秒)
分类 |
类型名称 |
说明 |
|
整数类型 |
tinyInt |
很小的整数 |
|
smallint |
小的整数 |
||
mediumint |
中等大小的整数 |
||
int(integer) |
普通大小的整数 |
||
小数类型 |
float |
单精度浮点数 |
|
double |
双精度浮点数 |
||
decimal(m,d) |
压缩严格的定点数------开发时用 |
||
日期类型 |
year |
YYYY 1901~2155 |
|
time |
HH:MM:SS -838:59:59~838:59:59 |
||
date |
YYYY-MM-DD 1000-01-01~9999-12-3 |
||
datetime-开发用 |
YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59 |
||
timestamp |
YYYY-MM-DD HH:MM:SS 1970~01~01 00:00:01 UTC~2038-01-19 03:14:07UTC |
||
文本、二进制类型 |
CHAR(M) |
M为0~255之间的整数 |
|
VARCHAR(M) |
M为0~65535之间的整数 |
||
TINYBLOB |
允许长度0~255字节 |
||
BLOB |
允许长度0~65535字节 |
||
MEDIUMBLOB |
允许长度0~167772150字节 |
||
LONGBLOB |
允许长度0~4294967295字节 |
||
TINYTEXT |
允许长度0~255字节 |
||
|
TEXT |
允许长度0~65535字节 |
|
MEDIUMTEXT |
允许长度0~167772150字节 |
||
LONGTEXT |
允许长度0~4294967295字节 |
||
VARBINARY(M) |
允许长度0~M个字节的变长字节字符串 |
||
BINARY(M) |
允许长度0~M个字节的定长字节字符串 |
1.2.3创建表
create table 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
单表约束:
* 主键约束:primary key
* 唯一约束:unique
* 非空约束:not null
* 注意:主键约束 = 唯一约束 非空约束
例如:
###创建分类表
CREATE TABLE sort (
sid INT PRIMARY KEY, #分类ID
sname VARCHAR(100) #分类名称
);
1.2.4 查看表
查看数据库中的所有表:show tables;
查看表结构:desc 表名;
1.2.5 删除表
drop table 表名;
1.2.6 修改表
alter table 表名 add 列名 类型(长度) 约束; --修改表添加列.
alter table 表名 modify 列名 类型(长度) 约束; --修改表修改列的类型长度及约束.
alter table 表名 change 旧列名 新列名 类型(长度) 约束; --修改表修改列名.
alter table 表名 drop 列名; --修改表删除列.
rename table 表名 to 新表名; --修改表名
alter table 表名 character set 字符集; --修改表的字符集
1.2.7 插入记录:insert
insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); -- 向表中插入某些列
insert into 表 values (值1,值2,值3..); --向表中插入所有列
insert into 表 (列名1,列名2,列名3..) values select (列名1,列名2,列名3..) from 表
insert into 表 values select * from 表
1.2.8 CMD中文乱码
l 修改my.ini文件,然后重启mysql服务器
1.2.9聚合函数
l 特点:只对单列进行操作
l 常用的聚合函数:
n sum():求某一列的和
n avg():求某一列的平均值
n max():求某一列的最大值
n min():求某一列的最小值
n count():求某一列的元素个数
1.3 表与表之间的关系(表与表之间数据的关系)
1.3.1 外键
主从表的理解
主表是:商品表。主表中,应该有一个字段去关联从表,而这个关联字段就是外键。
从表是:分类表。从表中,应该有一个字段去关联主表,而这个关联字段就是主键。
主键外键的理解
alter table 表名 add [constraint][约束名称] foreign key (主表外键字段) references 从表(从表主键)
1.3.2 一对一关系
案例:(打比方)一个丈夫只能有一个妻子
建表语句
CREATE TABLE wife(
id INT PRIMARY KEY ,
wname VARCHAR(20),
sex CHAR(1)
);
CREATE TABLE husband(
id INT PRIMARY KEY ,
hname VARCHAR(20),
sex CHAR(1)
);
l 一对一关系创建方式1之外键唯一:
n 添加外键列wid,指定该列的约束为唯一(不加唯一约束就是一对多关系)
ALTER TABLE husband ADD wid INT UNIQUE;
n 添加外键约束
alter table husband add foreign key (wid) references wife(id);
1.3.3 一对多关系
案例:一个分类对应多个商品
1.3.4 多对多关系
1.4 多表关联查询
1.4.1 交叉连接
l 隐式交叉连接
SELECT * FROM A, B
l 显式交叉连接
SELECT * FROM A CROSS JOIN B
1.4.2 内连接
l 隐式内连接
SELECT * FROM A,B WHERE A.id = B.id
l 显式内连接
SELECT * FROM A INNER JOIN B ON A.id = B.id
1.4.3 外连接
l 左外连接:LEFT JOIN 或者 LEFT OUTER JOIN
SELECT * FROM A LEFT JOIN B ON A.id = B.id
l 右外连接::RIGHT JOIN 或者 RIGHT OUTER JOIN
SELECT * FROM A RIGHT JOIN B ON A.id = B.id
l 全外连接(MySQL不支持):FULL JOIN 或 FULL OUTER JOIN
SELECT * FROM A FULL JOIN B ON A.id = B.id
1.4.4 分页查询
l 格式:
SELECT * FROM table LIMIT [offset,] rows
1.5 Mysql事务处理
1.5.1事务概述
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
l 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
l 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
l 事务用来管理DML操作,比如 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID):
l Atomicity(原子性)
l Consistency(稳定性)
l Isolation(隔离性)
l Durability(可靠性)
对于ACID的解释如下:
l 原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。
l 稳定性(一致性):数据库在事务执行前后状态都必须是稳定的。
l 隔离性:事务之间不会相互影响。
l 可靠性(持久性):事务执行成功后必须全部写入磁盘。
1.5.2MySQL事务支持
常见的操作有一下三个:
l BEGIN或START TRANSACTION;显式地开启一个事务;
l COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
l ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
第二章 进一步了解Mysql
2.1 mysql 架构
逻辑架构图1
逻辑架构图2
执行流程图
2.1.1 存储引擎介绍
* 多存储引擎是mysql有别于其他数据库的一大特性;
* 存储引擎是针对表的
* MySQL 5.5之后,默认的存储引擎由MyISAM变为InnoDB。
* 查看存储引擎:show engines;
|
Innodb |
Myisam |
存储文件 |
.frm 表定义文件 .ibd 数据文件 |
.frm 表定义文件 .myd 数据文件 .myi 索引文件 |
锁 |
表锁、行锁 |
表锁 |
事务 |
ACID |
不支持 |
CRDU |
读、写 |
读多 |
count |
扫表 |
专门存储的地方 |
索引结构 |
B Tree |
B Tree |
|
|
|
2.1.2 MySQL物理结构
MySQL是通过文件系统对数据进行存储和管理的。
MySQL从物理结构上可以分为日志文件和数据文件。
MySQL通过日志记录了数据库操作信息和错误信息。常用的日志文件包括错误日志、二进制日志、查询日志、慢查询日志和 InnoDB 引擎在线 Redo 日志、中继日志等。
l 错误日志(err log):
* 默认是开启的,而且从5.5.7以后无法关闭错误日志
* 记录了运行过程中遇到的所有严重的错误信息,以及 MySQL每次启动和关闭的详细信息。
* 默认的错误日志名称:hostname.err
* 错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。
* log_error可以直接定义为文件路径,也可以为ON|OFF;log_warings只能使用1|0来定义开关启动
2.1.3数据文件
查看MySQL数据文件:SHOW VARIABLES LIKE ‘