zoukankan      html  css  js  c++  java
  • 子查询&视图&事务

    联合分组

    # 数据来源:在单表emp下
    
    # 联合分组:按多个字段综合结果进行分组
    
    # 按 area与port组合后的结果进行分组,只有组合后的结果还一致,才认为是一组
    select group_concat(name),area,port from emp group by area,port;
    

    子查询

    # 增:insert into 表 select子查询
    # 删:delete from 表 条件是select子查询(表不能与delete表相同)
    # 查:select 字段 from 表 条件是select子查询
    # 改: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:区间修饰条件

    # 语法规则
    # where id in (1, 2, 3) => id是1或2或3
    # where id not in (1, 2, 3) => id不是1,2,3
    # where salary < all(3, 6, 9) => salary必须小于所有情况(小于最小)
    # where salary > all(3, 6, 9) => salary必须大于所有情况(大于最大)
    # where salary < any(3, 6, 9) => salary只要小于一种情况(小于最大)
    # where salary > any(3, 6, 9) => salary只要大于一种情况(大于最小)
    in < > ()
    # 案例
    select * from emp where salary < all(select salary from emp where id>11);
    

    视图:view

    # 数据依赖:单表emp
    """
    1)视图是存在内存中的临时表
    2)视图的创建依赖select语句,所有就是select语句操作的结果形参的表
    3)视图支持对数据的增删查改 ?
    4)视图不允许对视图表的字段做修改
    5)视图不仅支持创建,也支持更新与删除
    """
    # 语法
    # 创建视图
    mysql>: create view 视图名[(别名们)] as select 语句;
    eg>: create view v1 as select dep, max(salary) from emp group by dep;
    
    # 创建或替换视图
    mysql>: create or replace 视图名[(别名们)] as select 语句;
    mysql>: 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 view v2 as select id,name,age,salary from emp;
    update v2 set salary=salary+1 where id=1;
    delete from v2 where id=1;
    
    create or replace view v3 as select * from emp;
    insert into v3 values(1, 'yangsir', '男', 66, 1.11, '上海', '那噶的', '教职部');
    
    # 总结:操作视图,会影响真实表,反之也会影响
    update emp set salary=salary+1 where id=1;
    

    事务

    # 事务:通常一些业务需要多条sql参与,参与的sql会形参一个执行整体,该整体我们就称之为 事务
    # 简而言之:事务 - 就是保护多条执行的sql语句
    # 比如:转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户
    
    """ 事务的四大特性
    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;
    
  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/hyc123/p/11596039.html
Copyright © 2011-2022 走看看