MySQL数据库管理

1、使用 MySQL 数据库

查看当前服务器中的数据库

SHOW DATABASES 语句:用于查看当前 MySQL 服务器中包含的数据库,MySQL 的每一条操作语句都是以分号(;)结束的。

经初始化后的 MySQL 服务器 , 默认建立了四个数据库: test 、 mysql 、 information_schema 和 performance_schema(其中 mysql 是 MySQL 服务正常运行所需的数据库,其中包含了用户认证相关的表),执行以下操作可以进行查看。

cpp 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql>

查看当前数据库中有哪些表

cpp 复制代码
mysql> use mysql;
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| ......//省略部分内容                     |
| user                      |
+---------------------------+
31 rows in set (0.00 sec)

mysql> 

查看表的结构

cpp 复制代码
mysql> use mysql;
Database changed
mysql> describe user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
|......//省略部分内容
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.00 sec)

mysql> 

SQL 语言主要由以下几部分组成。

  • DDL(Data Definition Language,数据定义语言):用来建立数据库、数据库对象和 定义字段,如 CREATE、ALTER、DROP。
  • DML(Data Manipulation Language,数据操纵语言):用来插入、删除和修改数据库 中的数据,如 INSERT、UPDATE、DELETE。
  • DQL(Data Query Language,数据查询语言):用来查询数据库中的数据,如 SELECT。
  • DCL(Data Control Language,数据控制语言):用来控制数据库组件的存取许可、 存取权限等,如 COMMIT、ROLLBACK、GRANT、REVOKE。

2、创建及删除数据库和表

创建新的数据库

CREATE DATABASE 语句:用于创建一个新的数据库,需指定数据库名称作为参数。 例如,执行以下操作可以创建一个名为 auth 的数据库。

cpp 复制代码
mysql> create database auth;
Query OK, 1 row affected (0.00 sec)

mysql>

刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data 目录下会自动生成一个与新建的数据库名相同的文件夹。

创建新的表

CREATE TABLE 语句:用于在当前数据库中创建新的表,需指定数据表名称作为参数,并定义该表格所使用的各字段,基本格式如下所示。

CREATE TABLE 表名 (字段 1 名称类型, 字段 2 名称类型, ..., PRIMARY KEY(主键名))

bash 复制代码
mysql> use auth;
Database changed
mysql> create table users (user_name char(16) not null, user_password char(48) default'',primary key(user_name));
Query OK, 0 rows affected (0.02 sec)

mysql> 

删除一个数据表

DROP TABLE 语句:用于删除数据库中的表,需要指定"数据库名.表名"作为参数;若只指定表名参数,则需先通过执行"USE"语句切换到目标数据库。例如,执行以下操作可以 删除 auth 数据库中的 users 表。

bash 复制代码
mysql> drop table auth.users;
Query OK, 0 rows affected (0.02 sec)

mysql>

删除一个数据库

DROP DATABASE 语句:用于删除指定的数据库,需要指定数据库名作为参数。例如, 执行以下操作可以删除名为 auth 的数据库。

bash 复制代码
mysql> drop database auth;
Query OK, 0 rows affected (0.00 sec)

mysql>

3、管理表中的数据记录

插入数据记录

INSERT INTO 语句:用于向表中插入新的数据记录,语句格式如下所示。

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

执行以下操作将会向 auth 数据库中的 users 表插入一条记录:用户名为"zhangsan", 对应的密码为"123456"。需注意的是,VALUES 部分的值应与前面指定的各字段逐一对应。

bash 复制代码
mysql> use auth;
Database changed
mysql> insert into users(user_name,user_password) values ('zhangsan',password('123456'));
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql>

在插入新的数据记录时,如果这条记录完整包括表中所有字段的值,则插入语句中指定 字段的部分可以省略。例如,执行以下操作也可以向 auth 数据库中的 user 表插入一条新的 记录:用户名为"lisi",对应的密码为"654321"。

bash 复制代码
mysql> insert into users values('lisi',password('654321'));
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql>

查询数据记录

SELECT 语句:用于从指定的表中查找符合条件的数据记录。MySQL 数据库支持标准的 SQL 查询语句,语句格式如下所示。

SELECT 字段名 1,字段名 2,... FROM 表名 WHERE 条件表达式。

表示所有字段时,可以使用通配符"*",若要显示所有的数据记录,则可以省略 WHERE 条件子句。例如,执行以下操作可以查看 auth 数据库中 users 表内的所有数据记录,其中由于密码字串已加密,因此不会直接显示出实际的密码内容。

bash 复制代码
mysql> select*from auth.users;
+-----------+-------------------------------------------+
| user_name | user_password                             |
+-----------+-------------------------------------------+
| lisi      | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> 

当需要根据特定的条件查找记录时,WHERE 条件子句是必不可少的。例如,若要查找users 表中用户名为"zhangsan"的记录,显示其中用户名、密码字段的信息,可以执行以下操作。

bash 复制代码
mysql> select user_name,user_password from auth.users where user_name='zhangsan';
+-----------+-------------------------------------------+
| user_name | user_password                             |
+-----------+-------------------------------------------+
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> 

