上一篇博客简单总结了一下mysql中的数据类型和存储引擎,这一篇开始梳理一下SQL,其实SQL这个东西说大不大,说小不小,但是工作这么多年了,我依旧能看到很多程序员似乎对SQL不是特别熟练,有些对用到聚合函数的select语句该如何使用,似乎都一知半解,这里还是开两篇博客,基于mysql8.0 总结一下SQL的基础语句
从大类上分,SQL分为DCL,DDL,DML,TCL语句。
DCL——数据库管理语句,用于管理数据库访问的,比如用户管理,用户授权等。
DDL——数据定义类语句,用于建立数据表,修改表结构等
DML——数据操作语句,也是平时我们用的select,insert,update,delete等
TCL——对事务的控制语句,主要用于提交事务,回滚事务等等。
这一篇博客总结DCL语句与DDL语句
数据库管理语句,常用的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中的常用权限如下,一共有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语句主要用于创建数据库中的对象,比如数据库,数据表等。
完成语法
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语句之前的开胃小菜