• MySQL数据库管理


    1、使用 MySQL 数据库

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

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

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

    1. mysql> show databases;
    2. +--------------------+
    3. | Database |
    4. +--------------------+
    5. | information_schema |
    6. | mysql |
    7. | performance_schema |
    8. | sys |
    9. +--------------------+
    10. 4 rows in set (0.01 sec)
    11. mysql>

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

    1. mysql> use mysql;
    2. Database changed
    3. mysql> show tables;
    4. +---------------------------+
    5. | Tables_in_mysql |
    6. +---------------------------+
    7. | columns_priv |
    8. | ......//省略部分内容 |
    9. | user |
    10. +---------------------------+
    11. 31 rows in set (0.00 sec)
    12. mysql>

    查看表的结构 

    1. mysql> use mysql;
    2. Database changed
    3. mysql> describe user;
    4. +------------------------+-----------------------------------+------+-----+-----------------------+-------+
    5. | Field | Type | Null | Key | Default | Extra |
    6. +------------------------+-----------------------------------+------+-----+-----------------------+-------+
    7. | Host | char(60) | NO | PRI | | |
    8. | User | char(32) | NO | PRI |
    9. | password_last_changed | timestamp | YES | | NULL | |
    10. |......//省略部分内容
    11. +------------------------+-----------------------------------+------+-----+-----------------------+-------+
    12. 45 rows in set (0.00 sec)
    13. 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 的数据库。

    1. mysql> create database auth;
    2. Query OK, 1 row affected (0.00 sec)
    3. mysql>

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

    创建新的表 

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

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

    1. mysql> use auth;
    2. Database changed
    3. mysql> create table users (user_name char(16) not null, user_password char(48) default'',primary key(user_name));
    4. Query OK, 0 rows affected (0.02 sec)
    5. mysql>

    删除一个数据表 

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

    1. mysql> drop table auth.users;
    2. Query OK, 0 rows affected (0.02 sec)
    3. mysql>

    删除一个数据库 

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

    1. mysql> drop database auth;
    2. Query OK, 0 rows affected (0.00 sec)
    3. mysql>

    3、管理表中的数据记录 

    插入数据记录 

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

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

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

    1. mysql> use auth;
    2. Database changed
    3. mysql> insert into users(user_name,user_password) values ('zhangsan',password('123456'));
    4. Query OK, 1 row affected, 1 warning (0.02 sec)
    5. mysql>

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

    1. mysql> insert into users values('lisi',password('654321'));
    2. Query OK, 1 row affected, 1 warning (0.00 sec)
    3. mysql>

    查询数据记录 

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

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

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

    1. mysql> select*from auth.users;
    2. +-----------+-------------------------------------------+
    3. | user_name | user_password |
    4. +-----------+-------------------------------------------+
    5. | lisi | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 |
    6. | zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    7. +-----------+-------------------------------------------+
    8. 2 rows in set (0.00 sec)
    9. mysql>

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

    1. mysql> select user_name,user_password from auth.users where user_name='zhangsan';
    2. +-----------+-------------------------------------------+
    3. | user_name | user_password |
    4. +-----------+-------------------------------------------+
    5. | zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    6. +-----------+-------------------------------------------+
    7. 1 row in set (0.00 sec)
    8. mysql>

    修改数据记录 

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

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

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

    1. mysql> update auth.users set user_password=password('') where user_name='lisi';
    2. Query OK, 1 row affected (0.01 sec)
    3. Rows matched: 1 Changed: 1 Warnings: 0
    4. mysql> select * from auth.users;
    5. +-----------+-------------------------------------------+
    6. | user_name | user_password |
    7. +-----------+-------------------------------------------+
    8. | lisi | |
    9. | zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    10. +-----------+-------------------------------------------+
    11. 2 rows in set (0.00 sec)
    12. mysql>

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

    1. mysql> update mysql.user set authentication_string=password('123457') where user='root';
    2. Query OK, 1 row affected, 1 warning (0.00 sec)
    3. Rows matched: 1 Changed: 1 Warnings: 1
    4. mysql> flush privileges; //刷新用户授权信息
    5. Query OK, 0 rows affected (0.00 sec)
    6. mysql>

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

    1. [root@centos7-1 ~]# mysqladmin -u root -p'123457' password'cisco@123'
    2. [root@centos7-1 ~]#

    删除数据记录 

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

    DELETE FROM 表名 WHERE 条件表达式

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

    1. mysql> delete from auth.users where user_name='lisi'
    2. Query OK, 1 row affected (0.01 sec)
    3. mysql> select * from auth.users;
    4. +-----------+-------------------------------------------+
    5. | user_name | user_password |
    6. +-----------+-------------------------------------------+
    7. | zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    8. +-----------+-------------------------------------------+
    9. 1 row in set (0.00 sec)
    10. mysql>

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

    4、数据库表高级操作 

    清空表 

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

    1. mysql> create table tmp like users; //通过like方法,复制users表生成tmp表
    2. Query OK, 0 rows affected (0.01 sec)
    3. mysql> insert into tmp select * from users; //通过users表生成tmp内数据记录
    4. Query OK, 1 row affected (0.00 sec)
    5. Records: 1 Duplicates: 0 Warnings: 0
    6. mysql>mysql> delete from tmp where user_name='zhangsan'; //删除tmp表内zhangsan的数据记录
    7. Query OK, 1 row affected (0.01 sec)
    8. mysql> delete from tmp; //删除tmp表
    9. Query OK, 0 rows affected (0.00 sec)
    10. mysql> insert into tmp select * from users; //通过users表生成tmp内数据记录
    11. Query OK, 1 row affected (0.01 sec)
    12. Records: 1 Duplicates: 0 Warnings: 0
    13. mysql> truncate table tmp; //清空tmp表内的数据
    14. Query OK, 0 rows affected (0.01 sec)
    15. mysql> select count(*) from tmp;
    16. +----------+
    17. | count(*) |
    18. +----------+
    19. | 0 |
    20. +----------+
    21. 1 row in set (0.01 sec)
    22. mysql>

    临时表 

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

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

    1. mysql> select * from mytmp; //查看mytmp表是否存在
    2. ERROR 1146 (42S02): Table 'auth.mytmp' doesn't exist
    3. mysql> create temporary table mytmp(id char(10)); //创建临时表
    4. Query OK, 0 rows affected (0.00 sec)
    5. mysql> insert into mytmp(id) values('1'); //插入数据
    6. Query OK, 1 row affected (0.01 sec)
    7. mysql> select * from mytmp;
    8. +------+
    9. | id |
    10. +------+
    11. | 1 |
    12. +------+
    13. 1 row in set (0.00 sec)
    14. mysql> quit //退出当前连接
    15. Bye
    16. mysql> select * from mytmp; //重新连接MySQL之后查看临时表状态
    17. ERROR 1046 (3D000): No database selected
    18. mysql>

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

    1. mysql> drop table mytmp;
    2. Query OK, 0 rows affected (0.01 sec)
    3. mysql>

    克隆表 

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

    1. mysql> drop table tmp; //删除tmp表
    2. Query OK, 0 rows affected (0.03 sec)
    3. mysql> create table tmp select * from users; //克隆users表生成tmp表
    4. Query OK, 1 row affected (0.02 sec)
    5. Records: 1 Duplicates: 0 Warnings: 0
    6. mysql> select count(*) from tmp; //查看tmp表
    7. +----------+
    8. | count(*) |
    9. +----------+
    10. | 1 |
    11. +----------+
    12. 1 row in set (0.00 sec)
    13. mysql>

    通过 LIKE 方式克隆表

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

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

    1. mysql> create table test like users; //通过like方法,复制users表生成test
    2. Query OK, 0 rows affected (0.02 sec)
    3. mysql> show create table test\G
    4. *************************** 1. row ***************************
    5. Table: test
    6. Create Table: CREATE TABLE `test` (
    7. `user_name` char(16) NOT NULL,
    8. `user_password` char(48) DEFAULT '',
    9. PRIMARY KEY (`user_name`)
    10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    11. 1 row in set (0.01 sec)
    12. mysql> select * from test; //like方法复制表结构,不复制数据
    13. Empty set (0.00 sec)
    14. mysql> insert into test select * from users; //将users表的数据写入test
    15. Query OK, 1 row affected (0.00 sec)
    16. Records: 1 Duplicates: 0 Warnings: 0
    17. mysql> select * from test;
    18. +-----------+-------------------------------------------+
    19. | user_name | user_password |
    20. +-----------+-------------------------------------------+
    21. | zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    22. +-----------+-------------------------------------------+
    23. 1 row in set (0.01 sec)
    24. mysql>

    通过创建表的方式克隆表 

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

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

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

    1. mysql> show create table users\G
    2. *************************** 1. row ***************************
    3. Table: users
    4. Create Table: CREATE TABLE `users` (
    5. `user_name` char(16) NOT NULL,
    6. `user_password` char(48) DEFAULT '',
    7. PRIMARY KEY (`user_name`)
    8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    9. 1 row in set (0.00 sec)
    10. mysql> CREATE TABLE `test02` ( //改名后创建新表
    11. -> `user_name` char(16) NOT NULL,
    12. -> `user_password` char(48) DEFAULT '',
    13. -> PRIMARY KEY (`user_name`)
    14. -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    15. Query OK, 0 rows affected (0.01 sec)
    16. mysql> insert into test02 select * from users; //导入原表数据
    17. Query OK, 1 row affected (0.00 sec)
    18. Records: 1 Duplicates: 0 Warnings: 0
    19. mysql> select * from test02;
    20. +-----------+-------------------------------------------+
    21. | user_name | user_password |
    22. +-----------+-------------------------------------------+
    23. | zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    24. +-----------+-------------------------------------------+
    25. 1 row in set (0.00 sec)
    26. 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 等相关表中,无须刷新即可生效。

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

    撤销权限

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

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

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

    1. mysql> revoke all ON auth.* from 'xiaoqi'@'localhost';
    2. Query OK, 0 rows affected, 1 warning (0.00 sec)
    3. mysql> show grants for 'xiaoqi'@'localhost'; //确认已撤销xiaoqi对auth库的所有权限
    4. +--------------------------------------------+
    5. | Grants for xiaoqi@localhost |
    6. +--------------------------------------------+
    7. | GRANT USAGE ON *.* TO 'xiaoqi'@'localhost' |
    8. +--------------------------------------------+
    9. 1 row in set (0.00 sec)
    10. mysql>
  • 相关阅读:
    什么是Nginx?
    微软Surface/Surface pro笔记本电脑进入bios界面
    MySQL数据库期末考试试题及参考答案(03)
    如何报考华为网络工程师?
    法定代表人和股东是什么关系
    SD3403/SS928 视频采集调试记录
    从零搭建微服务架构:Spring Boot与Nacos完美整合
    JAVA学习进程、线程
    ASE docker related research
    牛客NC357 矩阵第K小【中等 堆 Java、Go、PHP】
  • 原文地址:https://blog.csdn.net/2301_77081516/article/details/136414339