程序员需掌握的SQL语法基础(一)

1.前言

平时项目开发中我们每一个人都经历过业务的CRUD操作,这些CRUD操作最终结果都是进行数据库的读写操作,在多种数据库中最常见使用的就是关系型数据库。而关系数据库最常见使用就是Mysql数据库了,网上关于Mysql数据库的博客已经很多了,但是作为一个程序员何不记录自己学习Mysql的点点滴滴呢?要知道纸上得来终觉浅,绝知此事要躬行。唯有靠我们自己多动手、多学习充实自己,才能在以后面试中立于不败之地,学习Mysql语法之前需要先安装Mysql,这里可以参考我之前写的博客基于Centos7的Linux系统-mysql5.7安装和配置(tar.gz与rpm)

2. SQL的分类

SQL语句广义可以分为以下三种类型:

  1. DDL(Data Definition Language):数据定义语言,这种类型的语句定义了对数据库对象(database、index、table、column)的操作,常用的SQL关键字有createalterdrop等。
  2. DML(Data Manipulation Language):数据操纵语言,这种类型的语句用于对数据库存储数据列进行增删改查操作,常见的SQL关键字有 insertdeleteupdateselect等。
  3. DCL(Data Control Language):数据控制语言,这种类型的数据定义了对数据库表、字段、用户访问许可与安全级别的操作,常见的关键字有grantrevoke等。

2.1 DDL

下面简单通过一下案列演示DDL语句的用法。

  1. 连接Mysql数据库

需启动Mysql相关服务后,如果你的Mysql实例加入了系统服务可以键入如下命令以查看mysql服务状态。

systemctl status 你的mysql系统服务名

因为我的mysql服务名为mysqld,所以执行的检查状态命令结果如下所示:
在这里插入图片描述如果你检查mysql服务没有启动如下图所示:
在这里插入图片描述
这个时候执行一下启动mysql服务命令即可。

systemctl start mysqld
  1. 创建数据库

当确定mysql服务正常启动后,这个时候就可以创建数据库了。输入以下命令即可以连接数据库。

 mysql -h 127.0.0.1 -P 3306 -u root -p

在这里插入图片描述
在上面命令行中使用了几个重要的参数,且欢迎界面有一些描述信息。

  • mysql 代表着客户端连接命令
  • -h 表示指定mysql客户端连接mysql服务端的ip地址
  • -P 表示连接指定Mysql服务器运行的端口号
  • -u 表示以指定的用户名去连接mysql服务器
  • -p 表示连接mysql服务器需要输入密码
  • mysql命令的结束符用;或者\g结束
  • 每一个连接mysql都会为这次连接分配一个id,这个id表示mysql服务的连接次数
  • 这里我使用的是mysql 5.7.29 社区版本。
  • 通过输入help,或者\h 获取帮助内容,输入\c 清除当前输入的内容

接下来让我们创建一个数据库,其语法如下所示:

CREATE DATABASE databaseName;

例如我们创建一个databaseName为test的数据库如下所示:

mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql>

如果你看到上面有Query OK选项恭喜你已经成功执行了创建数据库命令。但如果创建已经存在的database 对象则会报错。例如我们再次创建database为test的数据库对象,系统将会提示:

mysql> create database test;
ERROR 1007 (HY000): Can't create database 'test'; database exists
mysql>

可以查询当前数据库实例拥有那些数据库名称以避免上述的错误,我们输入如下命令:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
mysql>

当查看当前所拥有的数据库对象后,需要继续切换到需要操作的数据库对象。切换数据库语法为:

USE databaseName;

例如我们切换到我们之前创建的数据对象test

mysql> use test;
Database changed
mysql>

当切换到具体的数据库对象,我们还可以使用命令查询当前数据库对象下保存所有表对象:

mysql> show tables;
Empty set (0.00 sec)
mysql>

如果数据库对象下没有表对象则会提示Empty set

  1. 删除数据库

如果需要删除数据库对象,其语法为:

DROP DATABASE 数据库名;

例如删除我们创建的test数据库对象:

mysql> drop database test;
Query OK, 0 rows affected (0.01 sec)
mysql>

注意⚠️!!! 删除数据库对象后,所属的数据库对象下的表也将会被全部删除,所以请谨慎执行删除数据库对象的命令。

  1. 创建表

在数据库中创建表对象的语法如下:

CREATE TABLE tablename 
(column_name1, column_value1 约束条件,
column_name2, column_value2 约束条件,
column_name3, column_value3 约束条件, 
)

例如创建一个tb_person对象表,这个对象拥有姓名(name)、年龄(age)、性别(genderg)三个属性,其创建命令如下所示:

mysql> create table tb_person(name varchar(50) not null, age int(11) not null, gender varchar(10) not null);
Query OK, 0 rows affected (0.01 sec)
mysql>

当创建表后可以键入如下命令查看表详情信息语法如下:

DESC 表名;

例如查看tb_person表:

mysql> desc tb_person;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(50) | NO   |     | NULL    |       |
| age    | int(11)     | NO   |     | NULL    |       |
| gender | varchar(10) | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>

如果想要看当前表使用的sql引擎、表字符集相关定义、以及创建的表语句可以使用如下命令:

mysql> show create table tb_person;
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                             |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_person | CREATE TABLE `tb_person` (
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  `gender` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
  1. 删除表

删除表的语法与删除数据库对象类似,其语法如下:

DROP Table 表名

例如删除表tb_person:

mysql> drop table tb_person;
Query OK, 0 rows affected (0.01 sec)
mysql>
  1. 修改表

对于已经建立好的表,如果需要对表结构做修改如增加列、删除列或修改列属性。可以将表drop掉重新建立新表,但是这对那些已经表中拥有大量数据的表并不合适。常常通过是使用alter table语句其常见修改情形如下所示:

  • 修改表列的属性

一般有时候需要将列的类型进行更改,其修改语法如下所示:

ALTER TABLE TABLENAME MODIFY COLUMN 列名A 列属性 [FIRST | AFTER 列名B]

例如我们将tb_person中的age列属性由int 更改为varchar类型:

mysql> alter table tb_person modify column age varchar(20);
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql>

此时我们查看一下tb_person的表定义信息如下:

mysql> desc tb_person;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(50) | NO   |     | NULL    |       |
| age    | varchar(20) | YES  |     | NULL    |       |
| gender | varchar(10) | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

可以看到age属性由之前的int类型更改为varchar类型了。

  • 增加表列信息

如果需要对已经定义好的表新增一列,其修改语法如下所示:

ALTER TABLE TABLENAME ADD COLUMN 列名A 列属性 约束条件 [AFTER | FIRST 列名B]

例如我们在表中age后新增一个salary的列属性:

mysql> alter table tb_person add column salary decimal(10,2) not null after age;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql>

此时我们查看一下tb_person的表定义信息如下:

mysql> desc tb_person;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| name   | varchar(50)   | NO   |     | NULL    |       |
| age    | varchar(20)   | YES  |     | NULL    |       |
| salary | decimal(10,2) | NO   |     | NULL    |       |
| gender | varchar(10)   | NO   |     | NULL    |       |
+--------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql>

此时可以看到在age列下新增了salary字段。

  • 删除表字段

删除表字段的语法如下所示:

ALTER TABLE TABLENAME DROP COLUMN 列名

例如我们删除掉gender字段:

mysql> alter table tb_person drop column gender;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql>

mysql> desc tb_person;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| name   | varchar(50)   | NO   |     | NULL    |       |
| age    | varchar(20)   | YES  |     | NULL    |       |
| salary | decimal(10,2) | NO   |     | NULL    |       |
+--------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
  • 修改列名

有时候新建立的表名难免有欠缺的地方其修改语法如下所示:

ALTER TABLE TABLENAME CHANGE COLUMN 旧列名 新列名 列属性 约束 

例如将age列名修改为address 如下所示:

mysql> alter table tb_person change column age address varchar(50) not null;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql>

mysql> desc tb_person;
+---------+---------------+------+-----+---------+-------+
| Field   | Type          | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| name    | varchar(50)   | NO   |     | NULL    |       |
| address | varchar(50)   | NO   |     | NULL    |       |
| salary  | decimal(10,2) | NO   |     | NULL    |       |
+---------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>

或你注意到modify与change都可以更改列属性,但不同的是change可以修改列名,modify无法修改列名。

  • 更改表名

更改表名的语法如下所示:

ALTER TABLE TABLENAME RENAME TO 新表名

例如将表名tb_person修改为tb_per如下所示:

mysql> alter table tb_person rename to tb_per;
Query OK, 0 rows affected (0.00 sec)
mysql>

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tb_per         |
+----------------+
1 row in set (0.00 sec)
mysql>

2.2 DML

DML语句是我们平时开发中常常打交道的SQL语句,其主要包括CRUD操作即所谓的增删改查。

  1. 表中插入数据

插入表记录的语法如下所示:

INSERT INTO TABLENAME(列名A,列名B,列名C) values (列值1,列值2,列值3) 

例如我们向表tb_person中添加一条数据如下所示:

mysql> insert  into tb_person(name,address,salary) values('张三','上海','15000');
Query OK, 1 row affected (0.00 sec)

如果你插入的数据报 Incorrent String value xxxx 的异常,这通常是数据库对象编码集的问题,所以我们设置一下编码集,关于数据库中文字符集的问题可以参考我之前的一篇博客 解决Mysql中文插入异常处理

如果一个表中的所有列都要进行值插入我们还可以简写为如下:

mysql> insert  into tb_person values('张三','上海','15000');
Query OK, 1 row affected (0.00 sec)
mysql>

Mysql还支持批量插入数据,其语法如下所示:

INSERT INTO TABLENAME(列名A,列名B,列名C) values (列值1,列值2,列值3),
values (列值4,列值5,列值6),values (列值7,列值8,列值9) 

例如我们在表中添加多条记录如下所示:

mysql> insert  into tb_person(name,address,salary) values('张三','上海','15000'),('李四','北京','18000'),('王五','西安','9500');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql>

一般在大量的数据插入的时候特别有效。

  1. 更新表记录

当需要对表中的数据进行更新时,其语法如下所示:

UPDATE TABLENAME SET1=1,2=2,3=3 where 条件表达式 and 条件表达式...

例如我们将表中姓名为张三,地址为23的修改为赵六、南京 ,薪水 10000如下:

mysql> update tb_person set name='赵六', address ='南京', salary ='10000' where name='张三' and address ='23';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
  1. 删除记录

如果记录不需要可以进行删除,则可用delete命令语法如下:

DELETE FROM 表名 WHERE 条件表达式 and 条件表达式 ....
mysql> select * from tb_person;
+--------+---------+----------+
| name   | address | salary   |
+--------+---------+----------+
| 赵六   | 南京    | 10000.00 |
| 张三   | 上海    | 15000.00 |
| 张三   | 上海    | 15000.00 |
| 张三   | 上海    | 15000.00 |
| 李四   | 北京    | 18000.00 |
| 王五   | 西安    |  9500.00 |
+--------+---------+----------+
6 rows in set (0.00 sec)

例如,在tb_person 中 删除name=张三,address=上海 的表记录。

mysql> delete from tb_person where name='张三' and address='上海';
Query OK, 3 rows affected (0.00 sec)
  1. 查询记录

数据插入数据库中,就可以用SELECT 命令进行各行各样的查询,其查询语法如下:

select 列名1,列名2,列名3 from TABLENAME where 条件表达式 and 条件表达式 ....

例如查询tb_person表中所有记录如下所示:

mysql> select * from tb_person;
+--------+---------+----------+
| name   | address | salary   |
+--------+---------+----------+
| 赵六   | 南京    | 10000.00 |
| 李四   | 北京    | 18000.00 |
| 王五   | 西安    |  9500.00 |
+--------+---------+----------+
3 rows in set (0.00 sec)

其中* 表示匹配表中的所有列,其等价于下列查询语句:

select name,address,salary from tb_person;
  • 查询不重复记录

我们现在像这张表中插入重复数据如下所示:

mysql> insert into tb_person values('川建国','America',100000),('蓬佩奥','America',10000),('川建国','America',100000);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

重新查询所有列数据如下所示:

mysql> select name,address,salary from tb_person;
+-----------+---------+-----------+
| name      | address | salary    |
+-----------+---------+-----------+
| 赵六      | 南京    |  10000.00 |
| 李四      | 北京    |  18000.00 |
| 王五      | 西安    |   9500.00 |
| 川建国    | America | 100000.00 |
| 蓬佩奥    | America |   10000.00 |
| 川建国    | America | 100000.00 |
+-----------+---------+-----------+
6 rows in set (0.00 sec)

我们可以看到表中查询出来有三处重复的数据,此时可以使用distinct过滤重复列如下所示:

mysql> select distinct name,address,salary from tb_person;
+-----------+---------+-----------+
| name      | address | salary    |
+-----------+---------+-----------+
| 赵六      | 南京    |  10000.00 |
| 李四      | 北京    |  18000.00 |
| 王五      | 西安    |   9500.00 |
| 川建国    | America | 100000.00 |
| 蓬佩奥    | America |   10000.00 |
+-----------+---------+-----------+
5 rows in set (0.00 sec)
  • 条件查询

很多情况下条件查询是我们经常打交道的SQL查询,可以使用Where搭配多个条件进行查询,例如查询address=America的全部记录如下所示:

mysql> select * from tb_person where address = 'America';
+-----------+---------+-----------+
| name      | address | salary    |
+-----------+---------+-----------+
| 川建国    | America | 100000.00 |
| 蓬佩奥    | America |  10000.00 |
| 川建国    | America | 100000.00 |
+-----------+---------+-----------+
3 rows in set (0.00 sec)

在条件查询中组合条件可以使用and表示与关系,or表示或关系。如果是数值类型的还可以使用数学比较运算符如> 、<、=、!=、<=、>= 。例如查询address=America & salary >=20000的表记录如下所示:

mysql> select * from tb_person where address='America' and salary>='20000';
+-----------+---------+-----------+
| name      | address | salary    |
+-----------+---------+-----------+
| 川建国    | America | 100000.00 |
| 川建国    | America | 100000.00 |
+-----------+---------+-----------+
2 rows in set (0.00 sec)
  • 列排序以及限制

一般在开发中也有着对某一列进行排序并限制结果集语法如下所示:

SELECT 列名1,列名2 .... from TABLENAME where 条件表达式 and|or 条件表达式.... ORDER BY 列名1,列名2 DESC|ASC

例如我们对表中列按照薪水大小倒排序并输出3条记录如下所示:

mysql> select * from tb_person order by salary desc limit 3;
+-----------+---------+-----------+
| name      | address | salary    |
+-----------+---------+-----------+
| 川建国    | America | 100000.00 |
| 川建国    | America | 100000.00 |
| 李四      | 北京    |  18000.00 |
+-----------+---------+-----------+
3 rows in set (0.01 sec)

上面DESC与ASC是排序顺序的关键字,前者表示倒序排序后者表示顺序排序。如果排序的字段值一致,且只有一个排序字段则表中相同的记录将会无序排列,如果有第二个排序字段则按照第二个排序字段进行排序,以此类推。

mysql> select * from tb_person order by salary desc,address asc ;
+-----------+---------+-----------+
| name      | address | salary    |
+-----------+---------+-----------+
| 川建国    | America | 100000.00 |
| 川建国    | America | 100000.00 |
| 李四      | 北京    |  18000.00 |
| 蓬佩奥    | America |  10000.00 |
| 赵六      | 南京    |  10000.00 |
| 王五      | 西安    |   9500.00 |
+-----------+---------+-----------+
6 rows in set (0.00 sec)

其中上面你也以看到我们在一些SQL语句后面加入了limit关键字,关于limit的语法如下所示:

SELECT * from 表名 where 条件表达式1 and 条件表达式2  LIMIT [offset count]

其中offset指的是表中起始偏移量,count表示需要查询的记录数。例如从表中第二行开始查询3条记录如下所示:

mysql> select * from tb_person order by salary desc limit 1,3;
+-----------+---------+-----------+
| name      | address | salary    |
+-----------+---------+-----------+
| 川建国    | America | 100000.00 |
| 李四      | 北京    |  18000.00 |
| 赵六      | 南京    |  10000.00 |
+-----------+---------+-----------+
3 rows in set (0.00 sec)
  • 分组查询

一般情况下会对查询进行分组处理,如按照地区分组查询每个地区的总人数,其语法如下所示:

SELECT FUNCTION(列名) FROM 表名 where 条件表达式1 and|or 条件表达式2 GROUP BY 列名 HAVING 条件表达式

其中FUNCTION一般指的是聚合函数如SUM、COUNT、AVG、MAX、MIN,GROUP BY 表示按照列名进行分组。

HAVING 对查询出来的结果在按照条件进行过滤。

这里需要注意HAVING 与 where区别,HAVING 是对聚合函数的结果进行过滤。而WHERE是对聚合前对表查询的记录进行过滤。

例如以address分组统计人数以及薪水之和如下所示:

mysql> select address, count(*),sum(salary) from tb_person group by address;
+---------+----------+-------------+
| address | count(*) | sum(salary) |
+---------+----------+-------------+
| America |        3 |   210000.00 |
| 北京    |        1 |    18000.00 |
| 南京    |        1 |    10000.00 |
| 西安    |        1 |     9500.00 |
+---------+----------+-------------+
4 rows in set (0.00 sec)

在此基础上查询薪水之和大于10000的记录如下所示:

mysql> select address, count(*),sum(salary) from tb_person group by address having sum(salary)>10000;
+---------+----------+-------------+
| address | count(*) | sum(salary) |
+---------+----------+-------------+
| America |        3 |   210000.00 |
| 北京    |        1 |    18000.00 |
+---------+----------+-------------+
2 rows in set (0.00 sec)
  • 表连接查询

在日常开发中一般业务不会存在在一张表上,根据实际的业务需求将业务数据保存在不同的表上,这里就牵扯到多表查询。从连接类型上可分为内连接、外连接,它们之前的区别就是内连接匹配的是两表中都相互匹配的数据,而外连接会匹配其他不匹配的记录。

这里我们先新建部门表并添加几条数据如下所示:

mysql> create table tb_department(id int primary key auto_increment,name varchar(30));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tb_department(name) values('技术部门'),('hr'),('产品线');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

同时修改一下tb_person表新增一个de_no的字段如下所示:

mysql> alter table tb_person add column de_no int;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_person;
+---------+---------------+------+-----+---------+-------+
| Field   | Type          | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| name    | varchar(50)   | NO   |     | NULL    |       |
| address | varchar(50)   | NO   |     | NULL    |       |
| salary  | decimal(10,2) | NO   |     | NULL    |       |
| de_no   | int(11)       | YES  |     | NULL    |       |
+---------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> update tb_person set de_no=1 where name='赵六';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tb_person set de_no=2 where name='李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tb_person set de_no=3 where name='王五';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

例如查询所有员工的名字以及所在的部门如下所示:

mysql> select person.name ,department.name from tb_person person,tb_department department where person.de_no=department.id;
+--------+--------------+
| name   | name         |
+--------+--------------+
| 赵六   | 技术部门     |
| 李四   | hr           |
| 王五   | 产品线       |
+--------+--------------+
3 rows in set (0.00 sec)

上述SQL查询也等价于下列查询如下所示:

mysql> select person.name ,department.name from tb_person person inner join tb_department department on person.de_no=department.id;
+--------+--------------+
| name   | name         |
+--------+--------------+
| 赵六   | 技术部门     |
| 李四   | hr           |
| 王五   | 产品线       |
+--------+--------------+
3 rows in set (0.00 sec)

外连接又分为左外连接与右外连接,其中左外连接包含所有左表的记录甚至右表没有和它匹配的记录如下所示:

mysql> select person.name ,department.name from tb_person person left join tb_department department on person.de_no=department.id;
+-----------+--------------+
| name      | name         |
+-----------+--------------+
| 赵六      | 技术部门     |
| 李四      | hr           |
| 王五      | 产品线       |
| 川建国    | NULL         |
| 蓬佩奥    | NULL         |
| 川建国    | NULL         |
+-----------+--------------+
6 rows in set (0.00 sec)

上述查询中查询了所有的人名,即使有些人并不存在合法的部门名称,右外连接查询所有的右表记录,即使左表没有与其相匹配的记录。

  • 子查询

某些情况下,当进行查询的时候通常where后跟的条件是另一个Select语句后的结果,这个时候就要用到子查询。

一般可以见到的子查询关键字有 in ,not in , = ,!=,exists,not exists等。例如查询员工部门号在1,2的所有人员信息如下所示:

mysql> select * from tb_person where de_no in (select id from tb_department where id<3);
+--------+---------+----------+-------+
| name   | address | salary   | de_no |
+--------+---------+----------+-------+
| 赵六   | 南京    | 10000.00 |     1 |
| 李四   | 北京    | 18000.00 |     2 |
+--------+---------+----------+-------+
2 rows in set (0.00 sec)
  • 联合查询

有时候对多表查询会进行合集处理,这个时候就可以使用UNION、UNION ALL 关键字实现这样的功能,其语法如下所示:

SELECT * FROM1 UNIONUNION ALL SELECT * FROM 表二

UNION 与UNION ALL的区别是前者会将合并的结果进行去重处理而后者将会将所有的记录都显示出来

例如将两张表的部门编号进行联合查询如下所示:

mysql> select de_no from tb_person union all select id from tb_department;
+-------+
| de_no |
+-------+
|     1 |
|     2 |
|     3 |
|  NULL |
|  NULL |
|  NULL |
|     1 |
|     2 |
|     3 |
+-------+
9 rows in set (0.00 sec)

mysql> select de_no from tb_person union  select id from tb_department;
+-------+
| de_no |
+-------+
|     1 |
|     2 |
|     3 |
|  NULL |
+-------+
4 rows in set (0.00 sec)

2.3 DCL

一般DCL语句管理系统权限使用例如创建一个corearchi用户,并且对test下所有数据库有着select与insert权限

mysql> grant select,insert on test.* to 'corearchi'@'localhost' identified by '1234@Haha';
Query OK, 0 rows affected(0.01 sec)

此时我们可以使用切换至corearchi用户登陆并插入数据如下所示:

[root@donniegao ~]# mysql -u corearchi -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test;

mysql> desc tb_person;
+---------+---------------+------+-----+---------+-------+
| Field   | Type          | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| name    | varchar(50)   | NO   |     | NULL    |       |
| address | varchar(50)   | NO   |     | NULL    |       |
| salary  | decimal(10,2) | NO   |     | NULL    |       |
| de_no   | int(11)       | YES  |     | NULL    |       |
+---------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> insert into tb_person values('小米','北京','30000',3);
Query OK, 1 row affected (0.00 sec)

然后我们在使用root权限收回corearchi的insert权限如下所示:

mysql> revoke insert on test.* from 'corearchi'@'localhost';
Query OK, 0 rows affected (0.01 sec)

然后重新登陆corearchi用户再来尝试插入数据如下所示:

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into tb_person values('小米','北京','30000',3);
ERROR 1142 (42000): INSERT command denied to user 'corearchi'@'localhost' for table 'tb_person'

我们发现此时corearchi用户无法再次向tb_person中插入数据了,因为其权限已经被收回。

接下来下一节让我们温习一下 MYSQL数据类型

猜你喜欢

转载自blog.csdn.net/javaee_gao/article/details/106633872