修改数据记录

UPDATE 语句:用于修改、更新表中的数据记录。语句格式如下所示。

UPDATE 表名 SET 字段名 1=字段值 1[,字段名 2=字段值 2] WHERE

执行以下操作可以修改 users 表中用户名为"lisi"的记录,将密码字串设为空值。验证记录内容可以发现 lisi 用户的密码串值已变为空白。

bash 复制代码
mysql> update auth.users set user_password=password('') where user_name='lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from auth.users;
+-----------+-------------------------------------------+
| user_name | user_password                             |
+-----------+-------------------------------------------+
| lisi      |                                           |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql>

在 MySQL 数据库服务器中,用于访问数据库的各种用户(如 root)信息都保存在 mysql 数据库的 user 表中,管理员可以直接修改其中的数据记录来完成密码修改或权限赋予,但值得注意的是,应当尽量减少人工操作,避免由于操作失误导致数据库无法访问或连接不到 数据库等问题。通常都是给对应业务最小权限,某业务用户只负责查询,则只需要给赋予 SELECT 权限即可。例如,以下操作可以将数据库用户 root 的密码设为"123457",当再次 使用"mysql -u root -p"访问 MySQL 数据库服务器时,必须使用此密码进行验证。

bash 复制代码
mysql> update mysql.user set authentication_string=password('123457') where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> flush privileges;  //刷新用户授权信息
Query OK, 0 rows affected (0.00 sec)

mysql> 

若是在 Linux 命令行环境中执行,还可以使用 mysqladmin 工具来设置密码。命令格式 为"mysqladmin -u root --p'旧密码'password'新密码'"。例如,执行以下操作可将数据库用户 root 的密码设置为"cisco@123"。

bash 复制代码
[root@centos7-1 ~]# mysqladmin -u root -p'123457' password'cisco@123'
[root@centos7-1 ~]#

删除数据记录

DELETE 语句:用于删除表中指定的数据记录,语句格式如下所示。

DELETE FROM 表名 WHERE 条件表达式

执行以下操作可以删除 users 表中用户名为"lisi"的数据记录,验证记录内容可以发现 lisi 用户的数据记录已经消失。

bash 复制代码
mysql> delete from auth.users where user_name='lisi';
Query OK, 1 row affected (0.01 sec)

mysql> select * from auth.users;
+-----------+-------------------------------------------+
| user_name | user_password                             |
+-----------+-------------------------------------------+
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)

mysql>

需要注意的是,在执行 UPDATE、DELETE 语句时,通常都带 WHERE 条件,不 带条件的 UPDATE 语句和 DELETE 语句会修改或删除所有的记录,是非常危险的操作。

4、数据库表高级操作

清空表

清空一个数据表就是删除这个表内的所有数据。前面的小节已经学习过 DELETE FROM 语句,可以删除表内的数据,除此之外还可以使用 TRUNCATE TABLE 语句实现清 空表内记录。DELETE FROM 语句可以使用 WHERE 子句对删除的结果集进行过滤选择, 这样更方便、更灵活。TRUNCATE TABLE 语句是删除表中所有记录数据,没法定制,灵活 性上稍差。清空表的具体操作如下所示。

bash 复制代码
mysql> create table tmp like users;  //通过like方法,复制users表生成tmp表
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tmp select * from users;  //通过users表生成tmp内数据记录
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql>mysql> delete from tmp where user_name='zhangsan';  //删除tmp表内zhangsan的数据记录
Query OK, 1 row affected (0.01 sec)

mysql> delete from tmp;  //删除tmp表
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tmp select * from users;  //通过users表生成tmp内数据记录
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> truncate table tmp;  //清空tmp表内的数据
Query OK, 0 rows affected (0.01 sec)

mysql> select count(*) from tmp;  
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.01 sec)

mysql> 

临时表

MySQL 的临时表,顾名思义,就是临时建立的表,并不会长期存在,主要用于保存一 些临时数据。临时表有个特性,就是只在当前连接可见,当前连接下可执行增删改查等操作, 当连接被关闭后,临时表就会被释放。

下面创建临时表 mytmp,然后插入数据,之后断开当前连接,最后重新连到 MySQL 查看临时是否还存在,具体操作如下所示。

bash 复制代码
mysql> select * from mytmp;  //查看mytmp表是否存在
ERROR 1146 (42S02): Table 'auth.mytmp' doesn't exist

mysql> create temporary table mytmp(id char(10));  //创建临时表
Query OK, 0 rows affected (0.00 sec)

mysql> insert into mytmp(id) values('1');  //插入数据
Query OK, 1 row affected (0.01 sec) 

mysql> select * from mytmp;
+------+
| id   |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

mysql> quit  //退出当前连接
Bye

mysql> select * from mytmp;  //重新连接MySQL之后查看临时表状态
ERROR 1046 (3D000): No database selected
mysql> 

临时表创建成功之后,使用 SHOW TABLES 命令是看不到创建的临时表的,临时表会在连接退出后被销毁。如果在退出连接之前,也可以手动直接删除,使用 DROP TABLE 语 句,具体操作如下所示。

