一、数据库及其发展

1. 历史

在关系型数据库出现之前,主要是⽹状数据库(Network Databases)和层次数据库

(Hierarchical Databases)。最早出现的是⽹状DBMS,是美国通⽤电⽓公司Bachman

等⼈在1961年开发成功的IDS(Integrated DataStore),⽹状数据库模型对于层次和⾮层

次结构的事物都能⽐较⾃然的模拟,当时⽹状DBMS要⽐层次DBMS⽤得更普遍。在数据库

发展史上,⽹状数据库占有重要地位。

mysql group 最早数据 mysql数据库发展史_mysql group 最早数据


层次型数据库紧随⽹络型数据库出现。最著名最典型的层次数据库系统是IBM公司在1968

年开发的IMS(Information Management System),⼀种适合其主机的层次数据库。这

是IBM公司研制的最早的⼤型数据库系统程序。

mysql group 最早数据 mysql数据库发展史_mysql group 最早数据_02


1970 年,IBM研究员E.F.Codd博⼠在刊物Communication of the ACM上发表了⼀篇名为

“A Relational Modelof Data for Large Shared Data Banks”的论⽂,提出了关系模型的概

念,奠定了关系模型的理论基础。

mysql group 最早数据 mysql数据库发展史_表名_03


1970年关系模型建⽴之后,IBM公司在San Jose实验室增加了更多的研究⼈员研究这个项

⽬,这个项⽬就是著名的System R,⽬标是论证⼀个全功能关系DBMS的可⾏性。(该项

⽬结束于1979年,完成了第⼀个实现SQL的DBMS)。

1973年加州⼤学伯克利分校的Michael Stonebraker 和EugeneWong利⽤System R已发布
的信息开始开发⾃⼰的关系数据库系统Ingres(ORACLE数据库的雏形)。

由于当时IBM实验室的体制(IBM的研究人员大多是学术出身,他们最感兴趣的是理论和学
术成果,⽽⾮推向市场的产品),以及当时IBM对IMS的承诺,IBM并不是第⼀个发布商⽤
关系型数据库的公司。第⼀个商⽤关系型数据库是由霍尼⻙尔公司在1976年发布Multics
Relational Dat a Store(⾮SQL标准语句)。

1978年Ellison在为中央情报局做⼀个数据项⽬时,仔细阅读了codd发表的“R系统:数据库
关系理论”,这个论⽂主要介绍了关系数据库理论和查询语⾔SQL。Ellison看完后,敏锐意
识到在这个研究基础上可以开发商⽤软件系统。⽽当时⼤多数⼈认为关系数据库不会有商
业价值。⽽就在⼏个⽉后,Oracle 1.0诞⽣了,oracle这个名字也来源于他们曾给中央情报
局做过的项⽬名。

直到1985年IBM才发布了关系数据库DB2,那时oracle已经占有了很⼤的市场,Ellision已
经成了千万富翁。1989年,微软发布了SQL Server 1.0版。三⼤商⽤关系型数据库的发布
年份,也正好对应了市场占有率的排名。

2. SQL语言

SQL 全拼为 Structured Query Language, 即 “结构化查询语⾔”。

SQL语⾔诞⽣于1974年,是IBM提出的,但是关系型数据库在1970年已经出现,在没有出
现SQL语⾔之前当时的查询语⾔依赖于复杂的数学逻辑和符号,查询语⾔成为关系型数据
库发展的⼀个主要瓶颈,SQL的出现使没有接受过数学和计算机编程正规训练的⽤户也能
简便的使⽤。

SQL 是⼀种特殊⽬的的编程语⾔,是⼀种数据库查询和程序设计语⾔,⽤于存取数据以及
查询、更新和管理关系数据库系统;同时也是数据库脚本⽂件的扩展名。

3. 关系型数据库

数据库

SQL类型

公司

Oracle

PL/SQL

甲⻣⽂

MySQL

My/SQL

甲⻣⽂

SQL-Server

T-SQL

微软

Access

SQL

微软

SQLite

内嵌型⼩型数据库

移动前端⽤的⽐较多

二、数据库相关术语和概念

  • 数据库: 数据库是⼀些关联表的集合。
  • 数据表: 表是数据的矩阵。在⼀个数据库中的表看起来像⼀个简单的电⼦表格。
  • 列: ⼀列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
  • ⾏: ⼀⾏(=元组,或记录)是⼀组相关的数据,例如⼀条⽤户订阅的数据。
  • 冗余: 存储两倍数据,冗余降低了性能,但提⾼了数据的安全性。
  • 主键: 主键是唯⼀的。⼀个数据表中只能包含⼀个主键。你可以使⽤主键来查询数据。
  • 外键: 外键⽤于关联两个表。
  • 复合键: 复合键(组合键)将多个列作为⼀个索引键,⼀般⽤于复合索引。
  • 索引: 使⽤索引可快速访问数据库表中的特定信息。索引是对数据库表中⼀列或多列的
    值进⾏排序的⼀种结构。类似于书籍的⽬录。
  • 参照完整性: 参照的完整性要求关系中不允许引⽤不存在的实体。与实体完整性是关系
    模型必须满⾜的完整性约束条件,⽬的是保证数据的⼀致性。

