连接接查询和事务

##1 连接查询
                          内     连接
1):    select ... from 表1 inner join 表2 on 连接条件 WHERE ... group by ... HAVING ... ORDER BY ... limit ...
    
                          左    外  
2):    select ... from 表1 left [outer] join 表2 on 连接条件 (重点)

        左外连接,首先将符合连接条件的记录连在一起,作为结果,其次左边表中不符合连接条件的记录也会出现在结果中,只不过它对应的右边的列都是NULL
    
                          右    外
3):    select ... from 表1 right [outer] join 表2 on 连接条件
        
    
                          全
4):    select ... from 表1 full join 表2 on 连接条件 (mysql不支持全连接)


        左外和右外与表的先后次序有关,而内连接与表的先后次序无关


注意:
    1) 内连接是将两张表中所有符合连接条件的数据列入结果,不符合连接条件的结果中没有,例如40号部门
    2) 如果连接的两表中有同名的列,列前面要加表名(或表别名)来区分(否则会报歧义错误)
    3) inner join ... on 的写法是符合SQL-92标准写法,其实还有一种内连接的写法:        
    select ... from 表1, 表2 where 连接条件;        
    例: 还是连接部门表和员工表 select * from emp a, dept b where a.deptno=b.deptno;


##2 多表连接
    select * from 表1
        inner join 表2 on 连接条件
        inner join 表3 on 连接条件
        ...
        
    例子
    select * from student a inner join sc b on a.sid = b.sid
                             inner join course c on b.cid = c.cid
                             inner join teacher d on c.tid = d.tid
                             order by a.sid, b.cid;
    
    等价写法:
    select * from student a, sc b, course c, teacher d
                 where a.sid=b.sid and b.cid=c.cid and c.tid=d.tid;
    
    左外多表连接:
    select * from student a left join sc b on a.sid = b.sid
                             left join course c on b.cid = c.cid
                             left join teacher d on c.tid = d.tid
                             order by a.sid, b.cid;
    注意:左外多表连接要全部使用left join,不能再出现inner join 因为当表中有空值时 将不知道怎么匹配连接
    
    性能上:连接的表越多,性能越低, 可以把连接查询变成分多次查询


##3  自连接
    一个表自己和自己连接(常用于树状结构的数据表示)
    例:
    select a.empno,a.ename,a.mgr,b.empno,b.ename,b.mgr
     from emp a left join emp b on a.mgr=b.empno;

    
##4 子查询

把某个select结果当做一个值,或一张表做进一步的查询


情况1:找具有最高工资的员工信息(子查询作为值)

select max(sal) from emp; // 5000

select * from emp where sal = (select max(sal) from emp);

扫描二维码关注公众号,回复: 3176336 查看本文章

把select max(sal) from emp当成了一个值,代入到主查询当中,代入时需要在子查询的两边加()


情况2: 获取每个部门的平均工资和部门的名称(子查询作为表)
先查询平均工资
(select deptno,avg(sal) from emp group by deptno) a

分组后 select,order by 的限制
  1) select,order by 中的列必须和group by中的列一样
  2) 其它没有包含在 group by语句中的列,必须和组函数一起用

再把子查询看做临时表,与其它表做表连接
select * from (子查询)a inner join dept b on a.deptno=b.deptno;
    

##5 事务
DDL(数据定义语言) create alter drop truncate
DML(数据操控语言)insert update delete select
TCL(事务控制语言) start transaction, commit, rollback

## 5.1 start transaction 开始事务 (begin)
## 5.2 commit 提交事务
## 5.3 rollback 回滚事务

所谓的事务,就是指一个事务内,多条sql语句是作为一个整体执行的。
一个事务内的多条sql是作为一个原子操作,不可以被分割。要么都成功,要么都不成功。

start TRANSACTION;
UPDATE
UPDATE
INSERT
DELETE
commit;//或者 rollback;
如果这个事务内多条sql全部成功 COMMIT(让更改都生效)
如果这个事务内有sql失败了,Rollback(让更改都撤销)

事务内所有更改,在结束之前,对于其它用户来讲都是不可见的。
事务commit提交时,这些更改才会真正生效,其它用户才能看到你的更改。
事务执行中如果出现意外情况,这时候可以执行rollback,可以撤销事务内所有更改,恢复到事务开始的时刻
commit 和rollback都意味着事务结束


事务有四大特性
ACID
A 原子性, 指事务内多条sql是作为一个整体执行
C 一致性, 事务开始前后,整个数据的状态应当一致
I 隔离性, 指事务的隔离级别(未提交读,提交读,可重复读,序列化读)
D 持久性, 事务中做的更改必须在事务结束后永久生效
如:增删改查(insert update delete select)  简称CRUD   c  insert 插入   r  select 查询  u  update 更新   d  delete 删除
     
      
##6 DCL 数据控制语言

grant 授权
revoke 回收权限
例:
使用root 给user1授权
grant all on test3.* to 'user1'@'localhost';
all 是代表所有权限:select,insert,update,delete...
test3.* 是权限的范围:test3库中所有对象
to 后面跟的是用户    

猜你喜欢

转载自blog.csdn.net/qq_42736375/article/details/81985850