首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每天一道大厂SQL题【Day12】微众银行真题实战(二)

相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。...--下面补充如何将文件的数据导入到分区表中。...bad_cnt int, bad_cnt_rate decimal(7, 6) ) partitioned by (ds string comment '结果分区'); 在贷客户数:指在某一时点,有未偿还贷款余额的客户数...在贷余额:指在某一时点,所有未偿还贷款的总金额。 不良余额:指在某一时点,所有不良贷款(即次级、可疑和损失类贷款)的总金额。 余额不良率:指在某一时点,不良余额占在贷余额的比例。...2、先将结果表画出来,包括结果字段名有哪些,数据量也画几条。这是分析他要什么。 从源表到结果表,一路可能要走多个步骤,其实就是可能需要多个子查询,过程多就用with as来重构提高可读性。

65310

2、关于数据库事务那些事

比如前面的余额操作,不管哪一步失败了,前后的账户都不应该多出或少掉500,因为最终事务如果没有提交,事务中所做的修改也不会保存到数据库中。 隔离性(Isolation):这个特性通常适用在并发中。...一个事务所作的修改在最终提交前,对其他事务是不可见的。如前面第2条SQL从老板账户扣钱500元的时候,如果事务还没提交,此时另一个线程查询老板的账户,其看到的账户余额是没有减去500的。...一般在READ UNCOMMITTED(未提交读)隔离级别中会出现。在此隔离级别中,事务中的修改,即使没有提交,对其他事务也是可见的。...未提交读(READ UNCOMMITTED):在此隔离级别中,事务中的修改,即使没有提交,其他事务也都是可见的。事务可以读取未提交的数据,此时就会产生脏读。...每开始一个新的事务,版本号都会自动递增,事务开始时的版本号会作为事务的版本号,用于和查询到的每行记录的版本号进行比较。