mysql group 最早数据 mysql数据库发展史_mysql_04

三、Linux数据库的开启和连接

1. 安装数据库
sudo apt install -y mysql-server mysql-client
2. 开启数据库服务
  • Ubuntu :service mysql start|stop|restart|status
  • Deepin : systemctl start|stop|restart|status mysqld
  • CentOS7 : systemctl start|stop|restart|status mysqld
  • CentOS6 : service mysqld start|stop|restart|status
3. 连接数据库

各个 Linux 系统连接数据库都⼀样
语法:mysql -h localhost -uroot -p123456 -P3306

  • -h : host(ip地址) localhost = 127.0.0.1
  • -u : username(⽤户账户)
  • -p : password(密码)
  • -P : port(端⼝, 默认端⼝3306)
备注

第⼀次使⽤ root 连接后最好添加⼀个新的⽤户来操作。出于安全考虑,⽇常开发中最好不
要使⽤ root

-- 创建新⽤户,并设置密码
-- *.* 代表该⽤户可以操作任何库、任何表
-- 主机名可以使⽤ '%', 代表允许该⽤户从任何机器登陆
GRANT ALL PRIVILEGES on *.* to '⽤户名'@'localhost' IDENTIFIED BY "密
码" WITH GRANT OPTION;
-- 刷新使权限⽣效
flush privileges;
4. 退出数据库

四种⽅式效果⼀样:

  • exit
  • quit
  • \q
  • 快捷键:ctrl + d
5.忘记密码怎么办?
  • 打开配置: vim /etc/mysql/my.cnf
  • 添加这么⼀段:
[mysqld]
skip-grant-tables

如果⽂件中已存在 [mysqld] , 则直接将 skip-grant-tables 写到其下⽅即可。

  • 修改完成后,保存退出,重启服务: sudo systemctl restart mysqld

四、权限管理

1. MySQL 权限的两个阶段
  • 第⼀阶段为连接验证,主要限制⽤户连接 mysql-server 时使⽤的 ip 及 密码
  • 第⼆阶段为操作检查,主要检查⽤户执⾏的指令是否被允许,⼀般⾮管理员账户不被允
    许执⾏ drop、delete 等危险操作
2.权限控制安全准则
  • 只授予能满⾜需要的最⼩权限,防⽌⽤户执⾏危险操作。
  • 限制⽤户的登录主机,防⽌不速之客登录数据库。
  • 禁⽌或删除没有密码的⽤户。
  • 禁⽌⽤户使⽤弱密码。
  • 定期清理⽆效的⽤户,回收权限或者删除⽤户。
3.常用操作
  • 1.创建账户、权限授予
  • 8.0 之前版本
GRANT ALL PRIVILEGES on *.* to '⽤户名'@'主机' IDENTIFIED BY "密
码" WITH GRANT OPTION;
flush privileges; -- 刷新使权限⽣效
  • ALL PRIVILEGES : 授予全部权限, 也可以指定 selectinsert
  • *.* : 允许操作的数据库和表
  • WITH GRANT OPTION : 带有该⼦句说明允许⽤户将⾃⼰拥有的权限授予别⼈
  • 8.0 之后的版本
CREATE USER `⽤户名`@`主机` IDENTIFIED BY '密码'; -- 创建账户
GRANT ALL ON *.* TO `⽤户名`@`主机` WITH GRANT OPTION; -- 授权
  • 2.修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH
mysql_native_password BY '你的密码';"
  • 3.查看权限
show grants; -- 查看当前⽤户的权限
show grants for 'abc'@'localhost'; -- 查看⽤户 abc 的权限
  • 4.回收权限
revoke delete on *.* from 'abc'@'localhost';
  • 5.删除⽤户
use mysql;
select host, user from user;
drop user ⽤户名@'%';

五、数据库的操作

1.创建数据库
create database [if not exists] `数据库名` charset=字符编码(utf8mb4);
  • 如果多次创建会报错
  • 如果不指定字符编码,默认为 utf8mb4 (⼀个汉字占⽤ 4 个字节)
  • 给数据库命名⼀定要习惯性加上反引号, 防⽌和关键字冲突
2. 查看数据库
show databases;
3. 选择数据库
use `数据库的名字`;
4. 创建数据库
create database `数据库名`;
5. 修改数据库
-- 只能修改字符集
alter database `数据库名` charset=字符集;
6. 删除数据库
drop database [if exists] `数据库的名字`;

六、表的操作

表是建⽴在数据库中的数据结构,是⼀类数据的存储集。

1. 表的创建
create table [if not exists] `表的名字`(
	id int not null auto_increment primary key comment '主键',
	account char(255) comment '⽤户名' default 'admin',
	pwd varchar(65535) comment '密码' not null
) engine=myisam charset=utf8mb4;
备注
  • 字符集如果不指定, 默认继承库的字符集.
  • engine 默认innodb
