数据库是一个按数据结构来存储和管理数据的计算机软件系统。简单来说,数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
SQL 全拼为 Structured Query Language, 即 “结构化查询语言”。
SQL语⾔诞⽣于1974年,是IBM提出的,但是关系型数据库在1970年已经出现,在没有出现SQL语⾔之前当时的查询语⾔依赖于复杂的数学逻辑和符号,查询语⾔成为关系型数据库发展的⼀个主要瓶颈,SQL的出现使没有接受过数学和计算机编程正规训练的用户也能简便的使用。
SQL 是⼀种特殊目的的编程语⾔,是⼀种数据库查询和程序设计语⾔,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本⽂件的扩展名。
数据库:数据库是⼀些关联表的集合。
数据表:表是数据的矩阵。在⼀个数据库中的表看起来像⼀个简单的电子表格。
列:⼀列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
行:⼀行(=元组,或记录)是⼀组相关的数据,例如⼀条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯⼀的。⼀个数据表中只能包含⼀个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为⼀个索引键,⼀般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中⼀列或多列的值进行排序的⼀种结构。类似于书籍的目录。
参照完整性:参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的⼀致性。
sudo apt install -y mysql-server mysql-client
(1)Ubuntu : service mysql start|stop|restart|status
(2)Deepin : systemctl start|stop|restart|status mysqld
(3)CentOS7 : systemctl start|stop|restart|status mysqld
(4)CentOS6 : service mysqld start|stop|restart|status
各个 Linux 系统连接数据库都⼀样
语法: mysql -h localhost -uroot -pxxx -P3306
-h : host(ip地址) localhost = 127.0.0.1
-u : username(用户账户)
-p : password(密码)
-P : port(端口,默认端口3306)
第一次连接数据库时,可以输入:sudo mysql -uroot,直接进入数据库。
备注:第⼀次使用 root 连接后最好添加⼀个新的用户来操作。出于安全考虑,日常开发中最好不要使用 root,后面会介绍怎么创建新用户,并设置密码。
四种方式效果一样:
(1)exit (2)quit (3)\q (4)快捷键:Ctrl + d
如果我们一开始连接数据库时,输入‘sudo mysql -uroot’进不去时,或者在以后长时间不用数据库,忘记密码时,我们可以通过以下的操作进入数据库
(1)打开配置:sudo vim /etc/mysql/my.cnf
(2)可在文件后面添加以下一段:
[mysqld]
skip-grant-tables
如果文件中已存在 [mysqld] , 则直接将 skip-grant-tables 写到其下方即可。
(3)修改完成后,保存退出,重启服务:
8.0之前的版本:sudo systemctl restart mysqld
8.0之后的版本:sudo systemctl restart mysql.service
(1)第⼀阶段为连接验证,主要限制用户连接 mysql-server 时使用的 ip 及 密码
(2)第⼆阶段为操作检查,主要检查用户执行的指令是否被允许,⼀般非管理员账户不被允许执行 drop、delete 等危险操作。
(1)只授予能满足需要的最小权限,防止用户执行危险操作。
(2)限制用户的登录主机,防止不速之客登录数据库。
(3)禁止或删除没有密码的用户。
(4)禁止用户使用弱密码。
(5)定期清理无效的用户,回收权限或者删除用户。
(1)创建账户、权限授予
前面提到过,第⼀次使用 root 连接后最好添加⼀个新的用户来操作,这里会介绍如何创建新用户,并设置密码。
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 '你的密码';"
如果你在创建账户或者修改密码,出现了ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement的错误,不要惊慌,这可能是版本带来的问题,这时只需要再次输入:flush privileges; 来刷新就行了。
(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 ⽤户名@'%';
create database [if not exists] `数据库名` charset=字符编码(utf8mb4);
[if not exists]:此语句可不加,主要为了防止创建的数据库已存在时报错,当数据库存在时,不会创建新的且不会报错。
为了防止自定义的 数据库名、表名、字段名 与关键字相冲突,可以加上反引号
为了防止遇到一些编码问题,库名、表名、字段名不要使用中文
字符集使用 utf8mb4, 默认的utf8字符集并不完整
show databases;
use `数据库的名字`;
#只能修改字符集
alter database `数据库名` charset=字符集;
drop database [if exists] `数据库的名字`;
[if exists]:此语句可不加,主要为了防止删除不存在的数据库时报错。
表是建立在数据库中的数据结构,是⼀类数据的存储集。
create table `表的名字`(字段名 属性...)charset=utf8mb4 engine=innodb;
字符集如果不指定, 默认继承库的字符集.
engine 默认是innodb
选择数据库后,才能查看表
show tables;
desc `表名`;
describe `表名`;
# 修改表的名称
alter table `old_name` rename `new_name`;
# 修改表的引擎
alter table `表名` engine = innodb|myisam;
# 移动表到指定的数据库
alter table `表名` rename to 数据库名.表名;
(1)增加⼀个新的字段
alter table `表名` add `字段名` 数据类型 [属性];
alter table `表名` add `字段名` 数据类型 [属性] first;
alter table `表名` add `字段名` 数据类型 [属性] after `指定字段`;
alter table `表名` modify `字段名` 数据类型 [属性];
alter table `表名` change `原字段名` `新的字段名` 数据类型 [属性];
alter table `表名` change `原字段名` `新的字段名` 数据类型 after `指定字段`;
alter table `表名` drop `字段名`;
(1)先在创建⼀个表,并在表中插⼊⼀些数据
(2)复制表,并且复制数据
create table `复制表的名称` select * from `原表名`;
此种复制方式的特点:
完整的复制⼀个表,既有原表的结构,又有原表的数据
表内字段的属性会丢失,主键的自增等特性不复存在,新插入数据时会有问题
最好不要使用这种方式复制
(3)仅复制表结构, 不复制数据
create table `复制表的名称` like `原表名`;
此种复制方式的特点:
复制后的表结构与原表完全相同,字段的属性与原表也完全⼀致。但是里面没有数据,是⼀张空表。
如果需要,数据可以单独复制:
insert into `复制表的名称` select * from `原表名`;
删除表必须在数据库中进行删除
drop table [if exists] `表名`
对表中数据的操作⼀般分为四类, 常记做 “CURD”:
C: 创建(Create)
U: 更新(Update)
R: 读取(Retrieve)
D: 删除(Delete)
完整的insert语句为:
INSERT INTO `表名` (`字段1`, `字段2`, ...) VALUES (`值1`, `值2`, ...);
其中的INTO在MySQL数据库中可以省略,但在某些数据库中必须要有。
插入一行数据:
insert into `表名` set `字段1`=值1, `字段2`=值2;
插入多行数据,不指定具体字段时,需要将所有字段的值全部写出来:
insert into `表名` values (null, 值1, 值2, ...), (null, 值1, 值2, ...);
插入多行数据,同时指定具体字段,后面的值应该和字段位置一一对应:
insert into `表名` (字段1, 字段2 ...) values (值1, 值2, ...), (值1, 值2, ...);
#通过 * 获取全部字段的数据
select * from `表名`;
#获取指定字段的数据
select `字段1`, `字段2` from `表名`;
修改全表数据:
update `表名` set `字段1`=值, `字段2`=值;
使用 where 修改满足条件的行,where 类似于 if 条件,只执行返回结果为 True 的语句:
update `表名` set `字段1`=值, `字段2`=值 where `字段`=值;
update `表名` set `字段1`=值, `字段2`=值 where `字段`>值;
update `表名` set `字段1`=值, `字段2`=值 where `字段`=值 or `字段`=值;
删除表中的所有数据 (逐行删除):
delete from `表名`;
delete清空表特点:
逐行清空全表
速度相对较慢
清空后,重新插入数据时,ID维持原有计数
清空全表 (⼀次性整表删除):
truncate `表名`;
truncate清空表特点:
一次性清空全表
操作速度非常快
清空后,重新插入数据时,ID 重新从 1 开始计数
删除满足条件的行:
delete from `表名` where `字段` = 值;
delete from `表名` where `字段` in (1, 2, 3, 4);