# 数据来源:在单表emp下
# 子查询:将一条查询sql的结果作为另一条sql的条件
# 思考:每个部门最高薪资的那个人所有信息
# 子查询的sql
select dep, max(salary) from emp group by dep;
# 子查询 - 查
select * from emp where (dep, salary) in (select dep, max(salary) from emp group by dep);
# 将子查询转换为一张表
# 创建一个存子查询数据的一张表
create table t1(dep_name varchar(64), max_salary decimal(5,2));
# 子查询 - 增
insert into t1 select dep, max(salary) from emp group by dep;
# 需求
select name, dep_name, salary
from emp join t1
on emp.dep=t1.dep_name and emp.salary=t1.max_salary;
# 子查询 - 改(update更新的表不能 与 子查询select的表同表)
# 每个部门最大薪资+1
update t1 set max_salary=max_salary+1;
# 给t1额外增加一个新部门
insert into t1 values ('打杂部', 100);
# 子查询 - 改
update t1 set max_salary=max_salary+1 where dep_name in (select distinct dep from emp);
# 错误:update更新的表 与 子查询select的表 相同
update t1 set max_salary=max_salary+1 where dep_name in (select distinct dep_name from t1);
# 子查询 - 删
delete from t1 where dep_name in (select distinct dep from emp);
# 错误: delete删除的表 与 子查询select的表 相同
delete from t1 where dep_name in (select distinct dep_name from t1);
语法规则:
案例
select * from emp where salary < all(select salary from emp where id>11);
数据依赖:单表emp
1)视图是存在内存中的临时表
2)视图的创建依赖select语句,所有就是select语句操作的结果形参的表
3)视图支持对数据的增删查改 ?
4)视图不允许对视图表的字段做修改
5)视图不仅支持创建,也支持更新与删除
格式:create view 视图名[(别名们)] as select 语句;>
eg>>: create view v1 as select dep, max(salary) from emp group by dep;
格式:create or replace 视图名[(别名们)] as select 语句;
eg>>: create or replace view v2 as select id,name,age,salary from emp;
格式:alter 视图名[(别名们)] as select 语句;
eg>>: create or replace view v1(dep_name, max_salary) as select dep, max(salary) from emp group by dep;
eg>>: alter view v1(name, salary) as select dep, max(salary) from emp group by dep;
格式:mysql>: drop view 视图名
eg>>: drop view v1;
格式:
select name, dep_name, salary
from emp join v1
on emp.dep=v1.dep_name and emp.salary=v1.max_salary;
前提,视图的增删改操作可以直接映射给真实表(本质就是对真实表进行操作),视图可以完成增删改,增删改本质是直接对创建视图的真实表进行操作
格式:create or replace 视图名[(别名们)] as select 语句;
eg>>: create or replace view v2 as select id,name,age,salary from emp;
格式:delete from 视图名 [条件];
eg>>:delete from v2 where id=1;
格式:updata [数据库名.]表名 set 字段1=值1[, ..., 字段n=值n] [条件];
eg>>:update v2 set salary=salary+1 where id=1;
总结:操作视图,会影响真实表,反之也会影响
事务:通常一些业务需要多条sql参与,参与的sql会形参一个执行整体,该整体我们就称之为 事务,简而言之,事务 - 就是保护多条执行的sql语句,比如,转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户
# mysql中事务的执行
create table bank(
id int,
name varchar(16),
money decimal(65, 2)
);
insert into bank values(1, 'Tom', 10), (2, "Bob", 10);
# 假设出现以下执行情况
# 没有事务支持情况下,Tom的钱就丢了
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei';
# 将两条sql看做事务处理
# 开启事务
begin;
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei';
# 确认无误,提交事务
commit;
# 确认有误,回滚
rollback;、
原文:https://www.cnblogs.com/randysun/p/11629956.html