SQL语言--TCL事物控制语言
有时我们需要使用DML进行批量数据的删除,修改,增加。比如,在一个员工系统里,我们想要删除一个人的信息,除了删除这个人的基本信息外,还应该删除与此人有关的其他信息,如邮箱,地址等等。那么从开始执行到结束,就会构成一个事务。
对于事务,我们要保证事务完整性,要么成功,要么撤回。
一般情况下,事务要符合四个条件(ACID):
原子性(Atomicity):
事务要么成功,要么撤回,不可切割性
一致性(Consistency):
事务开始前和结束后,要保证数据一致性。转账前账号A和账号B的钱总数为10000;转账后账号A和账号B的钱总数应还为10000;
隔离性(Isolation):
当涉及到多用户操作同一张表时,数据库会为每个用户开启一个事务。那么当其中一个事务正在进行时,其他事务应处于等待状态。保证事务之间不会受影响。
持久性(Durability):
当一个事务被提交后,我们要保证数据库里的数据是永久改变的。即使数据库崩溃了,我们也要保证数据的完整性。
commit:提交
rollback :撤回,回滚
savepoint 保存点
事务:只有DML操作会触发一个事务
存储引擎(ENGINE):就是指表类型
当存储引擎为innodb时,才支持事务,有一个默认的存储引擎为Myisam,不支持事务。
事务的验证:
第一步:start transaction
第二步:savepoint 保存点名称
第三步:DML
第四步:commit/rollback
SQL之DCL:数据控制语言
作用是用来创建用户,给用户授权,撤销权限,删除用户
create user
grant
revoke
drop user
格式:
1.创建用户
create user username@ip identified by newpassword ;
--练习一:创建一个用户,scott,密码是tiger
create user baby@localhost identified by 'tiger';
2.显示用户权限
show grants for username@ip;
3.授权
grant权限1,权限2,..on 数据库名.* to username@ip;
DML权限:insert,delete,update
DQL权限:select
DDL权限:create,alter,drop...
4.撤销权限
revoke 权限1,权限2...on 数据库名.*from username@ip
5.删除用户
drop user username;
使权限立即生效:
flush privileges;
关联查询
有的时候,我们查询的数据不在一张表中,可能会涉两张表,或多张表,此时我们使用关联查询
格式:select * from tname1,tname2;
--查询两张表emp和dept
select * from emp,dept;
笛卡尔积:在做多张表查询时,出现的记录数为在做这些表的记录数的乘积。
通常,笛卡尔积没有价值(数据冗余)不需要。
t1 有10条记录
t2 有20条记录
查询附数目为10*20
等值查询:两张表的字段有关系的查询,做等值连接,需要使用where条件。
使用表别名:
Select e.ename“员工姓名”,e.deptno“部门号”from emp e,d,where e.deptno=d.deptno;
练习:
--5.查看10,20,30号部门中姓名带A的员工编号
select empno,ename,deptno from emp where ename like'%A%' and deptno in(10,20,30) ;
--6.查看10,20号每个部门的最高月薪,平均奖金,部门人数
select max(sal+ifnull(comn,0)),avg(ifnull(comn,0)),count(*) from emp where deptno in(10,20) group by deptno;
--7.查看部门平均工资大于1000的所有部门号,平均奖金,按照部门号降序排序
select deptno ,avg(ifnull(comn,0)) from emp group by sal having avg(ifnull(sal,0))>1000 order by deptno DESC;
--8.查询领导编号
select distinct mgr from emp where mgr is not null;
--1.等值查询
--练习1.查询部门表的名称及其每个部门员工的员工编号和姓名及其职位,部门编号。按照部门号降序排列。
select dname,empno,ename,job,e.deptno"部门编号" from emp e,dept d where e.deptno=d.deptno order by e.deptno DESC;
--练习2.使用join on 进行等值连接
select dname,empno,ename,job,emp.deptno"部门编号" from emp join dept on emp.deptno=dept.deptno order by emp.deptno DESC;
--练习3.查询20和30部门的部门名称和部门地址和员工名称和工资
select e.deptno"部门编号",dname,ename,e.sal from emp e join dept d on e.deptno=d.deptno where e.deptno in(20,30)order by e.deptno;