• 数据库子查询、视图、事务


    """
    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:分组后对 聚合函数 进行排序,能使用 聚合函数 别名
    limit:条数 | 偏移,条数
    
    
    2、多表查询
    内连接:from emp inner join dep on emp.dep_id = dep.id  只保存两表有对应关系的记录
    左连接:from emp left join dep on emp.dep_id = dep.id   左表记录全部保存,右边没有对应记录空填充
    右连接:from emp right join dep on emp.dep_id = dep.id  右表记录全部保存,左边没有对应记录空填充
    全连接:
    from emp left join dep on emp.dep_id = dep.id
    union
    from emp right join dep on emp.dep_id = dep.id
    """
    

    联合分组

    # 数据来源:在单表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;
    
  • 相关阅读:
    java插入语句中有单引号的处理
    mybatis批量插入
    用Resttemple从数据接口中取出数据
    java1.8Stream流式算法
    rabbitmq启动命令
    【MySQL】Mysql模糊查询like提速优化
    Mybatis基础知识点:trim标签的使用
    java8 array、list操作 汇【20】)- (FlatMap)用法汇总
    编写一个定制的收集器
    mysql
  • 原文地址:https://www.cnblogs.com/17vv/p/11593755.html
Copyright © 2020-2023  润新知