初识SQL
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理
关系数据库管理系统(Relational Database Management System:RDBMS)的语言,和我们所熟悉的Java、php、python等程序语言一样,也是一种编程语言。
所谓的关系型数据库,就是像MySQL、SQL Server、Oracle、db2等等这样的数据库。当然也有非关系型数据库(NoSQL,Not Only SQL),也已经开始支持SQL语言来对存储其中的数据进行操作了。比如Hive,就可以支持使用SQL语言来查询存储在Hadoop中的数据,可见SQL语言不但学习难度低,而且引用范围也是越来越广,是每个程序员所必备的一种语言。
回归正题
常用的SQL语言种类:DCL、DDL、DML、TCL
DCL(Data Control Language):数据库管理语句,用于管理数据库访问的。比如授权语句、用户建立语句等
DDL:数据定义类语句的简称,主要用于建立数据库对象的,比如建立表的语句,修改表结构的语句等等
DML:数据操作语句的一种简称,也是我们平时使用最多的一种语言,从其名字中大家就可以知道DML主要用于操作存储在数据库中的数据,也就是之前所说的执行这个增删改查,这些任务的语句全都属于DML类语句
TCL:这是一种事务控制类语句的简称,主要的作用是实现对事物的控制,比如开启事务、提交事务、回滚事务等等,这些都是属于TCL类语句。
DCL(Data Control Language)
如果我们要访问数据库呢,就必须要有相应的数据账号,大家可能已经注意到了,我们之前呢,在演示中使用的都是root账号,也就是MySQL的特权账号,这在生产环境中是非常不安全的,所以我们在项目开始,实际使用到数据库前呢,所要做的第一件事,就是建立程序所使用的数据库访问账号,并对这个账号赋予相应的权限。
前面我们说过,这类操作呢是通过DCL语言来实现的,常用的DCL主要有三个
建立数据库账号:create user
我们需要使用这个语句来建立我们需要使用的数据库账号,并且指定这个账号的密码。
接下来建立好账号后,我们还要对这个账号进行授权
对用户授权:grant
至于可以为数据库账号授予那些权限,我们下面再来讨论
最后,如果我们发现有的账号具有并不是很需要的权限,超过了它使用范围的权限,就可以使用
show privileges
查看可授权的对象
flush privileges
刷新权限,执行授权动作的语句,使其生效。
授权注意事项
使用GRANT授权的数据库账号必需存在
用户使用grant命令授权必须具有grant option权限
只能授予别的用户自己有的权限
获取命令帮助 help grant
收回用户权限:revoke
把那些不需要的权限收回
DDL(Data Definition language),这是经常用到的语句
DDL就是数据库定义语言的简称,用于定义数据的各种对象,比如数据库的表、库、视图等等。常用的数据库语言有以下几种:
DDL 分类
建立/修改/删除数据库:create/alter/drop database
在建立数据库对象前,要先建立书库,其他的对象像表、视图等都在某一个数据库中的。可以使用create database语句来创建一个数据库。如果要对一个数据库进行修改的话,可以使用alter database ,但是要注意修改的只是数据库对象的本身,并不会对数据库中存在的其它对象造成影响。而要删除数据库呢,则要使用drop database语句,要特别注意的是执行时候,要特别小心,因为drop database除了会删除数据库之外呢,还会删除存储在数据库内的所有的对象和数据,并且删除后除了使用之前的备份恢复外,别无它法。所以只有在你已经十分的确认数据库中的数据不再需要,并且也已经进行过完整的备份之后,才可以执行drop database语句来删除数据库。
那么建立好数据库之后呢,我们就可以在数据库中建立我们所需要的表了。
建立/修改/删除表:create/alter/drop table
我们可以使用create table 语句来创建表,同样我们如果对一个表进行修改呢,可以使用alter table语句,是对表的结构来进行修改,当然在一些时候呀也会影响到表中的数据,特别是在对枚举类型的枚举值在进行修改的时候,就有可能会影响到原来表中已经存在的数据,这一点大家要特别的注意。如果我们要删除一个表的话就可以使用drop table 命令,同样呢,drop table命令会同时删除表中的所有数据,并且呢也只能通过之前的备份来进行恢复,所以在执行drop table前也需要非常的谨慎。
建立好表之后,为了提高数据的查询性能,还需要根据所使用的SQL在表上呢建立一些索引,创建索引使用的命令是
建立/删除索引:create/drop index
索引呢并不是越多越好,过多的索引不但不能提升数据的查询性能,反而影响数据的查询效率,所以呢,我们不但要建立索引,也同样需要删除一些不必要的索引,对于没用的索引可以使用drop index命令来进行删除,删除索引并不会对表中已存在的数据造成影响
除了建立和删除表之外呢,还可以清空表
清空表:truncate table
为什么清空表不叫数据管理命令,而叫数据定义命令呢?实际上truncate table做的操作呢,实际上就相当于drop table create table,也就是先删除表再创建表,所以truncate table命令实际上就是DDL命令,其所实现的功能呢就是删除表中的所有数据并保留这个表的结构,但是并不会记录数据的删除日志,所以也无法通过日志对已删除的数据进行恢复。
另一个常见的DDL操作呢,就是对表重命名
重命名表:rename table
可以对表进行重命名,还可以利用其在同一个数据库的不同实例之间移动表,rename table命令并不会影响表中的数据
视图呢,也是我们很常用的一个数据库对象,我们可以利用视图来简化查询,在MySQL中要创建视图,我们可以使用
建立/修改/删除视图:create/alter/drop view
DML(Data Manipulation language),重要,也最复杂
DML就是数据操作语句的英文简称。所谓的数据操作语句的作用,从名称中我们就可以知道一二了, DML语句作用就是用于操作存储在数据库中的数据。比如我们希望向表中添加、修改、删除数据,这样的SQL语句就都是DML语句:
新增表中的数据:insert into
删除表中的数据:delete
修改表中的数据:update
查询表中的数据:select
任务一:向表中写入数据
INSERT
[INTO] tbl_name [(col_name [, col_name] ...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ON DUPLICATE KEY UPDATE
col_name=expr
[,col_name=expr] ... ]
❕往具有主键和唯一索引的表中插入数据时,如果出现主键或唯一索引冲突,插入的操作可能就会被回滚,为了避免这种情况发生,可以在insert语句中指定当出现唯一索引冲突时候的操作行为,比如我们可以设置当出现唯一索引冲突时则更新表中的某几列的值为新的插入数据的值
四、TCL(Transaction Control Language)事务定义语言
COMMIT:提交事务
ROLLBACK:恢复事务相关数据至上一次COMMIT操作之后