MySQL数据库管理
安装数据库
上传软件包(mysql-8.0.33-el7-x86_64.tar.gz)
安装过程
tar -xf mysql-8.0.33-el7-x86_64.tar.gz
mv mysql-8.0.33-el7-x86_64 /usr/local/mysql
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
#编辑数据库配置(桌面安装的linux有自带的数据库mariadb,需要删除)
vim /etc/my.cnf
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#设置环境变量,申明/宣告mysql命令便于系统识别
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
#初始化数据库
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
#设置系统识别,进行操作
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
systemctl daemon-reload
systemctl restart mysqld
#查看数据库服务是否开启
ss -ntlp | grep mysql
#初始化数据库密码(直接回车)
mysqladmin -u root -p password "123456"
#进入数据库
mysql -u root -p123456
#创建用户并设置密码
create user 'root'@'%' identified by '123456';
#赋予远程连接的权限
grant all privileges on *.* to 'root'@'%';
#刷新生效
flush privileges;
#修改加密方式,可以进行远程连接
alter user 'root'@'%' identified with mysql_native_password by '123456';
MySQL数据库的管理
查看数据库结构
查看当前的 MySQL 版本信息及连接用户名
select user();
select version();
查看当前服务器中的数据库
show databases;
MySQL会附带4个系统数据库:
information_schema:主要存储系统中的一些数据库对象信息,如数据库名,数据库的表,表字段的数据类型与访问权限等
performance_schema:主要存储数据库服务器性能参数信息
mysql:主要存储系统的用户权限信息
sys:MySQL5.7之后引入的一个新的 sys 数据库,sys 库里面的表、视图、函数以及存储过程可以让用户快速了解MySQL的一些信息,它的数据来源于performance_schema
查看数据库中包含的表
#方法一
show tables from mysql;
#方法二
use mysql;
show tables;
查看表的结构
use mysql;
describe user;
#可缩写成desc 表名;
SQL语句
SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能。
SQL语言分类:DDL、DML、DQL和DCL。
类型 | 功能 |
---|---|
DDL | 数据定义语言,用于创建数据库对象,如库、表、索引等 |
DML | 数据操纵语言,用于对表中的数据进行管理 |
DQL | 数据查询语言,用于从数据表中查找符合条件的数据记录 |
DCL | 数据控制语言,用于设置或者更改数据库用户或角色权限 |
数据定义语言DDL
数据定义语言,用于管理数据库对象(库、表、索引等)
创建数据库和表
create database 数据库名;
create table 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
#主键(PRIMARY KEY)一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
#例
create database test_base;
use test_base;
create table test_table (ID int(4) zerofill,name char(10) not null,age int,sex char(2) default '不详',primary key(ID));
MySQL的6大约束属性
类型 | 名称 |
---|---|
主键约束 | primary key |
唯一键约束 | unique key |
非空约束 | not null |
默认值约束 | default 'XXX' |
自增约束 | auto_increment |
外键约束 | foreign key |
零填充 | int(N) zerofill |
常用的数据类型
名称 | 类型 |
---|---|
int | 整型 无符号[0,2^32 -1] ,有符号[-2^31 ,2^31-1] |
float | 单精度浮点 4字节32位 |
double | 双精度浮点 8字节64位 |
char | 固定长度的字符类型 |
varchar | 可变长度的字符类型 |
text | 文本 |
image | 图片 |
decimal(5,2) | 5个有效长度数字,小数点后面有2位 |
列出数据库和表
#列出数据库
show databases;
#列出数据库中的表
show tables [from 库名];
#显示创建指定表的SQL语句
show create table 表名;
#展现表结构
desc 表名;
#例
show databases;
use test_base;
show tables;
#或
show tables from test_base;
show create table test_table;
desc test_table;
删除数据库和表
#删除数据库
drop database 库名;
#删除表
drop table 表名;
#例
#创建数据库和表
create database test1;
use test1;
create table test2 (id int,name char(4),age int);
#删除
drop table test2;
drop database test1;
修改表
#修改表名
alter table 旧表名 rename 新表名;
#增加表内字段
alter table 表名 add 新字段 数据类型 [约束属性];
#删除表内字段
alter table 表名 drop 字段;
#修改表内字段
alter table 表名 change 旧字段 新字段 数据类型 [约束属性];
#例
use test_base;
alter table test_table rename new_table;
alter table new_table add date int not null;
alter table new_table drop date;
alter table new_table change name 姓名 varchar(10) ;
数据定义语言DDL
数据操纵语言,用于对表中的数据进行管理
在表中插入新记录
#指定字段插入
insert into 表名 (字段1, 字段2, ....) values (字段1的值, 字段2的值, ....);
#不指定字段插入
insert into 表名 values (所有字段的值);
#例
insert into new_table (ID, 姓名,age,sex) values(1,'张三',18,'男');
insert into new_table values(2,'李四',18,'男');
修改表中已存在的记录
#修改表中已存在的记录
update 表名 set 字段1=值1, 字段2=值2, .... where 条件表达式;
#例
update new_table set age=18+2, sex='女' where ID=2;
删除表中记录
#删除表中记录
delete from 表名 where 条件表达式;
#例
delete from new_table where 姓名='李四';
数据查询语言DQL
数据查询语言,用于从数据表中查找符合条件的数据记录。
检索数据
#检索后显示所有字段
select * from 表名 [where 条件表达式];
#检索后显示指定字段
select 字段1,字段2 from 表名 where 条件表达式;
#查看表的前N行的记录
select 字段 from 表名 limit N;
#查看表的第N行之后的连续M行的记录(不包含第N行)
select 字段 from 表名 limit N,M;
#例
#添加几条记录
insert into new_table values(2,'李四',25,'男'),(3,'王二',20,'女'),(4,'韩五',27,'男'),(5,'秋一',22,'女');
select * from new_table where sex='女';
select ID,姓名 from new_table where sex='女';
select * from new_table limit 2;
select 姓名,age from new_table limit 2;
select * from new_table limit 2,5;
select 姓名,age from new_table limit 2,5;
数据控制语言DCL
数据控制语言,用于设置或者更改数据库用户或角色权限。
用户管理
#创建用户
#注:来源地址可以是localhost(仅允许本地连接)、一个特定的IP地址、一个IP地址范围(使用通配符,如%表示任何地址),或者是一个主机名。
create user '用户名'@'来源地址' identified by '密码';
#查看用户信息
#注:authentication_string字段存储的是加密后的密码
select user,host,authentication_string from mysql.user;
#查看当前用户
#返回当前连接的MySQL用户的用户名和主机名
select user();
#重命名用户
rename user '用户名'@'来源地址' to '新用户名'@'新来源地址';
#删除用户
drop user '用户名'@'来源地址';
#修改用户密码
#注MySQL 5.7.6前版本可用set password
set password for '用户名'@'来源地址' = password('密码');
alter user '用户名'@'来源地址' identified by '密码';
#例
create user 'zhangsan'@'localhost' identified by '123zxc';
create user 'lisi'@'%' identified by '123zxc';
select user,host,authentication_string from mysql.user;
select user();
rename user 'zhangsan'@'localhost' to 'zhangmin'@'%';
drop user 'zhangmin'@'%';
alter user 'lisi'@'%' identified by 'def456';
授权管理
#为用户分配特定的权限
#identified by 用于创建用户,在MySQL 5.7.6或更高版本中不可用
grant 权限1,权限2,.... on 库名.表名 to '用户名'@'来源地址' [identified by '密码'];
#重新加载授权表
flush privileges;
#显示指定用户的权限
show grants for '用户名'@'来源地址';
#撤销用户的权限
revoke 权限列表 on 库名.表名 from '用户名'@'来源地址';
#例
#显示指定用户lisi的权限
show grants for 'lisi'@'%';
#为用户lisi分配特定的权限
#为用户lisi授予所有数据库所有表的所有权限
grant all privileges on *.* to 'lisi'@'%';
#重新加载授权表
flush privileges;
#查看用户lisi的权限
show grants for 'lisi'@'%';
#撤销用户lisi的所有权限
revoke all privileges, grant option from 'lisi'@'%';
#为用户lisi分配对数据库test_base里所有表的insert和update权限
grant insert,update on test_base.* to 'lisi'@'%';
#重新加载授权表
flush privileges;
#查看用户lisi的权限
show grants for 'lisi'@'%';
#撤销用户lisi的insert权限
revoke insert on test_base.* from 'lisi'@'%';
用户权限
权限 | 功能 |
---|---|
SELECT | 读取数据。 |
INSERT | 插入数据。 |
UPDATE | 更新数据。 |
DELETE | 删除数据。 |
CREATE | 创建数据库、表等对象。 |
ALTER | 修改数据库、表等对象的结构。 |
DROP | 删除数据库、表等对象。 |
INDEX | 创建或删除索引。 |
USAGE | 表示用户存在,但不授予任何具体权限。 |
GRANT OPTION | 允许用户将自己的权限授予其他用户。 |
RELOAD | 允许用户执行刷新操作,如刷新权限表、日志等。 |
SHOW DATABASES | 允许用户查看所有数据库列表。 |
对于数据库中表的其他操作
克隆表
#克隆表结构
create table 新表名 like 旧表名;
#克隆表数据,可实现表结构和表数据与旧表都一样
insert into 新表名 select * from 旧表名;
#表数据和旧表是一样的,但是新表的表结构和旧表的不一定一样
create table 新表名 (select * from 旧表名);
#例
#克隆表结构
create table new_table1 like new_table;
#查看表结构
desc new_table1;
desc new_table;
#克隆表数据
insert into new_table1 select * from new_table;
#查看表数据
select * from new_table1;
#数据相同,结构不同
create table new_table2 select * from new_table;
#查看表数据
select * from new_table2;
#查看表结构
desc new_table2;
清空表
#一条一条的删除记录,清空表的效率较慢;AUTO_INCREMENT自增字段仍保留原有的记录
delete from 表名;
#直接重建表,清空表的效率较快;AUTO_INCREMENT自增字段的记录会被重置
truncate table 表名;
#例
delete from new_table1;
truncate table new_table2;
临时表
#临时表与一般的表的相同点:都可以在表中进行增删改查表数据;不同的:show tables查不到临时表;临时表只能在当前会话中有效,退出当前会话,临时表就会失效
create temporary table 表名 (....);
#例
create temporary table new_table3 (id int,age int);
#列出数据库中表
show tables;
#列出new_table3表结构
desc new_table3;