子查询|视图事务

子查询|视图|事务

一、子查询

  1. 增:insert into 表 select子查询
  2. 删:delete from 表 条件是select子查询(表不能与delete表相同)
  3. 查:select 字段 from 表 条件是select子查询
  4. 改:update 表 set 字段=值 条件是select子查询(表不能与update表相同)
# 数据来源:在单表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);

二、all与any:区间修饰条件

语法规则:

  1. where id in (1, 2, 3) => id是1或2或3
  2. where id not in (1, 2, 3) => id不是1,2,3
  3. where salary < all(3, 6, 9) => salary必须小于所有情况(小于最小)
  4. where salary > all(3, 6, 9) => salary必须大于所有情况(大于最大)
  5. where salary < any(3, 6, 9) => salary只要小于一种情况(小于最大)
  6. where salary > any(3, 6, 9) => salary只要大于一种情况(大于最小)

案例

select * from emp where salary < all(select salary from emp where id>11);

三、视图(view)

数据依赖:单表emp

1)视图是存在内存中的临时表
2)视图的创建依赖select语句,所有就是select语句操作的结果形参的表
3)视图支持对数据的增删查改 ?
4)视图不允许对视图表的字段做修改
5)视图不仅支持创建,也支持更新与删除

  1. 创建视图

格式:create view 视图名[(别名们)] as select 语句;>
eg>>: create view v1 as select dep, max(salary) from emp group by dep;

  1. 创建或替换视图

格式:create or replace 视图名[(别名们)] as select 语句;

eg>>: create or replace view v2 as select id,name,age,salary from emp;

  1. 修改视图

格式: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;

  1. 删除视图

格式:mysql>: drop view 视图名
eg>>: drop view v1;

  1. 视图可以作为正常表完成连表查询

格式:

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语句,比如,转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户

5.1事务特性

  1. 原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功
  2. 一致性:事物前后的数据完整性应该保持一致(数据库的完整性:如果数据库在某一时间点下,所有的数据都符合所有的约束,则称数据库为完整性的状态)
  3. 隔离性:事物的隔离性是指多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
  4. 持久性:持久性是指一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

# 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

时间: 2024-11-17 08:25:47

子查询|视图事务的相关文章

子查询&amp;视图&amp;事务

联合分组 # 数据来源:在单表emp下 # 联合分组:按多个字段综合结果进行分组 # 按 area与port组合后的结果进行分组,只有组合后的结果还一致,才认为是一组 select group_concat(name),area,port from emp group by area,port; 子查询 # 增:insert into 表 select子查询 # 删:delete from 表 条件是select子查询(表不能与delete表相同) # 查:select 字段 from 表 条件

子查询、事务

子查询.事务 联合分组 # 数据来源:在单表emp下 # 联合分组:按多个字段综合结果进行分组 # 按 area与port组合后的结果进行分组,只有组合后的结果还一致,才认为是一组 select group_concat(name),area,port from emp group by area,port; 子查询 # 增:insert into 表 select子查询 # 删:delete from 表 条件是select子查询(表不能与delete表相同) # 查:select 字段 fr

子查询、事务、python操作mysql、索引

复习 """ 1.单表查询 增删改查的完整语法 select distinct 字段 from 表 where group by having order by limit 比较:> < = 区间:between and | in | not in 逻辑: and or not 相似:like _% 正则:regexp 聚合函数:group_concat().max() having:可以对 聚合函数 结果进行筛选,不能使用 聚合函数 别名 order by:分组

数据库之子查询和事务隔离级别

数据库大的知识点,特此补上.看的还是<漫画数据库>. 一.查询 如果要从一个数据库里面检索出某一字段为最大的数据项,那用什么方法呢?--其实用子查询就可以查到. 1)子查询是查询里面再嵌套查询. people表: 如果我要查询年龄最大的那一行数据项.就可以使用子查询. select * from people where age = (select max(age) from people); 选出people里面的最大年龄,再选出年龄等于最大值的数据. 当然,还有另外一种方法. select

sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date desc 逻辑上看着挺对 但是报错: 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效.   只要我们在嵌套子查询视图里面加入: top 100 percent 即可 select * from ( select top 100

除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

报错: 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效. 只要我们在嵌套子查询视图里面加入:top 100 percent即可 例如: select * from ( select top 100 percent * from tb order by col desc ) as a order by col desc

mysql之子查询、视图、事务及pymysql等(待修改)

联合分组 # 数据来源:在单表emp下 # 联合分组:按多个字段综合结果进行分组 # 按 area与port组合后的结果进行分组,只有组合后的结果还一致,才认为是一组 select group_concat(name),area,port from emp group by area,port; 子查询 # 增:insert into 表 select子查询 # 删:delete from 表 条件是select子查询(表不能与delete表相同) # 查:select 字段 from 表 条件

联合分组、子查询、视图、事务、python操作mysql、索引

目录 联合分组.子查询.视图.事务.python操作mysql.索引 一.联合分组 二.子查询 三.all 与any:区间修饰条件 四.视图:view 视图的增删改 五.事务 5.1.事务的概念 5.2.事务的四大特性 六.pymysql 模块:python操作mysql 6.1 安装pymysql 模块 6.2 python用pymysql 操作mysql步骤 6.3 游标操作 6.4 pymysql事务 6.5 sql注入 七.索引 联合分组.子查询.视图.事务.python操作mysql.

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.比如SilverStream就是基于数据库的一种中间件.ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能:作为一个关系数据库,它是一个完备关系的产品:作为分布式数据库它实现了分布式处理功能.但它的所有知识,只要在一种机型上学习