MySQL常用管理SQL语句

目录
  • 前言
    • 什么是SQL
    • SQL的分类
      • DDL
      • DCL
      • DML
      • 1.DDL语句之管理数据库
        • 1.1.创建数据库
        • 1.2.显示数据库
        • 1.3.切换数据库
        • 1.4.查看数据库包含的表信息
          • 1.4.1.切换到数据库里面去查看表信息
          • 1.4.2.在库外面查看库里的表信息
        • 1.5.删除数据库
      • 2.DDL&&DCL语句之管理用户
        • 2.1.查看当前数据库的用户列表
        • 2.2.创建数据库用户
        • 2.3.删除数据库用户
        • 2.4.授权数据库用户
          • 2.4.1.创建test3用户,对test库具备所有权限,允许从localhost主机登录管理数据库,密码是test123。
          • 2.4.2.授权与root同等地位的system用户权限。
        • 2.5.授权的权限列表
        • 2.6.企业中grant授权权限问题说明
          • 2.6.1.企业里主数据库用户的授权问题说明
          • 2.6.2.博客、CMS、BBS等产品的数据库授权
          • 2.6.3.生产环境针对主库(写为主读为辅)用户的授权策略
          • 2.6.4.生产环境从库(只读)用户的授权
          • 2.6.5.生产场景下的具体授权
          • 2.6.6.生产场景下,朱从库读写分离授权难点与解决方案
        • 2.7.查看用户及授权
      • 3.DDL语句之管理表
        • 3.1.建立表
        • 3.2.查看表结构
        • 3.3.更改表名
        • 3.4.增、删、改表的字段
        • 3.5.创建和删除索引
        • 3.6.查看建表语句
        • 3.7.删除表
      • 4.DML语句之管理表中的数据
        • 4.1.往表中插入数据
        • 4.2.查询表中的数据
        • 4.3.修改表中的数据
        • 4.4.删除表中的数据
        • 4.5.清空表中的数据

前言

什么是SQL

SQL是结构化查询语言,它是一种对关系型数据库中的数据进行定义和操作的语言,是大多数关系型数据库管理系统所支持的工业标准语言。

SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统。SQL常用作MySQL逻辑备份文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定数据的存放方法,也不需要用户了解具体的数据存放方式,所以,其完全不同于底层结构,不同的数据库系统可以使用相同的SQL作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使得它具有极大的灵活性和强大的功能。不同的数据库系统的SQL会有一些差别。

SQL的分类

DDL

DDL,中文为数据定义语言,DDL的特点是对数据库内部的对象进行create(创建)、alter(修改)、drop(删除)等操作,负责管理数据库的基础数据,不涉及对表中内容的操作和更改。

DCL

DCL,中文为数据控制语言,DDL的特点是对数据库内部的对象grant(用户授权)、revoke(权限回收)、commit(提交)、rollback(回滚)。

DML

DML,中文为数据操作语言,DML的特点是对数据库内部的对象insert(增)、delete(删)、update(改)、select(查),主要针对数据库中表内的数据进行操作。

1.DDL语句之管理数据库

1.1.创建数据库
create database oldboy;  #创建默认字符集数据库
create database oldboy_gbk character set gbk collate gbk_chinese_ci;  #创建gbk字符集数据库
create database oldboy_utf8 character set utf8 collate utf8_general_ci;  #创建utf8字符集数据库
show create database oldboy\G  #查看建库语句
1.2.显示数据库
show databases;  #查看所有数据库
show databases like 'oldboy';  #匹配oldboy字符串的数据库
show databases like 'oldboy%';  #%为通配符,表示匹配以oldboy开头的所有数据库
1.3.切换数据库
use oldboy;  #切换到oldboy库
select database();  #查看当前管理员所在的库名
1.4.查看数据库包含的表信息
1.4.1.切换到数据库里面去查看表信息
use oldboy;
show tables;
1.4.2.在库外面查看库里的表信息
show tables from oldboy;  #查看指定库oldboy中包含的表
show tables in test_gbk;
show tables from mysql like 'db%';  #匹配包含指定字符开头的表
1.5.删除数据库
drop database oldboy_gbk;  #删除oldboy_gbk数据库
show databases like 'oldboy_gbk';

2.DDL&&DCL语句之管理用户

2.1.查看当前数据库的用户列表

查看数据库用户列表属于DML负责的部分内容。

select user,host from mysql.user;  #这里的select关键字表示查询,是DML语句的关键字之一,user和host为要查找的MySQL表的字段,from表示去哪查,mysql.user是MySQL库里的user表。数据库的标准用户由“用户”@“主机名”共同组成的,两者加起来是数据库用户的唯一标识。
2.2.创建数据库用户
create user blog@localhost identified by 'blog123';
select user,host from mysql.user;  #查看所有数据库用户
create user bbs@'172.16.1.%' identified by 'bbs123';
select user,host from mysql.user where user='bbs;  #查看指定数据库用户
show grants for bbs@'172.16.1.%';
#USAGE表示连接权限
2.3.删除数据库用户
drop user 'blog'@'localhost';  #删除数据库用户命令
select user,host from mysql.user where user='blog';  #删除后检查数据库用户
flush privileges;  #使得处理用户后,对数据库生效,有数据库改动的情况,执行这个命令

delete from mysql.user where user='bbs' and host='172.16.1.%';
flush privileges;
2.4.授权数据库用户
2.4.1.创建test3用户,对test库具备所有权限,允许从localhost主机登录管理数据库,密码是test123。
grant all privileges on oldboy.* to 'test'@'localhost' identified by 'test123';
select user,host from mysql.user where user='test';
show grants for 'test'@'localhost';
#ALL PRIVILEGES就是授权的权限
2.4.2.授权与root同等地位的system用户权限。
show grants for root@localhost;  #查看root用户的权限
grant all on *.* to 'system'@'localhost' identified by 'system123' with grant option;
grant proxy on ''@'' to 'system'@'localhost' with grant option;  #允许创建代理用户
show grants for system@localhost;
2.5.授权的权限列表
show grants for 'test'localhost';
#ALL PRIVILEGES就是授权的权限
revoke select on oldboy.* from 'test'@'localhost';
show grants for 'oldboy'@'localhost';
#权限ALL被拆分成了更细的权限

MySQL的ALL PRIVILEGES的权限列表

权限 说明
SELECT 查询(数据)
INSERT 插入(数据)
UPDATE 修改(数据)
DELETE 删除(数据)
CREATE 创建(数据库、表等对象)
DROP 删除(数据库、表等对象)
RELOAD 重载
SHUTDOWN 关闭
PROCESS 进程
FILE 文件
REFERENCES 参考资料
INDEX 索引
ALTER 修改(数据库、表等对象)
SHOW DATABASES 查看数据库
SUPER 超级权限
CREATE TEMPORARY TABLES 创建临时表
LOCK TABLES 锁表
EXECUTE 执行
REPLICATION SLAVE 从复制权限
REPLICATION CLIENT 从客户端复制
CREATE VIEW 创建视图
SHOW VIEW 查看视图
CREATE ROUTINE 创建存储过程
ALTER ROUTINE 修改存储过程
CREATE USER 创建用户
EVENT 事件
TRIGGER 触发器
CREATE TABLESPACE 创建表空间
2.6.企业中grant授权权限问题说明
2.6.1.企业里主数据库用户的授权问题说明

在企业生产环境中,如果是以web形式连接数据库的用户,那么尽量不要授予all权限,最好是分拆授权,比如,授予select、insert、update、delete等适合web使用的DML语句关键字权限。

grant select,insert,update,delete on oldboy.* to test@'172.16.1.%' identified by 'test123';

#注意:授权用户权限时有如下3条安全红线不要轻易跨过。
1、权限不能用all,要应用select、insert、update、delete等具体权限。
2、库不能用"*.*",而应用"oldboy.*"格式具体到库。
3、主机不能用%,而应用内网IP段,即'172.16.1.%'格式。

PHP程序语言连接MySQL的代码:


2.6.2.博客、CMS、BBS等产品的数据库授权

采用web形式连接数据库的用户应尽量采用最小化原则进行授权,但是很多开源软件都是通过web界面安装的,因此,在安装期间除了select、insert、update、delete这4个权限外,有可能还需要create、drop等比较危险的权限。

grant select,insert,update,delete,create,drop on blog.* to 'blog'@'172.16.1.%' identified by 'blog123';

生成数据库、表后,可以使用revoke命令收回create、drop授权。

revoke create,drop on blog.* from 'blog'@'172.16.1.%';
show grants for 'blog'@'172.16.1.%';
2.6.3.生产环境针对主库(写为主读为辅)用户的授权策略

web或应用程序和数据库在一台电脑上的数据库授权。

grant all privileges on `blog`.* to 'blog'@'localhost' identified by 'blog123';

应用程序服务器和数据库服务器不在一个主机上。

grant all privileges on `blog`.* to 'blog'@'172.16.1.%';

由于工作中异机环境比较多,因此下面都是对命令的严格授权。

grant select,insert,update,delete on`blog`.* to 'blog'@'172.16.1.%' identified by 'blog123';
2.6.4.生产环境从库(只读)用户的授权
grant select on `blog`.* to 'blog'@'172.16.1.%' identified by 'blog123';

#这里表示为172.16.1.0/24的用户blog授予管理blog数据库中所有表(*表示所有表)的只读权限(select),密码为blog123。
2.6.5.生产场景下的具体授权

主库授权的命令为:

grant select,insert,update,delete on `blog`.* to 'blog'@'172.16.1.%' identified by 'blog123';

从库授权用户的命令为:

grant select on `blog`.* to 'blog'@'172.16.1.%' identified by 'blog123';
2.6.6.生产场景下,朱从库读写分离授权难点与解决方案
若主从库的MySQL库和表是同步的,则会无法针对同一个用户授权不同的权限。主库授权后会自动同步到从库上,导致从库的授权只读失败。
解决方法有以下几点。
1、取消数据库中MySQL库的同步功能。
2、授权主库权限后,从库执行回收增删改权限,只保留查的权限。
3、不在授权上控制增删改,而是用read-only参数控制普通用户更新从库。注意,read-only参数对超级用户无效。
2.7.查看用户及授权
select user,host from mysql.user;
show grants for 'blog'@'172.16.1.%';

3.DDL语句之管理表

create database oldboy;
show create database oldboy\G
3.1.建立表
create table student (
    id int(4) not null,
    name char(20) not null,
    age tinyint(2) not null default '0',
    dept varchar(16) default null
);

create table `student` (  #create table是创建表的固定关键字,student为表名。
    `id` int(4) not null,  #学号列,数字类型,长度为4.不为空值。
    `name` char(20) not null,  #名字列,定长字符类型,长度为20,不为空值。
    `age` tinyint(2) not null default '0',  #年龄列,很小的数字类型长度为2,不为空,默认为0值。
    `dept` varchar(16) default null  #系别符,变长字符类型,长度为16,默认为空。
) ENGINE=InnoDB default charset=utf8;  #引擎和字符集,引擎默认为InnoDB,字符集,继承库的utf8。

字段类型表的对应列的类型说明

列类型 说明
TINYINT 微小整数类型,可存储的容量为1字节
INT 整数类型,可存储的容量为4字节(4294967296)
CHAR(M) 定长字符串类型,当存储时,总是用空格填满右边到指定的长度。最大可存储1<=M字节<=255
VARCHAR(M) 变长字符串类型,最大可存储1<=M字节<=255

CHAR和VARCHAR之间的差别

CHAR(4) 存储需求 VARCHAR(4) 存储需求
'' ' ' 4字节 '' 1字节
'ab' 'ab ' 4字节 'ab' 3字节
'abcd' 'abcd' 4字节 'abcd' 5字节
'abcdefgh' 'abcd' 4字节 'abcd' 5字节
char类型是定长,不够的在右边用空格补全,这会浪费存储空间,以此列为查询条件时,速度更快,多数系统表的字段都是定长。
varchar类型是变长,节省存储空间,以此列为查询条件时速度较慢。
3.2.查看表结构
1、先通过use进入到指定库,然后再查看。
use oldboy;
desc student;

2、无须进入指定库,通过如下命令直接查看。
show columns from oldboy.student;
show full columns from student from oldboy;
3.3.更改表名
1、采用rename命令更改表名。
rename table student to test;
show tables;

2、采用alter法修改表名。
alter table test rename to student;
show tables;
3.4.增、删、改表的字段

先测试表数据

create table `test` (
  `id` int(4) not null auto-increment,
  `name` char(20) not null,
  primary key (`id`)
) engine=innodb default charset=utf8;

然后查看表结构

desc test;

在表test中添加字段sex、age和qq,类型分别为char(4)、int(4)、varchar(15)。

alter table test add sex char(4),add age int(4),add qq varchar(15);

指定在第一行添加qq字段

alter table test add qq varchar(15) first;

指定在name行后面的位置添加age字段

alter table test add age int(4) after name;

在表test中删除字段sex、age和qq

alter table test drop sex,drop age,drop qq;
3.5.创建和删除索引

数据库的索引就像书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询数据的速度。

常见的为表内字段建立索引的方法有两种

1、建表后利用alter命令增加普通索引。
alter table student add index index_name(name);
desc student;

2、使用create为test表的qq列创建普通索引。
create index index_qq on test(qq);
desc test;

#PRI为主键索引的标识,MUL为普通索引的标识。
3.6.查看建表语句
show create table test\G
3.7.删除表
show tables from oldboy;
drop table student;  #删除表名为test的表。
show tables from oldboy;

4.DML语句之管理表中的数据

4.1.往表中插入数据
use oldboy;
drop table test;
create table test (
  id int(4) not null auto_increment,
  name char(20) not null,
  primary key (id)
);
desc test;

1、按规则指定所有的列名,并且每列都插入值。
insert into test(id,name) values(1,'oldboy');

2、只在name列插入值,由于id列是自增的,所以可以这般操作。
insert into test(name) values('oldgirl');

3、如果不指定列,就要按规则为每列都插入恰当的值。
insert into test values(3,'inca');

4、批量插入数据的方法。
insert into test values(4,'zuma'),(5,'kaka');  #批量插入2条记录。
delete from test;
insert into test(id,name) values(1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka');

select * from test;  #查看批量插入后的结果。
delete from test; #全部删除。
4.2.查询表中的数据
1、进入指定库后再查询。
use oldboy;
select * from test;

2、直接在库外,使用“库.表”的方式查询。
select * from oldboy.test;

根据指定条件查询表的部分数据

1、查看表test中的前2行数据。
select * from test limit 2;
select * from test limit 0,3;  #从第0行开查,查3行记录。

2、指定固定条件查询数据,一般结尾接where关键字并指定字段的条件查询。
select * from test where id =1;  #查询数字列无须加引号,但是看起来是数字,实际属于字符列就需要加引号。
select * from test where name='oldgirl';  #查询字符串务必要加单引号。

3、同时查询多个条件,则取交集。
select * from test where id=2 and name='oldgirl';  #多个条件。

4、指定固定条件范围查询数据。
select id,name from test where id>2 and id<5;  #多个条件,and取交集。
select id,name from test where id>3 or id<2;  #多个条件,or取并集。

5、其他查询功能。
select id,name from test where id>3 order by id asc;  #正向排序
select id,name from test where id<3 order by id desc;  #反向排序
4.3.修改表中的数据
select * from test;
update test set name='xiaoting' where id=3;  #等号可以改为其他任意符号或增加多条件。
select * from test where id=3;
4.4.删除表中的数据
use oldboy;
delete from test where id=1;  #删除id为1的行
delete from test where name='oldboy';  #删除name等于oldboy的行
select * from test;

alter table test add state tinyint(2) not null default 1;  #通过状态来判断页面内容显示
desc test;
select * from test where state=1;
update test set state=0 where name='oldgirl';  #通过update实现逻辑删除
select * from test where state=1;
4.5.清空表中的数据
select * from test;
truncate table test;  #执行清空命令
select * from test;

truncate和delete的区别:

1、truncate与不带where子句的delete语句功能相同:两者均删除表中的全部行,但truncate比delete速度快。
2、truncate通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放,因此使用的系统和事务日志资源更少。
3、delete语句每次删除一行,便会在事务日志中为所删除的每一行记录一项。

你可能感兴趣的:(MySQL常用管理SQL语句)