MySQL基础学习(三)——SQL语句之DCL与DDL语句

前言

上一篇博客简单总结了一下mysql中的数据类型和存储引擎,这一篇开始梳理一下SQL,其实SQL这个东西说大不大,说小不小,但是工作这么多年了,我依旧能看到很多程序员似乎对SQL不是特别熟练,有些对用到聚合函数的select语句该如何使用,似乎都一知半解,这里还是开两篇博客,基于mysql8.0 总结一下SQL的基础语句

SQL语句的种类

从大类上分,SQL分为DCL,DDL,DML,TCL语句。

DCL——数据库管理语句,用于管理数据库访问的,比如用户管理,用户授权等。

DDL——数据定义类语句,用于建立数据表,修改表结构等

DML——数据操作语句,也是平时我们用的select,insert,update,delete等

TCL——对事务的控制语句,主要用于提交事务,回滚事务等等。

这一篇博客总结DCL语句与DDL语句

DCL语句

数据库管理语句,常用的DCL语句有三个:1、创建数据库账号,2、对用户授权,3、收回用户权限

创建用户

创建用户语法

CREATE USER [IF NOT EXISTS] account_name IDENTIFIED BY 'password';

其中的account_name由用户名@访问控制列表格式组成,这个可以决定用户从那些客户端访问,完整的创建语句语法,可以通过mysql的命令行去查看,在创建用户的同时还可以指定最大的连接数。

例如

CREATE USER mysql_learn_user @'192.168.1.%' IDENTIFIED BY '123456' WITH MAX_USER_CONNECTIONS 1;

上述语句创建了mysql_learn_user这个用户,限制这个用户只能在192.168.1.*的网段中访问,同时密码为123456,而且同时只能有一个客户端连接。

如果在上述用户连接之后,在操作同样的连接,就会抛出如下错误(基于SQLLog)
MySQL基础学习(三)——SQL语句之DCL与DDL语句_第1张图片

账号授权

MySQL中的常用权限如下,一共有50项,如果需要查询全部的权限列表,可以通过show privilieges命令查看

权限 说明
insert 向表中插入数据
delete 删除表中的数据
update 修改中的数据
select 查询表中的数据
alter 修改表的结构
execute 执行存储过程

完整语法

GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password']

实例

-- 给mysql_learn_user 授权查询 db_pmp.sys_dict 表中的user和host两列
GRANT SELECT(NAME,TYPE) ON db_pmp.sys_dict TO mysql_learn_user@'127.0.0.1'

-- 给mysql_learn_user 授权查询 db_pmp.sys_dict 表中所有列的数据
GRANT SELECT ON db_pmp.sys_dict TO mysql_learn_user@'127.0.0.1'

-- 给mysql_learn_user 授权查询 db_pmp 数据库中的所有数据
GRANT SELECT ON db_pmp.* TO mysql_learn_user@'127.0.0.1'

需要说明的是,使用grant语句进行授权的时候,被授权的数据库账户必须存在,同时在给其他用户授权的时候,只能授权当前用户已有的权限,不能授权其他用户自己都没有权限。

回收权限

通过revoke语句实现权限的回收,语法结构如下

REVOKE   priv_type [(column_list)]  [, priv_type [(column_list)]] ...    ON [object_type] priv_level  FROM user [, user] ... 

实例

-- 收回权限 从mysql_learn_user上收回对db_pmp.sys_dict 表中的user和host两列的查询权限
REVOKE SELECT(NAME,TYPE) ON db_pmp.`sys_dict` FROM mysql_learn_user@'127.0.0.1';

-- 收回权限 从mysql_learn_user上收回对db_pmp.sys_dict 表中的删除,插入和修改数据的权限
REVOKE delete,insert,update ON db_pmp.sys_dict from mysql_learn_user@'127.0.0.1'

DDL语句

DDL语句主要用于创建数据库中的对象,比如数据库,数据表等。

操作数据库

创建数据库

完成语法

CREATE DATABASE [IF NOT EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>] 
[[DEFAULT] COLLATE <校对规则名>];

实例

-- 没有指定排序规则和字符集的情况下,创建数据库
CREATE DATABASE db_class_sys;

