MySQL中的DDL(数据定义语言)和DCL(数据控制语言)
SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 。
我在这里简单介绍下DDL和DCL。
一、数据定义语言DDL(Data Definition Language)
数据库操作
创建数据库:create database school;
删除数据库:drop database school;
切换数据库:use school;
创建表:create table student(
id int(4) primary key auto_increment,
name varchar(20),
score int(3)
);
查看数据库里存在的表:show tables;
varchar类型的长度是可变的,创建表时指定了最大长度,定义时,其最大值可以取0-65535之间的任意值,但记录在这个范围内,使用多少分配多少,varchar类型实际占用空间为字符串的实际长度加1。这样,可有效节约系统空间。varchar是mysql的特有的数据类型。
char类型的长度是固定的,在创建表时就指定了,其长度可以是0-255之间的任意值。虽然char占用的空间比较大,但它的处理速度快。
表操作
修改表:alter table student rename (to) teacher;
alter table student add password varchar(20);
alter table student change password pwd varchar(20);
alter table student modify pwd int;
alter table student drop pwd;
删除表:drop table student;
查看生成表的sql语句:show create table student;
查看表结构:desc student;
复制表:
-- 复制表结构
create table 新表 select * from 旧表 where 1=2;
-- 或
create table 新表 like 旧表;
--复制表结构和数据
create table 新表 select * from 旧表;
删除表:drop table 表名;
清空表:truncate table 表名;
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。TRUNCATE,DELETE,DROP放在一起比较:
TRUNCATE TABLE:删除内容、释放空间但不删除定义。
DELETE TABLE:删除内容不删除定义,不释放空间。
DROP TABLE:删除内容和定义,释放空间。
索引操作
添加主键索引
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`)
添加唯一索引
ALTER TABLE `table_name` ADD UNIQUE (`column`)
添加全文索引
ALTER TABLE `table_name` ADD FULLTEXT (`column`)
添加普通索引
ALTER TABLE `table_name` ADD INDEX index_name (`column` )
添加组合索引
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`)
-- 删除索引
drop index indexname on tablename;
-- 查看索引
show index from tablename;
二、数据控制语言DCL(Data Control Language)
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
DCL 语句主要是DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用。
创建用户
需要使用root用户登录之后进行操作。
创建用户的命令为:create user 用户名@xxx identified by 密码;
其中xxx表示创建的用户使用的IP地址,可以设置为localhost(代表本机)或者'%'(代表允许所有IP地址登录)。
给用户授权
创建用户之后,可以使用新用户进行登录,查看数据库只有系统自带的数据库,想要操作自己创建的数据库还需要root用户对新用户进行授权
给用户授权的命令为:grant 权限1,权限2,........,权限n on 数据库名.* to 用户名@IP;
上面命令的含义是将数据库的n个权限授予用户
如果是将操作数据库的所有的权限授予用户,命令为:grant all on 数据库名.* to 用户名@IP;
- all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
- on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user。
- to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。注意:本机时,不要使用127.0.0.1, 否则授权用户登录时会报1045。
- identified by:指定用户的登录密码。
- with grant option:在授权语句末尾加上该选项,表示允许用户将自己的权限授权给其它用户。
授权后刷下权限:flush privileges;
撤销授权
当需要限制新用户操作数据库的权限时,root用户可以撤销已授予用户的某些权限。
撤销权限的命令为:revoke 权限1,权限2,........,权限n on 数据库名.* from 用户名@IP;
例:删除linhw这个用户的create权限,该用户将不能创建数据库和表:
revoke create on *.* from 'linhw@localhost';
flush privileges;
查看用户的权限
root用户查看用户权限的命令为:show grants for 用户名@IP;
删除用户
root用户删除用户的命令为:drop user 用户名@IP;
用户重命名
rename user 'test3'@'%' to 'test1'@'%';
修改密码
(1)更新mysql.user表:
-- mysql5.7之前
UPDATE USER SET PASSWORD=password('1234567') WHERE USER='root';
-- mysql5.7之后
UPDATE USER SET authentication_string=password('1234567') WHERE USER='root';
(2)使用set password 命令
-- root 用户名
-- 登录地址
-- 123456为新密码
set password for 'root'@'localhost'=password('123456');
(3)mysqladmin
语法:mysqladmin -u用户名 -p旧的密码 password 新密码
mysqladmin -uroot -p123456 password 1234abcd
注意:mysqladmin位于mysql安装目录的bin目录下
mysql数据库中的3个权限表:user 、db、 host。
权限列表说明: