- 前言
- 什么是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语句每次删除一行,便会在事务日志中为所删除的每一行记录一项。