使用系统默认的字符集和排序规则

修改数据库

ALTER DATABASE <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>] 
[[DEFAULT] COLLATE <校对规则名>];

删除数据库

DROP DATABASE [IF EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>] 
[[DEFAULT] COLLATE <校对规则名>];

实例

-- 删除数据库
DROP DATABASE IF EXISTS db_class_sys;

操作数据表

创建表

语法如下

CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];

其中表定义选项如下

<列名1> <类型1> [,] <列名n> <类型n>

实例

-- 建立课程表,由于在B树索引中,无法对空值进行索引,因此,这里每一列都默认不为空
CREATE TABLE `t_course` (
  `course_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '课程ID',
  `title` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '课程主标题',
  `title_desc` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '课程副标题',
  `type_id` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT '课程方向ID',
  `class_id` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT '课程分类ID',
  `level_id` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT '课程难度ID',
  `online_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '课程上线时间',
  `study_cnt` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '学习人数',
  `course_time` TIME NOT NULL DEFAULT '00:00:00' COMMENT '课程时长',
  `intro` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '课程简介',
  `info` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '学习需知',
  `harvest` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '课程收获',
  `user_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '讲师ID',
  `main_pic` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '课程主图片',
  `content_score` DECIMAL(3,1) NOT NULL DEFAULT '0.0' COMMENT '内容评分',
  `level_score` DECIMAL(3,1) NOT NULL DEFAULT '0.0' COMMENT '简单易懂',
  `logic_score` DECIMAL(3,1) NOT NULL DEFAULT '0.0' COMMENT '逻辑清晰',
  `score` DECIMAL(3,1) NOT NULL DEFAULT '0.0' COMMENT '综合评分',
  PRIMARY KEY (`course_id`),
  UNIQUE KEY `udx_title` (`title`)
) ENGINE=INNODB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 COMMENT='课程主表';

创建表的基础语法掌握到这里,针对开发应该够了

修改表

修改表的语法如下

ALTER TABLE <表名> [修改选项]

修改选项的语法格式如下:

{ ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名>
| CHARACTER SET <字符集名>
| COLLATE <校对规则名> }

除了alter table之外,还有rename table可以对数据表进行重命名

RENAME TABLE old_table_name TO new_table_name;

删除表

删除数据表的语法

DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]

drop表之后,数据只有通过备份才能恢复。除了DROP TABLE之外,还有一个truncate的语句同样可以删除表数据

TRUNCATE TABLE  表名

truncate操作相当于drop table + create table的操作,先删除表,然后再建立一个同结构的数据表,但是并不会记录这个表的删除日志。

操作索引

在建好表之后,需要建立一些索引了

查看索引

语法

SHOW INDEX FROM <表名> [ FROM <数据库名>]

实例

show index from t_course;

创建索引

CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
  • <索引名>:指定索引名。一个表可以创建多个索引,但每个索引在该表中的名称是唯一的。
  • <表名>:指定要创建索引的表名。
  • <列名>:指定要创建索引的列名。通常可以考虑将查询语句中在 JOIN 子句和 WHERE 子句里经常出现的列作为索引列。
  • <长度>:可选项。指定使用列前的 length 个字符来创建索引。使用列的一部分创建索引有利于减小索引文件的大小,节省索引列所占的空间。在某些情况下,只能对列的前缀进行索引。索引列的长度有一个最大上限 255 个字节(MyISAM 和 InnoDB 表的最大上限为 1000 个字节),如果索引列的长度超过了这个上限,就只能用列的前缀进行索引。另外,BLOB 或 TEXT 类型的列也必须使用前缀索引。
  • ASC|DESC:可选项。ASC指定索引按照升序来排列,DESC指定索引按照降序来排列,默认为ASC

删除索引

语法

DROP INDEX <索引名> ON <表名>

除此之外alter语句也可以删除索引。

针对索引的创建原则,索引的匹配规则,这些在之前的博客中都有介绍,这里不再赘述。

总结

查询SQL语句之前的开胃小菜

你可能感兴趣的:(MySQL,mysql,sql,数据库)