bash 复制代码
mysql> drop table mytmp;
Query OK, 0 rows affected (0.01 sec)

mysql> 

克隆表

在 MySQL 的开发和维护过程中,会有原样拷贝某个数据表的需求。怎么样才能够快速、 完整的拷贝数据表呢?先来看一下 CREATE TABLE new_tablename AS SELECT 这个语 句,具体实现的 SQL 语句如下所示。

bash 复制代码
mysql> drop table tmp;  //删除tmp表
Query OK, 0 rows affected (0.03 sec)

mysql> create table tmp select * from users;  //克隆users表生成tmp表
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select count(*) from tmp;  //查看tmp表
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql> 

通过 LIKE 方式克隆表

首先,通过在创建表时使用 LIKE 方法,完整复制表结构。LIKE 方法可以将源表完全一样的复制生成一个新表,包括表的备注、索引、主键、存储引擎等,但是不会复制源表内数据记录。

其次,在通过 INSERT INTO...SELECT 方法,将源表内的数据写入新表内。

bash 复制代码
mysql> create table test like users;  //通过like方法,复制users表生成test表
Query OK, 0 rows affected (0.02 sec)

mysql> show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `user_name` char(16) NOT NULL,
  `user_password` char(48) DEFAULT '',
  PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

mysql> select * from test;  //like方法复制表结构,不复制数据
Empty set (0.00 sec)

mysql> insert into test select * from users;  //将users表的数据写入test表
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test;
+-----------+-------------------------------------------+
| user_name | user_password                             |
+-----------+-------------------------------------------+
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.01 sec)

mysql> 

通过创建表的方式克隆表

首先,使用 SHOW CREATE TABLE 命令来获取源表的表结构、索引等信息。

其次,复制源表结构并修改表名为目标名字,然后执行创建新表的语句。通过这步操作, 就可以获得一个和源表结构一样的克隆表了。

最后,执行 INSERT INTO...SELECT 语句,从源表复制数据到新表内。

bash 复制代码
mysql> show create table users\G
*************************** 1. row ***************************
       Table: users
Create Table: CREATE TABLE `users` (
  `user_name` char(16) NOT NULL,
  `user_password` char(48) DEFAULT '',
  PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> CREATE TABLE `test02` (  //改名后创建新表
    ->   `user_name` char(16) NOT NULL,
    ->   `user_password` char(48) DEFAULT '',
    ->   PRIMARY KEY (`user_name`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test02 select * from users;  //导入原表数据
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test02;
+-----------+-------------------------------------------+
| user_name | user_password                             |
+-----------+-------------------------------------------+
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> 

通过以上两种方法都可以获得相同的克隆表。

5、数据库用户授权

MySQL 数据库的 root 用户账号拥有对所有数据库、表的全部权限,频繁使用 root 账号 会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负 责一部分数据库、表的管理和维护操作,甚至可以对查询、修改、删除记录等各种操作做进 一步的细化限制,从而将数据库的风险降至最低。

授予权限

GRANT 语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时, GRANT 语句将会创建新的用户;当指定的用户名存在时,GRANT 语句用于修改用户信息。 语句格式如下所示。

GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [ IDENTIFIED BY '密码'

使用 GRANT 语句时,需要注意的事项

  • 权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如"select,insert, update"。使用"all"表示所有权限,可授权执行任何操作。
  • 数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符"*"。例 如,使用"auth.*"表示授权操作的对象为 auth 数据库中的所有
  • 用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用"%"通配符,表示某个区域或网段 内的所有地址,如"%.bdqn.com""192.168.1.%"等。
  • IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时, 若省略"IDENTIFIED BY"部分,则用户的密码将为空。

执行以下操作可以添加一个名为"xiaoqi"的数据库用户,并允许其从本机访问,对 auth 数据库中的所有表具有查询权限,验证密码为"123456"。使用 GRANT 语句授权的用户记录,会保存到 mysql 库的 user、db、host、tables_priv 等相关表中,无须刷新即可生效。

bash 复制代码
mysql> grant select ON auth.* TO 'xiaoqi'@'localhost' identified by '123456';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql>

撤销权限

REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到 MySQL 服务器,但将被禁止执行对应的数据库操作,语句格式如下所示。

REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址

执行以下操作可以撤销用户 xiaoqi 从本机访问数据库 auth 的所有权限。

bash 复制代码
mysql> revoke all ON auth.* from 'xiaoqi'@'localhost'; 
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show grants for 'xiaoqi'@'localhost';  //确认已撤销xiaoqi对auth库的所有权限
+--------------------------------------------+
| Grants for xiaoqi@localhost                |
+--------------------------------------------+
| GRANT USAGE ON *.* TO 'xiaoqi'@'localhost' |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> 
相关推荐
Karoku06625 分钟前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
小技与小术2 小时前
数据库表设计范式
数据库·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer2 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪2 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿2 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员
无敌岩雀2 小时前
MySQL中的索引
数据库·mysql
a_安徒生3 小时前
linux安装TDengine
linux·数据库·tdengine