目录
一、数据库的基础操作
1、数据库的基本查看和切换
1.1 查看数据库信息
show databases; #查看数据库信息
1.2 切换数据库
use 数据库名; #切换至具体的数据库
1.3 查看数据库中的表信息
show tables; #查看当前所处数据库的表信息
show tables in 数据库名; #查看指定数据库的表信息
1.4 查看数据库或数据库中表的结构(字段)
describe(简写:desc) 表名 #查看当前所处数据库的指定表的结构
describe(简写:desc) 数据库.表名 #查看指定数据库中表的结构
describe(简写:desc) 表名\G #查看当前所处数据库的指定表的结构
describe(简写:desc) 数据库.表\G #查看指定数据库中表的结构
1.5 数据类型
MySQL支持多种内置数据类型,分别为数值类型、日期/时间类型、字符串(字符)类型
数据类型参考链接:https://dev.mysql.com/doc/refman/8.0/en/data-types.html
1.5.1 整数型
-
tinyint(m) :1个字节 范围(-128~127) 有一个正或负的表示符
-
smallint(m): 2个字节 范围(-32768~32767)
-
mediumint(m) :3个字节 范围(-8388608~8388607)
-
int(m): 4个字节 范围(-2147483648~2147483647)
-
bigint(m) :8个字节范围(+-9.22*10的18次方)
上述数据类型,如果加修饰符unsigned后,则最大值翻倍
如:tinyint unsigned的取值范围为(0~255)
1.5.2 浮点型(float和double)
- float(m,d) :单精度浮点型 8位精度(4字节) m总个数,d小数位, 注意: 小数点不占用总个数
- double(m,d) :双精度浮点型 m16位精度(8字节) m总个数,d小数位, 注意: 小数点不占用总个数
如:一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.456,但总个数还以实际为准,即6位
1.5.3 定点数
在数据库中存放的是精确值,存为十进制 decimal(5.2) 100.01 - 999.99
格式 decimal(m,d) 表示 最多 m 位数字,其中 d 个小数,小数点不算在长度内,参数m<65 是总个数,d<30且 d<m 是小数位
如: decimal(6,2) 总共能存6位数字,末尾2位是小数,字段最大值 9999.99 (小数点不算在长度内)
1.5.4 字符串
类型 | 大小 | 用途 |
---|---|---|
char | 0-255 bytes | 定长字符串 |
varchar | 0-65535 bytes | 变长字符串 |
tinyblob | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
tinytext | 0-255 bytes | 短文本字符串 |
blob | 0-65 535 bytes | 二进制形式的长文本数据 |
text | 0-65 535 bytes | 长文本数据 |
mediumblob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
mediumtext | 0-16 777 215 bytes | 中等长度文本数据 |
longblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
longtext | 0-4 294 967 295 bytes | 极大文本数据 |
char和varchar的比较:
参考:https://dev.mysql.com/doc/refman/8.0/en/char.html
char | varchar |
---|---|
存储固定长度的字符串 | 存储可变长度的字符串 |
存储时会根据定义的长度固定占用空间,如果存储的字符串长度小于定义的长度,会在后面补空格 | 存储时根据实际数据长度动态分配空间,只占用实际数据长度加上一定的长度描述开销 |
适用于存储长度固定的数据,比如固定长度的代码或者状态 | 适用于存储长度可变的数据,比如变长的描述文本或者用户名 |
如果存储的数据大部分是相同长度的,使用CHAR 可能比较高效 | 如果存储的数据长度变化较大,使用VARCHAR 可以节省空间 |
如:
Value char(4) Storage Required varchar Storage Required '' '' 4 bytes '' 1 byte 'ab' 'ab' 4 bytes 'ab' 3 bytes 'abcd' 'abcd' 4 bytes 'abcd' 5 bytes 'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes
- char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉,所以char类型存储的字符串末尾不能有空格,varchar不限于此
- char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节,所以varchar(4),存入3个字符将占用4个字节
- 如果存入n多个字符数,则char(n)和varchar(n)就会截取前n个
- char类型的字符串检索速度要比varchar类型的快
拓展:varchar(50) 能存放几个 UTF8 编码的汉字?
答:mysql 5.0以上版本 varchar(50) 指的是50字符,无论存放的是数字、字母还是 utf8 编码的汉字,都可以存放50个
1.5.5 日期和时间类型
表示时间值的日期和时间类型为datetime、date、timestamp、time和year
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
year | 1 | 1901/2155 | YYYY | 年份值 |
datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
timestamp | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
1.6 数据类型的修饰符
1.6.1 适用所有类型的修饰符
名称 | 说明 |
---|---|
null | 数据列可包含NULL值,默认值 |
not null | 数据列不允许包含NULL值,*为必填选项 |
default | 默认值 |
primary key | 主键,所有记录中此字段的值不能重复,且不能为NULL |
unique key | 唯一键,所有记录中此字段的值不能重复,但可以为NULL |
character set | name 指定一个字符集 |
1.6.2 适用数值型的修饰符
名称 | 作用 |
---|---|
auto_increment | 自动递增,适用于整数类型 |
unsigned | 无符号 |
2、使用SQL语言管理数据库
2.1 SQL语言的概述
什么是SQL语言:
- Structured Query Language的缩写,即结构化查询语言
- 关系型数据库的标准语言
- 用于维护管理数据库:包括数据查询、数据更新、访问控制、对象管理等功能
SQL中的名词:
- 数据库:database
- 表:table,行:row 列:column
- 索引:index
- 视图:view
- 存储过程:procedure
- 存储函数:function
- 触发器:trigger
- 事件调度器:event scheduler,任务计划
- 用户:user
- 权限:privilege
数据库对象和命名:
- 数据库的组件(对象)
数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等。
- 命名规则
①必须以字母开头,后续可以包括字母,数字和三个特殊字符(# _ $)
②不要使用MySQL的保留字,如 table、select、show、databases。
③数据库名、表名、用户名区分大小
SQL语言规范:
- 在数据库系统中,SQL 语句不区分大小写,建议用大写。
- SQL语句可单行或多行书写,默认以 " ; " 结尾。
- 关键词不能跨多行或简写。
- 用空格和TAB 缩进来提高语句的可读性。
- 子句通常位于独立行,便于编辑,提高可读性。
SQL语言的分类:
- DDL:数据定义语言(Data Definition Language),用于创建数据库对象,如库、表、索引等。
如:create,drop,alter等。
- DML:数据操纵语言(Data Manipulation Language),用于对表中的数据进行管理。
如:select、update、insert、delete 等。
- DQL:数据查询语言( Data Query Languag ),用于从数据表中查找符合条件的数据记录。
如:select
- DCL:数据控制语言(Data Control Language),用于设置或者更改数据库用户或角色权限
如:grant,revoke
- TCL:事务控制语言(Transaction Control Language),用于管理数据库中的事务。 TCL经常被用于快速原型开发、脚本编程、GUI和测试等方面。
如: commit,rollback,savepoint
2.2 管理数据库(DDL)
用于创建数据库对象,如库、表、索引等
2.2.1 创建库或表
#创建新的数据库
create database 数据库名;
#创建数据库中新的表
create table (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键
create database xgy;
show databases;
use xgy;
create table dianzi (id int not null,name char(10) not null,score decimal(4,2),passwd char(50) default'',primary key (id));
create table tongxin (id int not null,name char(10) not null,score decimal(4,2),passwd char(50) default'',primary key (id));
#创建表名为tongxin的表:且第一列为id、数据类型为整型,不能为空;第二列为name、数据类型为固定长度的字符类型为10字节,不能为空;第三列为score、数据类型为指定长度数组、第四列为passwd、数据类型为固定长度的字符类型为50字节,默认可为空;指定主键为id列
show tables;
desc dianzi;
2.2.2 删除库或表
#删除指定的数据库
drop database 数据库名;
#删除当前数据库中的指定表
drop table 表名;
#删除指定的数据库中的表
drop table 数据库名.表名;
2.3 管理表中的数据(DML)
对表中的数据进行管理,用来插入、删除和修改数据库中的数据
2.3.1 表中插入数据
insert into 表名(字段1,字段2[,...]) values (字段1的值,字段2的值,...);
insert into 表名 values (字段1的值,字段2的值,...);
#指定字段插入对应的字段值
insert into dianzi(id,name,score,passwd) values(1,'cxy',88,'123456');
#不指定字段,按创建表时的字段,对应插入字段的值
insert into dianzi values(2,'zly',95,password('654321'));
#其中password指加密显示密码
select * from dianzi; #查询表中所有数据
2.3.2 修改表中的数据
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
#改score值
update dianzi set score=70 where name='cxy';
select * from dianzi;
update dianzi set score=90 where id='1';
select * from dianzi;
#改name值
update dianzi set name='xz' where id='2';
update dianzi set name='wuq' where score='90.00';
select * from dianzi;
2.3.3 删除表中的数据
delete from 表名 where 条件表达式; #删除具体的一条数据
delete from 表名; #删除表里所有的数据,但字段和结构还存在
delete from dianzi where name='xz';
select * from dianzi;
delete from dianzi;
select * from dianzi;
2.4 查询表中的数据(DQL)
SELECT 字段名1,字段名2[,...] FROM 表名[WHERE 条件表达式];
2.4.1 未指定条件查询
select * from 表名[\G] #查询当前所处库中表里的数据
select * from 库名.表名[\G] #查询指定数据库中表里的数据
2.4.2 指定条件查询
select 字段名1,字段名2,…… from 表名 where 条件表达式;
select * from dianzi;
select name,score from dianzi;
select name,score from dianzi where name='cqq';
select score from dianzi where name='cqq';
#行显示
select * from dianzi limit 3;
select * from dianzi limit 3,2;
select id,name from dianzi limit 3;
2.5 修改表名和表结构(DCL)
2.5.1 修改表名
#修改表名
alter table 旧表名 rename 新表名;
2.5.2 修改表结构
(1)扩展表结构(增加字段)
alter table 表名 add 字段名 varchar(50) default '地址不详';
#default '地址不详':表示此字段设置默认值为地址不详,可与NOT NULL配合使用
alter table dianzi add address varchar(50) default '地址不详';
desc dianzi;
select * from dianzi;
update dianzi set address='江苏南京' where id='1';
(2)修改字段(列)名,添加唯一键
alter table 表名 change 旧列名 新列名 数据类型 [unique key];
#unique key:唯一键(特性:唯一,但可以为空,空值只允许出现一次)
#Primary key:唯一且非空(主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。)
alter table dianzi change name mingzi varchar(15) unique key;
insert into dianzi values(4,'zly',55,password('444444'),'浙江杭州');
insert into dianzi values(4,'cqq',55,password('444444'),'浙江杭州');
(3)删除字段
alter table 表名 drop 字段名;
(4)修改字段类型
alter table 表名 modify column 字段名 类型;
#数据库中表字段是varchar(50),修改类型可以用modify(谨慎修改类型,可能会导致原有数据出错)
alter table dianzi modify column mingzi char(20);
desc dianzi\G;
二、数据库的高级操作
1、清空表命令的区别
特性/命令 | drop table 表名 | truncate table 表名 | delete from 表名 |
---|---|---|---|
语言类 | 属于DDL | 属于DDL | 属于DML |
回滚恢复 | 不可回滚(无法恢复) | 不可回滚(无法恢复) | 可回滚(可恢复) |
是否带where | 不可带where | 不可带where | 可带where |
删除情况 | 表内容和结构删除 | 表内容删除(结构保留) | 表结构保留,表内容视where执行情况 |
删除速度 | 删除速度快 | 删除速度快 | 删除速度慢,需要逐行删 |
1.1 drop table 表名
drop table语句用于完全删除表,包括表结构和所有数据。执行drop table将永久删除整个表,需要小心使用,因为数据无法恢复
1.2 truncate table 表名
truncate清空表后,没有返回被删除的条目
truncate table语句用于从表中删除所有行,但保留表的结构。它比delete语句更快,因为它不是逐行删除,而是直接删除整个表的数据,ID会从1开始重新记录
insert into tongxin(name,score,passwd) value('mimi',54,password('123456'));
1.3 delete from 表名
delete清空表后,返回的结果内有删除的记录条目
delete工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用delete from删除
所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录
insert into tongxin(name,score,passwd) value('mimi',54,password('123456'));
2、创建临时表
可以创建临时数据库(Temporary Database)来存储临时数据或执行临时操作。临时数据库是在当前连接会话中创建的数据库,当会话结束时,临时数据库会自动删除,不会保留数据或数据库结构。这对于需要临时存储数据或执行临时操作而不想在数据库中永久保存这些数据时非常有用
create temporary table 表名 (字段1 数据类型,字段2 数据类型[, ...]
create temporary table class (id int(4) zerofill primary key auto_increment,name varchar(15) not null,cardid int(18) not null unique key,work varchar(60));
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
insert into class values(1,'xyh',32011063,'student');
insert into class values(2,'lyq',13425576,'player');
insert into class values(3,'cht',13425576,'cooker');
insert into class values(3,'cht',14257396,'cooker');
insert into class(name,cardid,work) values('whr',87654321,'teacher');
当退出数据库再重新进入,临时数据库会自动删除,不会保留数据或数据库结构
3、克隆表
克隆表是基于现有表结构和数据创建一个全新的表,新表与原表具有相同的结构和数据,但是它们是独立的
方法一:建议迁移数据时使用
create table dianzi2 like dianzi; #复制dianzi表的格式字段
insert into dianzi2 select * from dianzi; #复制dianzi表中的数据内容
方法二:建议备份数据时使用
create table dianzi3 (select * from dianzi); #一条命令实现复制字段和内容,不包括结构
三、数据库用户管理
1、登录用户管理
1.1 新建并查看用户
create user '用户名'@'来源地址' [identified by [password] '密码'];
#说明
#'用户名':指定将创建的用户名
#'来源地址':指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录,可用通配符%
#'密码':若使用明文密码,直接输入'密码',插入到数据库时由Mysql自动加密
若使用加密密码,需要先使用select password('密码');获取密文,再在语句中添password '密文';
若省略“identified by"部分,则用户的密码将为空(不建议使用)
明文密码创建登录用户:
用户信息存放在 mysql
数据库下的 user
表(MySQL 服务下存在一个系统自带的 mysql 数据库)
create user 'dh'@'localhost' identified by '123456';
use mysql;
select * from user\G; #查看登录用户详细信息
加密密码创建登录用户:
select password('123456'); #先获取加密的密码
create user 'xz'@'localhost' identified by password '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
select user,authentication_string,Host from user;
#查看用户信息,创建后的用户保存在mysql数据库的user表里
1.2 修改用户的用户名和密码
1.2.1 修改用户的用户名
rename user 'xz'@'localhost' to 'xxy'@'localhost';
1.2.2 修改用户密码
修改当前用户密码:
set password = password('abc123');
修改指定用户密码:
普通用户只有修改自身密码的权限;root用户是超级管理员,它不仅可以修改自身密码,还能修改其他用户的密码
set password for 'cxy'@'localhost'=password('123456');
1.3 删除用户
drop user 'xxy'@'localhost';
1.4 忘记root密码解决方法
该操作必须是在数据库本机且为root用户,才可进行
(1)修改 /etc/my.cnf 配置文件,添加免密登录mysql,并重启数据库服务
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
skip-grant-tables
#添加,使登录mysql不使用授权表
[root@localhost ~]#systemctl restart mysqld.service
(2)无密码登录之后,修改数据库用户中的 root 密码
update mysql.user set authentication_string = password('123') where user='root';
#用于更新MySQL数据库系统表mysql.user中的用户root的密码。AUTHENTICATION_STRING是MySQL 5.7.0以后版本中用于存储密码的字段名
(3)登录测试新密码
(4)撤销添加的免密码认证设置,重启数据库服务
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
#skip-grant-tables
#撤销添加的免密码认证设置
[root@localhost ~]#systemctl restart mysqld.service
2、登录用户权限管理
2.1 常见的用户权限
权限 | 权限说明 | 权限级别 |
---|---|---|
create | 创建数据库、表或索引的权限 | 数据库、表或索引 |
drop | 删除数据库或表的权限 | 数据库或表 |
grant option | 赋予权限选项 | 数据库或表 |
references | 引用权限 | 数据库或表 |
alter | 更改表的权限 | 数据表 |
delete | 删除表数据的权限 | 数据表 |
index | 操作索引的权限 | 数据表 |
insert | 添加表数据的权限 | 数据表 |
select | 查询表数据的权限 | 数据表 |
update | 更新表数据的权限 | 数据表 |
create view | 创建视图的权限 | 视图 |
show view | 查看视图的权限 | 视图 |
alter routine | 更改存储过程的权限 | 存储过程 |
create routine | 创建存储过程的权限 | 存储过程 |
execute | 执行存储过程权限 | 存储过程 |
file | 服务器主机文件的访问权限 | 文件管理 |
create temporary tables | 创建临时表的权限 | 服务器管理 |
lock tables | 锁表的权限 | 服务器管理 |
create user | 创建用户的权限 | 服务器管理 |
reload | 执行 flush privileges, refresh, reload 等刷新命令的权限 | 服务器管理 |
process | 查看进程的权限 | 服务器管理 |
replication client | 查看主从服务器状态的权限 | 服务器管理 |
relication slave | 主从复制的权限 | 服务器管理 |
show databases | 查看数据库的权限 | 服务器管理 |
shutdown | 关闭数据库的权限 | 服务器管理 |
super | 超级权限 | 服务器管理 |
all [privilege] | 所有权限 | |
usage | 没有任何权限 |
2.2 查看用户已有权限
查看当前用户(自己)的权限:
show grants; #查看当前用户(自己)的权限
查看其他用户的权限:
show grants for '用户名'@'localhost'; #查看其他用户的权限
2.3 授权操作
2.3.1 对不存在的用户进行创建并授权
[NO_AUTO_CREATE_USER
], 即在grant语句中禁止创建空密码的账户,使用grant语法创建用户必须带上 “identified by”关键字设置账户密码,否则就被认为是非法的创建语句
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' identified by '密码';
如:grant all on *.* to 'xz'@'localhost' identified by '123';
#给用户xz授予本地登录的所有操作权限
#说明
#权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔如"select, insert,update"。 使用"all"表示所有权限(实际上部分权限仍无法使用,只包括大部分权限),可授权执行任何操作。
#数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符*。 例如,使用"mysql.*" 表示授权操作的对象为mysql数据库中的所有表。
#'用户名'@'来源地址':用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。 来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址。
#identified by:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略"identified by"部分,则用户的密码将为空。
grant select on xgy.dianzi to 'cxy'@'172.16.12.%' identified by '123456';
use mysql;
select user,authentication_string,Host from user;
show grants for 'cxy'@'172.16.12.%';
mysql服务器本地连接查看:
2.3.2 对存在的用户进行授权
grant all on xgy.dianzi to 'dh'@'localhost';
show grants for 'dh'@'localhost';
登录到被授权的用户进行测试:
update dianzi set score=99 where id='1';
delete from dianzi where id='5';
select * from dianzi;
2.4 撤销用户权限
revoke 权限列表/all on 库名.表名 from '用户名'@'来源地址';
revoke all on xgy.dianzi from 'dh'@'localhost';
登录到用户dh进行测试: