数据库环境搭建时,都是统一的通用模板,而具体使用场景往往是千差万别的,比如某个库需要的表数量及表名都是不同的,表的列数与列名也都是不同的,每一列的数据类型也是不同的。还更数据库更基本的配置,如字符集等。
那如何通过SQL语句满足这些千差万别呢?我们就需要DDL语句来实现了。
一般文章里,都会按具体的实现功能来介绍SQL的语句分类,我决定采用关键词的形式介绍,如果SQL语句中用到了如下关键词,那么它就是DDL语句,而具体每个关键词的用途及用法,我会在文章后面一一详细介绍。
需要注意的是,DDL语句往往对数据库的结构影响较大,特别是修改型的DDL语句。如果同一张表同时被多段代码、多个系统使用的话,很可能对其他代码造成影响,所以在使用DDL语句时要全局分析影响。
这里主要是介绍DDL语句包括的内容,使用的介绍也只是挑选几个常用示例,具体的使用场景会在每个功能的单独博客中介绍。DDL中的关键词如下表:
关键词 | 作用 |
---|---|
CREATE、ALTER、DROP | 创建,修改,移除方案对象及其他数据库结构,包括数据库自身及数据库用户 |
RENAME | 修改方案对象名称 |
TRUNCATE | 删除方案对象的所有数据,但不移除对象结构 |
GRANT、REVOKE | 授予或收回权限及角色 |
AUDIT、NOAUDIT | 打开或关闭审计选项 |
COMMENT | 向数据字典中添加注释 |
这三个,是最常见的DDL语句关键词,可以用来对方案对象及其他数据库结构进行创建,修改和移除。
方案对象及其他数据库结构包括:表、数据库本身、视图、索引、用户、存储过程、触发器、事件等等。
我们使用CREATE语句来创建新的数据库结构:
CREATE TABLE t_students(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(64),
age int,
gender VARCHAR(12),
college_id INT NOT NULL
);
创建完毕后,我们就可以在数据库信息中查到这张表,并进行数据的增删改查等操作。
CREATE DATABASE SMS CHARACTER SET = utf8;
创建一个全新的数据库实例,数据库名为SMS。
CREATE VIEW v_students_info (sname,age,gender,college_name) AS
SELECT a.sname,a.age,a.gender,b.college_name FROM t_students a , t_college b
where a.college_id = b.college_id;
创建一个名为v_students_info的视图,视图展示的内容为as后面查出来的学生信息。可以将视图当作一种特殊的表,视图创建后,直接查询视图,则会得到AS后面的查询结果,更加方便。
CREATE USER 'user_name'@'host' IDENTIFIED BY 'password'; --@前后不要空格
user_name是要创建用户的名字。host:表示要这个新创建的用户允许从哪台机登陆,如果只允许从本机登陆,则 填 ‘localhost’ ,如果允许从远程登陆,则填 ‘%’。password:新创建用户的登陆数据库密码,如果没密码可以不写。
我们使用ALTER语句来修改现有的数据库结构:
--增加字段
ALTER TABLE t_students ADD height DOUBLE;
--删除字段
ALTER TABLE t_students DROP COLUMN height;
--修改字段的数据类型
ALTER TABLE t_students MODIFY COLUMN sname VARCHAR(12);
ALTER VIEW v_students_info (sname,age,gender,college_name,height) AS
SELECT a.sname,a.age,a.gender,b.college_name,a.height FROM t_students a , t_college b
where a.college_id = b.college_id;
我们使用DROP语句来移除现有的数据库结构:
DROP TABLE t_students;
DROP VIEW v_students_info;
我们可以使用RENAME语句来修改表名:RENAME TABLE,实例:
-- rename table 原表名 to 新表名
rename table t_students to t_students_info;
需要注意的是,修改了表明后,使用到原表的视图会变得不可用,而不会自动查询新表名。
我们可以使用TRUNCATE语句来快速清空目标表:TRUNCATE TABLE,实例:
truncate table t_students;
使用TRUNCATE会快速清空目标表的所有记录,与DML语句中的Delete不同的是,TRUNCATE后面无法接where进行条件判断,只能默认清空所有记录。
使用TRUNCATE清空时不会产生日志记录,更偏向于从更底层直接删除,所以它是DDL语句。而DELETE是DML语句,删除每行时都会产生日志记录,所有效率会比TRUNCATE慢。
TRUNCATE清空表中后,自动增加字段初始值也被重置为1。而使用DELETE时,自增字段还是会在原有基础上继续增加。
数据库的权限大体可以分为两类:一是认证,即是否有资格连接数据库;二是授权,即是否有权限进行某些操作。认证是授权的前提。
我们可以GRANT语句来进行授权,使用REVOKE来收回授权。
GRANT语句的通用格式如下:
grant 权限 on 数据库对象 to 用户
其中,权限可以包括:增删改查、创建、修改、移除、索引等等。数据库对象则有表、视图、存储过程、函数、数据库等等。并且在一行语句中可以同时授权多种权限,权限间使用“,”分开即可。
REVOKE语句的通用格式如下:
revoke 权限 on 数据库对象 from 用户
REVOKE的用法与GRANT类似,只是作用相反,是将授权回收。
需要注意的是,grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。
数据库的字段都是英文字母的,虽然我们在为字段及表命名时都会尽量遵守开发命名规范,做到见词达意,但日子一长,特别是系统、工作有了多次交接,难免会忘记数据库表及字段的设计初衷与用途。使用COMMENT,可以为表及字段添加中文注释,更方便理解。
可以在创建表的同时添加注释,实例:
create table t_students
(
sid int comment '字段的注释'
)comment='表的注释';
也可以在表创建后修改注释,实例:
--修改表的注释
alter table t_students comment '修改后的表的注释';
--修改字段的注释
alter table t_students modify column sid int comment '修改后的字段注释';
使用COMMENT添加完成注释后,我们可以使用show create table和show full columns来查看注释。