2. 查看所有的表

选择数据库后,才能查看表

show tables;
3.删除表

删除表必须在数据库中进⾏删除

drop table [if exists] `表名`
4. 显示建表结构
desc `表名`;
describe `表名`;
5. 修改表
-- 修改表的名称
alter table `old_name` rename `new_name`;
-- 修改表的引擎
alter table `表名` engine = innodb|myisam;
-- 移动表 到指定的数据库
alter table `表名` rename to 数据库名.表名;
6. 修改字段
-- 增加⼀个新的字段
alter table `表名` add `字段名` 数据类型 [属性];
-- 增加⼀个新的字段, 并放在⾸位
alter table `表名` add `字段名` 数据类型 [属性] first;
-- 增加⼀个新的字段, 并放在某⼀个字段之后
alter table `表名` add `字段名` 数据类型 [属性] after 指定字段;
-- 修改字段的属性
alter table `表名` modify `字段名` 数据类型 [属性];
-- 修改字段的名称
alter table `表名` change `原字段名` `新的字段名` 数据类型 [属性];
-- 修改字段的位置
alter table `表名` change `原字段名` `新的字段名` 数据类型 after `指定字段
`;
-- 删除字段
alter table `表名` drop `字段名`;
7. 复制表
  • 先在创建⼀个表,并在表中插⼊⼀些数据
/* 创建 abc 表*/
create table abc(
	id int primary key auto_increment comment '主键',
	username char(32) not null comment '账户',
	password char(32) not null comment '密码'
) engine=myisam;
/* 插⼊两条数据 */
insert into abc values(null, 'tom', md5(123456)), (null, 'bob',
md5(123456));
  • 复制表,并且复制数据
  • 执行
create table `复制表的名称` select * from `原表名`;
  • 特点:
  • 完整的复制⼀个表,既有原表的结构,⼜有原表的数据
  • 表内字段的属性会丢失,主键的⾃增等特性不复存在,新插⼊数据时会有问题
  • 最好不要使⽤这种⽅式复制
  • 仅复制表结构, 不复制数据
  • 执⾏
create table `复制表的名称` like `原表名`;
  • 特点: 复制后的表结构与原表完全相同,字段的属性与原表也完全⼀致。但是⾥⾯没
    有数据,是⼀张空表
  • 如果需要,数据可以单独复制
insert into `复制表的名称` select * from `原表名`;

七、CURD 语句的基本使用

对表中数据的操作⼀般分为四类, 常记做 “CURD”:

  • C: 创建(Create)
  • U: 更新(Update)
  • R: 读取(Retrieve)
  • D: 删除(Delete)
1. INSERT 插入

完整的 insert 语句为:

INSERT INTO `表名` (`字段1`, `字段2`, ...) VALUES (`值1`, `值2`, ...);

其中的 INTO 在 MySQL 数据库中可以省略, 但在某些数据库中必须要有。

-- ⼀次插⼊⼀⾏
insert into `表名` set `字段`=值, `字段`=值;
-- 按照指定字段, ⼀次插⼊多⾏
insert into `表名` (字段1, 字段2 ...) values (值1, 值2, ...), (值1, 值2,
...);
-- 指定全部字段, ⼀次插⼊多⾏
insert into `表名` values (null, 值1, 值2, ...), (null, 值1, 值2, ...);
2. SELECT (查询)
-- 通过 * 获取全部字段的数据
select * from `表名`;
-- 获取指定字段的数据
select `字段1`, `字段2` from `表名`;
3. UPDATE (更新)
-- 修改全表数据
update `表名` set `字段1`=值, `字段2`=值;
-- 使⽤ where 修改满⾜条件的⾏
-- where 类似于 if 条件, 只执⾏返回结果为 True 的语句
update `表名` set `字段1`=值, `字段2`=值 where `字段`=值;
update `表名` set `字段1`=值, `字段2`=值 where `字段`=值 and `字段`=值;
DELETE (删除)
-- 删除表中的所有数据 (逐⾏删除)
delete from `表名`;
-- 清空全表 (⼀次性整表删除)
truncate `表名`;
-- 使⽤ where 修改满⾜条件的⾏
delete from `表名` where `字段` = 值;
delete from `表名` where `字段` in (1, 2, 3, 4);

八、小总结

  • 数据库
create database `库名`;
create table `表名`;
  • 字段
alter table `表名` add `字段名` 类型 [属性];
  • 数据
insert into `表名`;
  • 数据库
drop database `库名`;
drop table `表名`;
  • 字段
alter table `表名` drop `字段名`;
  • 数据
delete from `表名` where ...;
  • 数据库
alter database `库名` ...;
alter table `表名` ...;
  • 字段
alter table `表名` modify | change ...;
  • 数据
update `表名` set ...;
  • 数据库
show databases [like ...];
show tables [like ...];
  • 字段
desc `表名`;
  • 数据
select * from `表名` where ...;