14910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kaggle $70000奖金池 竞赛经历分享 — Home Credit 房屋信贷违约风险(一)

    每笔贷款都有自己的行,并由功能SK_ID_CURR标识。训练申请数据附有TARGET,表示0:贷款已偿还或1:贷款未偿还。...bureau_balance:信贷局以往信贷的每月余额;该表每一行代表每个月向历史局报告的每个信用证的历史记录。...credit_card_balance: 客户对Home Credit的以前信用卡的月度数据。每行是信用卡余额的一个月,单个信用卡可以有多行。...我们在训练集数据中很快找到了TARGET,这就是关于本次比赛的目标变量,具有两个取值0和1。'0' : 表示贷款已还 ;'1' : 表示贷款未偿还。...表中的第一列表示:SK_ID_CURR=100001贷款这位客户所有信用(credit)记录中months_balance的平均数是-11.78多。

    2.5K40

    并发锁 (四) : innodb 事务

    innodb 从Mysql5.5版本开始,InnoDB是默认的表存储引擎。其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。...保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback) 在innodb中,每次执行sql语句都会开启事务用于实现mvcc 实现策略 在每一行数据中额外保存两个隐藏的列...这里的版本号并不是实际的时间值,而是系统版本号。 每开始新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询每行记录的版本号进行比较。...(即上述事务id为2的事务查询时,依然能读取到事务id为3所删除的数据行) 2) 创建版本号 小于或者等于 当前事务版本号 ,就是说记录创建是在当前事务中(等于的情况)或者在当前事务启动之前的其他事物进行的...除了隐式的开启事务之外,事务一般用于处理操作量大,复杂度高的数据 例如用户充值需要更新充值表状态,以及用户余额,为了避免在更新的时候,成功更新充值表,但是却突然出错,没有更新用户余额的情况,可以增加事务

    41220

    Mysql事务

    > create table rumenz(id int primary key auto_increment)engine=innodb; SQL语句的执行过程 连接器:从MySQL客户端登录,需要连接器来连接用户和...查询缓存:MySQL在收到一个请求后,会先去缓存中查找,是否执行过这条SQL语句,之前执行过的SQL语句结果会以key-value的形式直接存储到缓存中,key是查询的语句,value是查询结果集,如果能通过...SQL语句直接查询到缓存中的结果集,则直接返回。...InnoDB实现MVCC,多个版本的数据就可以共存。用到的技术和数据结构。 隐藏列:InnoDB每行都有隐藏列,隐藏列中包含了本行数据的事务ID, 指向undo log的指针等。...不可重复读 时间 事务A 事务B T1 开始事务 开始事务 T2 查询rumenz的余额为100元 T3 修改rumenz的余额由100到200 T4 提交事务 T5 查询rumenz的余额为100

    1.7K10

    MySQL基础:SQL分类DDL、DML、DQL、DCL;函数、约束、多表查询、事务、并发事务四大问题、事务隔离级别——脏写、脏读、不可重复读、幻读

    ;SQL语句编写完毕之后,就可以在MySQL的命令行中执行SQL,然后也可以通过 desc 指令查询表结构信息。...,用于限制存储在表中的数据。...比如现在余额表中余额大于0的账户有2条,分别是Jenny和Tom,他们的富有程度都是贫穷。...读未提交隔离级别下,事务 B 修改余额后,事务 A 能够马上看见,即使事务B还未提交,所以事务 A 中余额 R1 查询的值是 200,余额 R2、R3 也是 200.读提交隔离级别下,事务 B 修改余额后...当B事务要去更新Tom的账户余额时,是获取不到锁的,必须等待直至事务A完全提交。

    1.1K20

    分布式高并发系统如何保证对外接口的幂等性?

    不知道你有没有遇到过这些场景: 有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。 我们在项目中为了解决接口超时问题,通常会引入了重试机制。...一般情况下,sql是这样的: update user amount = amount-100 where id=123; 如果出现多次相同的请求,可能会导致用户A的余额变成负数。...通常情况下通过如下sql锁住单行数据: select * from user id=123 for update; 具体流程如下: image.png 具体步骤: 多个请求同时根据id查询用户信息。...判断余额是否不足100,如果余额不足,则直接返回余额不足。 如果余额充足,则通过for update再次查询用户信息,并且尝试获取锁。...此外,这里id字段一定要是主键或者唯一索引,不然会锁住整张表。 悲观锁需要在同一个事务操作过程中锁住一行数据,如果事务耗时比较长,会造成大量的请求等待,影响接口性能。

    35610

    【uniapp】实现买定离手小游戏

    ,从三张卡牌,挑选一张,中奖后将奖励进行发放,并且创建下一期,不多说了,说做就做 分析 前端分析 前端设计出页面以后,从接口处获得参与次数,押中次数以及当前期数、开奖时间,开奖时间获取到以后和现在的时间进行对比获得倒计时...DESC LIMIT 1"; $result = $conn->query($sql); if ($result->num_rows > 0) { // 读取查询结果中的一行数据...conn->query($sql1); if ($result->num_rows > 0) { // 读取查询结果中的一行数据 $row = $result->fetch_assoc...代码从POST请求中获取了期数 period、用户标识 openid、用户选择的数字 number以及押注金额 price。 代码查询数据库,获取系统中最后一期的信息,包括期数和是否已经处理的标记。...首先查询该用户的余额,并检查余额是否足够支付押注金额。 如果余额足够,进行余额扣除操作,更新用户余额,并将押注记录插入periods_data表中。

    49630

    看一遍就理解:MVCC原理详解

    它就是事务执行SQL语句时,产生的读视图。实际上在innodb中,每个SQL语句执行前都会得到一个Read View。 Read View有什么用呢?...MVCC实现原理分析 4.1 查询一条记录,基于MVCC,是怎样的流程 获取事务自己的版本号,即事务ID 获取Read View 查询得到的数据,然后Read View中的事务版本号进行比较。...100 creator_trx_id 100 然后再次回到版本链:从版本链中挑选可见的记录: 从图可得,最新版本的列name的内容是曹操,该版本的trx_id值为101。...所以SQL查询到的是name为曹操的记录。...值 m_ids 100,101 max_limit_id 102 min_limit_id 100 creator_trx_id 100 然后再次回到版本链:从版本链中挑选可见的记录: 从图可得,最新版本的列

    1.2K10

    隐藏了2年的Bug,终于连根拔起,悲观锁并没有那么简单

    在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。...于是,排查了所有账户(account表)更新的地方,还真找到一处bug。 大多数地方都使用了悲观锁,先for update查询一下,然后计算新的余额,再进行更新数据库。...但有一处竟然先查询到了计算了余额,然后再进行加锁,最后更新。 基本流程如下: 在上述情况中,虽然线程B进行了加锁处理,但由于计算新余额并未在锁中,导致虽然使用了悲观锁,但依旧存在问题。...from user where id between 1000000 and 1000020; 值得庆幸的是那张表的ID是自增的,于是用了id大于的条件,只差了最近的交易记录,才勉强把数据查询出来。...解决方案:将基于Hibernate的普通查询,改为基于原生SQL的查询。因为前面的普通查询只需要id,那么只用一条SQL查询ID即可,如果id为空,则不存在;如果id非空,则再进行下一步处理。

    54820

    Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day7】 —— 数据库2(事务)

    用户陈哈哈要把信用卡里最后100块钱额度转到他 的储蓄账户用来吃饭,那么需要至少三个步骤: 检査信用卡余额是否髙于100块钱。 从信用卡账户余额中减去100块钱。...在储蓄账户余额中增加100块钱。   上述三个步骤必须在同一个事务中执行,任何一个SQL失败,则必须回滚所有的SQL。...在前面 的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外一个账户查询余额SQL开始运行,则其看到的信用卡账户的余额并没有被减去100元。...SQL显示加锁写法: SELECT … LOCK IN SHARE MODE;   在查询语句后面增加LOCK IN SHARE MODE,MySQL就会对查询结果中的每行都加读锁,当没有其他线程对查询结果集中的任何一行使用写锁时...SQL显示加锁写法: SELECT … FOR UPDATE;   在查询语句后面增加FOR UPDATE,MySQL 就会对查询结果中的每行都加写锁,当没有其他线程对查询结果集中的任何一行使用写锁时,

    46520

    玩转Mysql系列 - 第20篇:异常捕获及处理详解

    本文主要围绕异常处理这块做详细的介绍。 此时我们需要使用游标,通过游标的方式来遍历select查询的结果集,然后对每行数据进行处理。...,test1表中的a字段为主键。...Mysql内部异常 示例1 test1表中的a字段为主键,我们向test1表同时插入2条数据,并且放在一个事务中执行,最终要么都插入成功,要么都失败。...,然后调用存储过程proc1,由于test1表中的a字段是主键,插入第二条数据时违反了a字段的主键约束,mysql内部抛出了异常,导致第二条数据插入失败,最终只有第一条数据插入成功了。...FOR SQLEXCEPTION SET hasSqlError=TRUE; ROW_COUNT()可以获取mysql中insert或者update影响的行数 掌握使用乐观锁(添加版本号)来解决并发修改数据可能出错的问题

    2.6K41

    MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

    但除开从锁粒度来划分锁之外,其实锁也可以从其他的维度来划分,因此也会造出很多关于锁的名词,下面先简单梳理一下MySQL的锁体系:以锁粒度的维度划分全局锁:锁定数据库中的所有表。...但对于锁的释放时机,在不同的隔离级别中也并不相同,比如在“读未提交”级别中,是SQL执行完成后就立马释放锁;而在“可重复读”级别中,是在事务结束后才会释放。...如果完全按照数据库规范来实现RC隔离级别,为了保证其他事务可以读到未提交的数据,那就必须得在SQL执行完成后,立马释放掉锁,这时另一个事务才能读到SQL对应写的数据,但在InnoDB引擎中,它基于MVCC...好比拿上述表举例子,现在要将ID>2的用户余额改为100,因此事务T1先查到了ID>2的3、9两条数据并上锁了,然后开始更改用户余额,但此时事务T2过来又插入了一条ID=6、balance=320的数据并提交...,等T1修改完了3、9两条数据后,此时再次查询ID>2的数据时,结果发现了ID=6的这条数据余额并未被修改、数据行比原来还多了。

    12.1K810

    精通Java事务编程(3)-弱隔离级别之快照隔离和可重复读

    表中的每行都有个 created_by 字段,其中包含将该行插入到表中的的事务ID。都有个 deleted_by 字段,最初是空的。...这样的一笔UPDATE 操作在内部会被转换为一个 DELETE 和一个 INSERT 。图-7中,事务13从账户2扣100,将余额从 500改为400。...account 表会出现两条账户2的记录: 余额为500的行被标记为被事务13删除 余额为400的行由事务13创建 一致性快照的可见性规则 当事务读DB时,通过事务ID可决定哪些对象可见,哪些不可见。...所有中止事务所做的任何修改全部不可见 较晚事务ID(即晚于当前事务开始)所做的任何修改不可见,而不管这些事务是否已完成提交 此外的所有其他写入都对应用查询可见 以上规则适用于创建、删除操作。...图-7中,当事务12从账户2读时,会看到500余额,因为500余额的删除是由事务13完成的(根据规则 3,事务12看不到事务13执行的删除),同理400美元记录的创建也不可见。

    1.4K10

    数据库事务详解

    隔离性(Isolation) 如果事务之间不是隔离的,可能会出现以下问题: (1) 脏读(dirty read):一个事务在处理过程中读取了另外一个事务未提交的数据。...例如事务A中a给b转100块钱,在该事务中首先a的账户减100块,而在此时事务B中查询a的账户发现a少了100块,然后事务A中b账户加钱时发生了意外导致事务A回滚。...例如事务C中b要提现100块,首先查询b账户余额发现有100块满足提现要求,此时事务D中b转账100给a并且提交事务成功,在事务C中再次查询b的账户余额发现已经没有钱了。...(3) 幻读(phantom read):事务E中对一个表中所有数据做了从0修改为1的操作,这时事务F又向这个表插入了一行数据,而这个数据项中值为0并提交事务。...每个查询必须去检查每行数据的版本号与事务的版本号是否相同。

    59160

    被百度严格拷打 62 分钟,汗流浃背!

    另外,不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。...所有的查询语句都是从FROM开始执行,在执行过程中,每个步骤都会生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入,最后一个步骤产生的虚拟表即为输出结果。...然后有两个并发的事务,事务 A 只负责查询余额,事务 B 则会将我的余额改成 200 万,下面是按照时间顺序执行两个事务的行为: 在不同隔离级别下,事务 A 执行过程中查询到的余额可能会不同: 在「读未提交...分析查询语句:使用EXPLAIN命令分析SQL执行计划,找出慢查询的原因,比如是否使用了全表扫描,是否存在索引未被利用的情况等,并根据相应情况对索引进行适当修改。...分页优化:针对 limit n,y 深分页的查询优化,可以把Limit查询转换成某个位置的查询:select * from tb_sku where id>20000 limit 10,该方案适用于主键自增的表

    45910

    sql基础之多表查询?嵌套查询?

    学习一下这个事情——sql基础之多表查询?嵌套查询? sql基础 SQL(Structured Query Language)结构化查询语言,是一个用于查询和操作数据库的标准语言。...不同类型的连接有: 内部联接 左连接 右连接 全面加入 JOIN 是查询的 FROM 子句中的 SQL 指令,用于标识您正在查询的表以及应如何组合它们。...如果可能,内联接将组合公共维度(前 N 列)上的列,并且仅包含公共 N 列中共享相同值的列的数据。在上面的示例中,User_ID 将是用于内连接的公共维度。...右连接尽可能组合公共维度上的列(前 N 列),返回第二个/右表中的所有行以及第一个/左表中的匹配行。 举一个例子 多表查询是SQL查询中的一个重要环节,用于从两个或更多表中查询相关数据。...,然后主查询利用这个结果从 Employees表中查找有相应DepartmentID` 的员工的姓名

    60410

    高并发下如何保证接口的幂等性?

    一般情况下,sql是这样的: update user amount = amount-100 where id=123; 如果出现多次相同的请求,可能会导致用户A的余额变成负数。...通常情况下通过如下sql锁住单行数据: select * from user id=123 for update; 具体流程如下: 具体步骤: 多个请求同时根据id查询用户信息。...判断余额是否不足100,如果余额不足,则直接返回余额不足。 如果余额充足,则通过for update再次查询用户信息,并且尝试获取锁。...只有第一个请求能获取到行锁,其余没有获取锁的请求,则等待下一次获取锁的机会。 第一个请求获取到锁之后,判断余额是否不足100,如果余额足够,则进行update操作。...后面有相同的请求过来,再执行相同的sql时,由于订单状态变成了3,再用status=2作为条件,无法查询出需要更新的数据,所以最终sql执行结果的影响行数是0,即不会真正的更新数据。

    40911

    高并发下如何保证接口的幂等性?

    一般情况下,sql是这样的: update user amount = amount-100 where id=123; 如果出现多次相同的请求,可能会导致用户A的余额变成负数。...通常情况下通过如下sql锁住单行数据: select * from user id=123 for update; 具体流程如下: 具体步骤: 多个请求同时根据id查询用户信息。...判断余额是否不足100,如果余额不足,则直接返回余额不足。 如果余额充足,则通过for update再次查询用户信息,并且尝试获取锁。...只有第一个请求能获取到行锁,其余没有获取锁的请求,则等待下一次获取锁的机会。 第一个请求获取到锁之后,判断余额是否不足100,如果余额足够,则进行update操作。...后面有相同的请求过来,再执行相同的sql时,由于订单状态变成了3,再用status=2作为条件,无法查询出需要更新的数据,所以最终sql执行结果的影响行数是0,即不会真正的更新数据。

    40740

    MySQL 可重复读,差点就让我背上了一个 P0 事故!

    _bin; 扣减余额时,sql 语序如下所示: ?...为什么相同查询了这么多次? 其实这些 SQL 语序并不在同个方法内,并且有些方法被抽出复用,所以导致一些相同查询结果没办法往下传递,所以只得再次从数据库中查询。...但是从上面表结构,可以得知此次数据库被切换成 MySQL,系统其他任何代码以及配置都不修改(sql 存在小改动)。...如果 t5 查询最新结果 id=1 balance=900,这就读取到事务 1 未提交的数据,显然不符合当前事务隔离级别。...重点来了,当前这条记录的最新版本数据为 (1,900),但是最新版本事务 id,却是事务 2 创建之后未提交的事务,位于活跃事务数组中。所以最新记录版本对于事务 2 是不可见的。

    1K10
    领券