一、数据库及其发展
1. 历史
在关系型数据库出现之前,主要是⽹状数据库(Network Databases)和层次数据库
(Hierarchical Databases)。最早出现的是⽹状DBMS,是美国通⽤电⽓公司Bachman
等⼈在1961年开发成功的IDS(Integrated DataStore),⽹状数据库模型对于层次和⾮层
次结构的事物都能⽐较⾃然的模拟,当时⽹状DBMS要⽐层次DBMS⽤得更普遍。在数据库
发展史上,⽹状数据库占有重要地位。
层次型数据库紧随⽹络型数据库出现。最著名最典型的层次数据库系统是IBM公司在1968
年开发的IMS(Information Management System),⼀种适合其主机的层次数据库。这
是IBM公司研制的最早的⼤型数据库系统程序。
1970 年,IBM研究员E.F.Codd博⼠在刊物Communication of the ACM上发表了⼀篇名为
“A Relational Modelof Data for Large Shared Data Banks”的论⽂,提出了关系模型的概
念,奠定了关系模型的理论基础。
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 | 内嵌型⼩型数据库 | 移动前端⽤的⽐较多 |
二、数据库相关术语和概念
- 数据库: 数据库是⼀些关联表的集合。
- 数据表: 表是数据的矩阵。在⼀个数据库中的表看起来像⼀个简单的电⼦表格。
- 列: ⼀列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- ⾏: ⼀⾏(=元组,或记录)是⼀组相关的数据,例如⼀条⽤户订阅的数据。
- 冗余: 存储两倍数据,冗余降低了性能,但提⾼了数据的安全性。
- 主键: 主键是唯⼀的。⼀个数据表中只能包含⼀个主键。你可以使⽤主键来查询数据。
- 外键: 外键⽤于关联两个表。
- 复合键: 复合键(组合键)将多个列作为⼀个索引键,⼀般⽤于复合索引。
- 索引: 使⽤索引可快速访问数据库表中的特定信息。索引是对数据库表中⼀列或多列的
值进⾏排序的⼀种结构。类似于书籍的⽬录。 - 参照完整性: 参照的完整性要求关系中不允许引⽤不存在的实体。与实体完整性是关系
模型必须满⾜的完整性约束条件,⽬的是保证数据的⼀致性。
三、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
: 授予全部权限, 也可以指定select
、insert
等 -
*.*
: 允许操作的数据库和表 -
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 ...;