数据库连不上是不是特别让人头大?今天教你个简单方法,排查五个问题就能搞定。首先看看驱动装对没, 这就像开车得有合适的钥匙,驱动版本和数据库不匹配,肯定百搭。然后检查连接地址,是不是服务器 ip 或者端口号输错了, 就像快递地址写错了,东西肯定送不到。接下来是账号和密码,这俩就像家门的密码锁, 输错一个字母都进不去,记得看看有没有大小写搞错误。最后确认一下数据库服务是不是正常运行, 要是服务器都没开,那肯定连不上呀,就像商店没开门,咱们也买不到东西。下次遇到数据库连接问题,就按这五步挨个检查,保证能少走很多弯路。
粉丝23获赞465

count if count if is 长数字查重复,比如把重复的身份证号码查出来,你会输入公式, count of 第一个参数选择 c 列,第二个参数选择 c 二,回车 双击填充就完成了。但是你会发现一个问题, 如果把相同的 c 三最后一个数字改成一,他还是显示技术,两个明明不同了呢。这是因为 conj f 只能计算十四位数字,超了就会忽略后面的。如果我们改十四位处的数字,就技术为一个了。 那怎么解决计算长数字的情况呢?方法也很简单,只需要在第二个参数最后加上连接符和信号即可,回车就完成 成了。在双击填充下,现在就可以正确技术了,再随便改下数字,测试下,结果也是准确的。 你会了吗?觉得实用请关注哦,我会定期更新。

那这个是给你们演示一下怎么用 j d b c 连接数据库的第一步得要先安装好 mexico, 它的这个密码是千万不要忘记了,等一下还需要用。接下来我们打开 navycat, 然后连接我们的数据库,连接名称随便取一个,然后密码的话就是你刚刚安装 my secret 使用的密码。接下去就是双击你的这个连接,让他们都变成绿色,就代表已经连接上了。 然后我们再右键新建一个数据库的名称就不是很重要了,随便取一个自己喜欢的就行, 我这里数据库名字就叫做黄。既然我们都有了数据库,那接下来再创建一个学生表,这里面学生姓名和学生班级都是 word 型的, 学生 id 可以 作为主键,它的类型就是 int 型的,也是不为空。最后一个 score 也就是学生成绩类型是 double 型的。我这里书的长度是四小数,点是两位小数,但是我后面发现它写一百的时候这个长度不够用了,所以说最好这个长度还是写为五 好。弄完之后我们保存一下这个表,命名为黄, 我们增加一下表的数据,班级为二次互联网应用技术,姓名为乘十, id 十一, 成绩为九十八。然后如果想要增加更多的数据,就点一下下面的这个加号,我也就不再过多说了。 刚刚的完成以后,我们就可以进入第二步,先新建一个项目,名称为 test, 我 们创建一下新的目录,命名为 lib l i b, 这个到时候就是拿来放他的驱动包的。 好,我们先找一下它的驱动包,我们找到这个 mexico connector 的 文件,拖到我们刚刚新建的目录里面就可以了。 点击右上角一个数据库,然后添加数据源为 mexico, 这个用户为 root, 密码就是你的 mexico 密码,然后点击确定, 双击把它展开,然后查看它的所有架构。当然这一步并不是必要条件哈。 最后一步就是使用 ai, 然后辅助我们写代码,我这里使用的是非算 ai, 你 可以给他一个提示词或者一个句子,比如说 请帮忙连接到数据库 my sql, 然后他就在这里给我们吭哧吭哧的生成一大堆的代码。我们运行一下,发现好像出了点问题, 那这代码里面只有这个密码是还没有填过的,那我们只需要把密码调成我们自己的密码就可以了,我们再尝试一下。 嗯,又保存了,嗯,这一次可能还有一些其他的什么问题,我再看一下, 我好像知道了是这里的驱动包,它需要右键一下,然后添加为库,那这次应该是可以正常的显示了, 下次大家把驱动包拖进来的时候,记得先右键一下添加为库。这里面查询的结果也和我们刚刚创建的表格是一样的,那我们这期视频就先到这里。

使用 vlookup, 用一个信息查一个信息很容易,但是用 vlookup 一次查多个信息,你还会吗?不会。同学,咱们今天两分钟带大家搞定。那在这个案例里边,你们看啊,我这个时候换一个客户,比如换成洪七公,哎,就查出洪七公的两个信息啊, 如果换回郭靖,注意啊,我这里面切换成郭靖,哎,他就查询出郭靖的 n 个订单的信息,这叫一查多讲, vlook up, 一查多,我们得做个辅助列。我们首先选择,注意啊,我们先选择 a 五,这个单元格比较特殊啊,先选择 a 五等于什么呢?等于我们的客户姓名洪七公, 然后打上一个 on 的的符号。连接什么呢?连接一个记数 ct e 函数,然后打上左边括号,哎,记什么呢?记我们的洪七公,这人从上往下出现 几次,哎,那这个时候呢,我们选择什么呀?我们先选择他范围,从郭靖开始往下,哎,然后选择谁呢?哎,查谁呢?就查我们的洪七公,然后打上右边郭浩,注意,这还没完,注意啊,重点来了,我们希望待会公式往下拖的时候,这个范围的开头 变啊,但是下面呢,我跟着,希望他跟着变,所以我们要在公式里边处理一下,把这个 b 四,也就是他开头的位置设置一个 绝对用,按一下 f 四,把它设置为绝对用,然后点击回车。哎,这个时候,哎,他就计算出来,洪七公这是第一个,所以他拼出了洪七公一, 基于这个呢,我们把公式往上拖,哎,郭靖他也算出来,然后我们在双击十字架,把公式往下拖,大家注意啊,稍微给大家讲解一下,你看这是第二个郭靖,看到吧,从这个地方往下数,这是第二个郭靖,所以这个地方就出 出现郭靖二,明白了吗?这是很重要的一个辅助力,那有了辅助力之后的一对都查询就很简单了,我们只需要在里面输一个 vlookup, 查什么呢啊?我们查询的对象就是郭靖,这个打上一个按的符号,然后加上前面的序号, 注意,这个时候我们郭靖这个 f 三,我们也不希望它变化,对不对?所以我们在下面打上一个我们的 f 四啊,在这个地方呢,我们选中它,按一下 f 四,把它绝对引用, 然后这是我们的查询对象,那我们查询的范围是什么呢?这时候大家已经很明白了,是吧?从 a 列选择到我们的 c 列,那我们查第几个值呢?第三个值,然后最后呢是依旧是我们的 false 啊,然后点击回车, 这时候查询出第一个订单,双击十字架,出现后面几个订单,那有的人说我继续往下拉,容易出错,这个时候很简单, 我们只需要在 vlookup 的前面包上一个函数,是吧? if every 啊,然后双击它,然后在右面呢,哎,如果出错的时候,哎,就打上一个零啊,或者是打上一个空白的双引号, 做一个空子,点击回车,这时候我们再把公式往下拉,哎,你会发现里边就不会报错了,这时我们试一下换一个洪七公,你会发现洪七公只有两个订单啊,再换一下慕容付,你会发现,哎,慕容付有七个订单,这就完成了我们的一对多查询。 以上就是我们今天 vloocop 一对多查询的技巧,记不清的同学,没关系,看我视频下方领取我们的表格,回去自己练习,有收获!同学别忘了给曹老师右下角点个小心心啊!关注曹导,带大家解锁更多的 excel 办公技巧!

出事的环境我们准备好了之后,接下来我们就来一个一个完成这增山改查这四个功能。那么首先我们来说第一个功能,查询所有数据哈, 其实呢,将来你不管完成什么样的功能,简单也好,复杂也罢,用 gdbc 写代码是不是都要经过这七个过程?获取 ctrl 连接、定义 ceo 语句,获取普瑞派尔斯特曼对象,设置参数,执行 ceo 处理结果,最后释放资源,是不是都是这个套路呀? 但是在这套路里边,你要寻找到不变的和变化的,不变的你不要关注,重点关注变化的,对吧?哪些是变化的呢?获取卡那个是连接变不变啊, 不变嘛,对不对?他都是那样写啊,而变化的呢,就是这些我标红的这三个过程哈,就是功能不一样,思考语句肯定不一样吧,对吧? 功能不一样,功能所需要的参数不一样吧,那么功能不一样,那么将来功能所需要的返回结果是不是不一样?那么至于其他的,获取连接啊,获取普瑞派克斯的对象啊,执行死扣啊,释放资源呀,这都是固定的套路,你不用去重点关注的。 所以呢,我们现在虽然这个查询所有数据的功能比较简单哈,那我们也来分析一下查询所有数据的死口语记咋写啊?是不是死了个新服,让我们 tb 不让的就完事了?那么当前要完成查询所有数据的功能,要不要参数呀? 你想嘛,查询所有不需要参数啊,对不对?那么再来,那么既然是查询所有数据,那这个结果该如何封装呢?那你想所有所有嘛,就意味着有很多数据,对吧?有很多数据,将来我们是不是把这些数据要装到一个集合里边去?而且呢,这个集合里边每一条 记录是不是封装成一个,不让对象,这样把结果返回给用户是不是就可以了?好嘞,那么分析完这个过程之后呢,我们就打开矮地儿来写对应的代码哈, 在这个地方呢,我们第一步呢,写个测试用力,然后呢趴布雷克 void 这个地方呢,叫做泰斯特查询所有 select 哦,好,这个方法名写完,写完之后呢,我们还是一样来写个注视哈,在这个地方呢,写个文档注视,叫做查询所有。 那么在这块你要分析三件事,第一个事呢,就是你要分析完成的功能要用的四口语句, select、 星、 from tb、 bread, 是这样吧。然后第二个是要不要参数啊?虽然我们这个功能不要哈,但是将来其他的功能呢,很多都需要参数,你要能分析出来要哪些参数,参数怎么传递哈,这个地方呢是不需要的。 第三个是返回的结果呢?该如何封装呢?因为是查询所有啊,所以呢,我们要封装成一个例子的集合,里面放的是一个一个的不乱的对象。好嘞, 基本的逻辑分析完了之后啊,接下来我们就来写代码来完成这个功能哈,那么完成这个功能呢,你就要按照 gdbc 最初的步骤来写喽,第一步干啥呀? 非常好,是不是来获取这个连接的 connection 对象啊,对不对?那获取这个对象刚才我们学过数据库的连接词吧,卓越的,我们把这三行代码可以给他复制过来啊,那复制过来之后呢,我们直接把它粘到我们的这个测试用力里边来是不就可以了? 好嘞,那么复制过来之后呢,这里边有异常哈,我们需要把它抛出去就可以了,不用处理这个异常,现在好抛一个大的,将来其他的异常是不就 不再处理了?那么第一步是不是就做完了获取这个连接,获取连接这一块呢?我们把这个名呢改一下, cony next 改短一点哈。哎, 改短一点哈,那么改短一点之后呢,接下来再来第二步要干啥了?第二件事,你是不是就可以来定义这个色口语句了?好,色口呢,就是死吹类型的色口,等于一个字物串,而这个字物串刚才我们写过了,分析完事了粘过来就可以了, 对吧?好,站过来。那么死后有了之后呢,第三件事就是来获取这个 prepare 的死地上对象, 通过这个对象才能执行 ceo 语句吧,那就是 con next 个方法叫做 prepare state 呢,特把 ceo 传进去,返回一个 pstmt 对象。那么第四步是不是就来设置参数了?那么设置这个参数这一块,虽然没 你有参数我们这个 cco, 但是呢,这个步骤我还是把它写在这儿。那么接下来第五步,第五步呢,就可以来执行 circle 了,那么执行 circle 用的是 prepares determined 的方法,因为是查询语句,所以呢,我们使用的是 execute query 方法, 是不是选一下执行一下就完事了?返回一个蕊子奥的赛特对象,那么有了瑞子奥赛的对象之后,我们是可以来处理结果了, 那么处理这个结果这一块,因为我们需要的结果呢,是一个历史的不乱的,所以呢,这里边呢,你需要来做这么两件事情,第一件事情呢,就是将这个数据呢一行一行的数据给它封装为这个 普乱的这个对象,是吧?然后呢再将这个对象呢装载到这个利斯特的集合中 去,是不就完事了?好嘞,那么下来呢,我们来做一下这个事哈,处理结果这一块呢,首先要便利结果及 rs 点 next, 然后呢你要来获取对应的数据啊, 获取数据获取完数据之后呢,你是不是就来封装对应的不乱的对象,有了对象之后,你把对象再装载到集合去就完事了吧, 那么这个过程比较麻烦啊,我们待会来做,我们先把第七步最后一步释放资源的动作给他,完成了资源,那么释放资源有三个资源释放,第一个呢?谁啊? 非常好, rs 点儿可漏子吧。第二个呢, p s t m t 点儿可漏子,第三个 c o n n 第二可漏子。好嘞,那么下来我们就来完成这个结果的封装,那么结果这一块儿呢,首先第一个你要来获取数据,那获取数据这块儿呢, 就是用 rs 点 get 叉叉叉方法吧,那你要获取哪些数据?是不是要根据数据库表来看呀?所以呢,在这一块,我们在这一块这样做好,我们把数据库表这个列表呢,我们给他截个图,截完这个图之后呢,我们给他贴到桌面右上角呗,贴完了之后呢,我们照着这获取是不是就可以了?来 第一个获取的是 id, 所以呢,我们 get 的是印特吧。好,那么这个地方有两种选择,你要么在括号里边写这个列的名称 id, 要么你可以写这个列的编号一二三。是这样的吗?那你写啥呀? 建议各位啊,在这个地方呢,我们写这个列的名称,为什么写列的名称,你注意看哈,矮第二工具啊,如果你写列的名称,你看自动的给你提示返回值,返回完事之后呢,对应的这个变量名是不是帮你起好了呀,非常方便吧,而且呢, 写列的名称呢,阅读性更加方便一些哈,所以呢,我们写列名第一个有了,那么就来写一下 rs 点 get 第二个是不然的内幕吧,那么写 get stream, 然后里边传入 brnd 杠内幕,列的名称 写完了之后,你注意看哎,第二很贴心吧,他不仅帮你把这个括号字物串里边这个名字帮你补齐了,还可以给你选择是否用驼峰秘密啊啊,对,就要用这个好, 非常方便。第三个, rs 点 get a compliment 内幕也是死吹内心的,写一下 c o m p a n y 下划线内幕好,写完了之后呢,再来返回 complain name 那么第四个是 all day 的哈, r s 点 get int 类型的 o r d e r e d 哈,写完了之后也来返回一下。第五个, r s d r get 四吹类型的 describe 省 d s c r i p 亚文好,写完了之后直接返回一下,返回完事了之后呢,下来最后一个就是 rs 点 get status 是 int 类型的,写个 status 返回一下, 那么这个数据是不是就获取完事了哈,获取完数据之后呢,一定要注意啊,这里边的列的名称啊,要和这个表里边的列名保持一致哈,要不然你就获取不出来数据了, 那么数据获取完事之后就可以来封装不然的对象啊,那封装不然的对象呢?其实之前做过吧,创建一个不然的对象,然后呢, 补软的等于扭一个补软的对象吧。好,扭完了之后呢,就调用这个补软的的 set 方法来设置值就行了,挨个儿来呗,第一个 id, 然后第二个补软的点儿 set 补软的内幕,把补软的内幕放进来第三个补软的点儿 set compan name, 把 computer name 放进来第四个 brand 第二 set all didder, 把 all day 的数据放进来第五个 brand 点儿 set description, 把 description 放进来,然后呢,第六个最后一个 brand 点儿 set 斯 datas, 把斯 datas 放进来。 写完了之后啊,你会发现啊,获取数据和封装对象这玩意纯粹就是体力活对吧,也没有什么难度,就是烦,好,将来呢,我们会有解决方案的哈,现在呢,你得经历这个过程哈。 好,那么这个数据封装完成之后呢,我们刚才说过说不然的对象啊,你是不是可以把它放外边去来节约占空间呢?所以呢,不然的我们在外边等于一个浪,对吧?等于,那之后呢,这里边是不是每一个,不然的就附用刚才对应的这个局部变量是不是就可以了?好嘞,那么最后一步呢,我们是不是就来完成 双载集合的动作,装载集合呢?你是首先得有个集合呀,那么有个集合呢,在这块呢,我们创建一个历史的集合,里边放的是一个个不乱的对象,然后呢,我们叫做 br a n d breanth 等于 no 一个 everyleast。 好嘞,写完了,写完了之后呢,你调用这个 breanth, 然后呢,调用他的爱的方法,把你创建的这个不乱的对象放进来是不就 ok 了? ok 了之后呢,我们再把这个集合打印一下,看一下效果。打印的是不乱字哈,一定不要打印错了就可以了。好嘞,整个代码就写完了,写完了之后呢,我们来选中这个方法来执行一下, 看一下能不能把这三条记录打印出来呢?来看一下结果,你发现没有问题吧,一号数据,二号数据,然后最后一个是三号数据,是吧?好, 那么整个过程呢,其实呢,并不是很困难哈,但是呢,这里边有一个核心的思想,你要注意哈,就是将来呢,你完成不管任何功能呢,你都要分析这三件事。最后一句咋写呀? 当前这个功能完成的时候要不要参数啊?最后一个,当前这个功能做完了之后,我应该返回什么样的结果数据给其他人呢?好嘞,那么这个查询所有功能呢,我们就做完了。

相同类别的一对多查询,在这个表格中,要把每一个店铺对应的姓名一次性的提取出来,要如何做呢?左边这个表示数据表,我们需要把员工的姓名填写在右边这张表格每一个店铺的右边。 我们先来分析下这种查找的特点,每一个店铺对应多个姓名,如果单独只用 v 六 coup, 就只会找到每家店铺出现的第一个员工的信息, 因为唯一路靠把函数的特点就是一对一的查找,所谓一对多的思路,究其本质还是将其转化成一对一的状态,那么如何转呢?我们用添加辅助列的方式,在这个表,也就是我们的查询数据表的店铺名的左边,我们插入一列, 暂且取名叫辅助列吧,接着在这里输入等于 conty, 左括号 b 二,冒号 b 二,逗号 b 二,然后我们把第一个 b 二给锁定,右括号再向下填充。注意这里的 b 二就是我们需要一对多查找的那个一,这里就是店铺名了。 现在我们再看看我们的表格,你会发现辅助列的编号并不是唯一的,也有重复信息,店铺名也不是唯一的,也有重复信息,但是每一行的信息也就是编号,家电部的组合就是唯一的了。 这样我们就可以把刚才一对多的状态转化为多条件的查询。这个方法我在这一条分享过, 然后我们只需要做一件事,就是把编号和店铺名连接在一起,我们可以插入一列,直接把编号和店铺名用 n 的符号连接起来,直接输入等于 a r, n 的 b r。 但卓哥更喜欢这样,我直接在刚才的 count e 函数前面输入 b 第二 n 的,然后回车。你看,现在的辅助列就变成了店铺名加编号的状态。我问问各位,现在我们的辅助列是不是都是唯一一直没有重复状态的?关于 come 的想解你可以看这一集, 接下来我们就可以开始查找动作了。卓哥,先在结果上方查入一行数字,在这里输入一二,然后向右拉好了编号。有了,现在我们就在这里输入等于 v 六卡的左括号,点击左边的店铺名,也就是一二单元格的解放店,然后 输入 and 点击上方的编号一,你看,这样一来,我们的查找条件不就正好是我们的辅助列信息的吗?逗号选择查询区域就是以辅助列为首,选到员工,然后锁定逗号,接着输入三,表示我们查找的结果,在选择区域的第三列,最后输入零, 明确匹配诱惑号,回车。如果你还不了解 v 路卡布的使用原理,可以看这一集。接下来我们再向下填充,向右填充。哎,什么情况?怎么就 na 了? 你看,当我双击中间某一个 na 的时候,你会发现他的第一个参数查找条件是这个单元格,他左边和他上面的单元格不是标题行和标题列对应的。 嗯,还是因为锁定,这也是卓哥为什么如此强调锁定的原因。我们双击这个单元格,在 e 二的 e 左边输入刀了符号,表示锁定列号,接着在 f 一的一左边输入刀了符号,表示锁定行号。好了,回车,现在再向下向右填充就完成了。 如果你还不了解这种锁定,请看这一集。最后你也可以把这个表格中的第一行数字给隐藏。如果你无 法隐藏这行数字,你也可以把函数中的 f 一替换成 column 括号 a 一,此时 a 一无需锁定。就像这样,结果也是一样的。如果你不了解什么是 column, 可以看这一集, 这就是一对多的横向查找的通用套路。如果你觉得我的讲解对你有帮助的话,请帮忙点一下小心心。如果你想持续学习的话,可以点击关注,想要了解我的一个笑系统课程,记得给我私信留言哦!

hello, 今天给大家分享用下定 g、 d, b、 c 进行分库分表。首先呢,我们引入相关的依赖,包括下定 g, d, b、 c 的 starter, 包括连接池,包括集成 my betties 的依赖。 然后呢,我们看一下配置文件,在配置文件中呢,我们这边有两个数据源,一个是 m 一,一个是 m 二数据源, m 一其实就是我们真正的 test 这个库, m 二呢是我们的 test 二这个库, 然后我们在这边指定了他的主件的生成策略为 snowflake, 就是雪花算法,并且指定的主件是 id。 然后呢,我们在这边配上了分库和分表策略,那分库策略的一个分片键呢? 比如说我们以性别作为分篇键,分篇算法呢,我们可以用内置的这样的一个表达式,然后去表示,如果性别是激素, 那我们会存到我们 m 二库中,性别如果是偶数,这个里面的值呢就是一。然后我们会存到 m 一这个库中,那分表的一个分片键呢,是 id, 同样它的一个分片算法呢,依旧是把它合二进行去磨,并且加一运算, 如果 id 是偶数,它会存到我们的 uze 里面。如果 id 是基数,它会存到我们的 uz 二。那这边呢,有 test 和 test 二两个库,并且它们都有 user 一和 user 两张表。 然后呢,我们执行一下 test 方法,比如在这个方法里面,我们把它的一个 sex 设置一一的话,刚才我们分析它会到我们的 m 二库中,然后我们执行插入操作呢,它会帮我们用雪花算法生成我们的 id, 如果是基数的话,它会进入到我们的右 子二里面,如果是偶数呢,他会进入到 use 一表中,好执行一下,然后我们可以看一下啊, test 二库中, use 一和 use 二表中呢,就有对应的一个数据, 然后 test 这个库中呢, use 一和 use 二表中呢?都没有数据。那如果说大家想要这样的一个 demo 以及之前的 demo 的话呢,可以到这来这,然后给他去发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢,就到这。

你望着 spring j d b c。 的 query 方法,陷入了深深的沉思。它已经很简洁了,传入 sql, 传入参数,传入结果映射器就能拿到结果。但你总觉得还可以更简洁一点。你突然灵光一闪, spring j d b c。 的 那个 be in property roomapper 完全可以把它封装进方法里。你保留了可变参数 object 和 sql 矩阵参数增加, class 为给 be in property roomapper 的 构造方法。然后,你做了一件最关键的事,你用了范型, 你让返回类型跟着传入的 class 走。传 user class 就 返回 list。 user 传 order class 就 返回 list order。 你惊喜地发现,从这一刻起,你的查询可以返回任意类型的 list 了。只要提供范型类型,同时保留了字段与属性映射的功能。从此,你开启了 spring j d b c。 简化的新篇章。很快,新的问题又来了。 你发现 spring j d b c 只接收可变参数 object 点点点。这意味着你的条件全是散装的, 如果没有一个统一条件管理这些参数,这样使用起来会非常吃力。你陷入了新一轮的沉思。动态条件如何与可变参数结合呢?你决定暂时放过自己,等下一集再思考。

打开启动台其他终端复制下面两行命令, reinstall smart one tools sudow smart tell a dev disco 输入开机密码,输入时不显示。找到以下内容进行查看, power on hours 总通电小时 power cycle count 通电次数 data units written 总写入量新机基本上是小于三次,我的新机就一次通电时间会相当短,二手除外。 之前下载于使用过直盘清理工具,下载过 clean my mac, 用是好用,不过这玩意还不免费,而且还得每年交钱,直接打消我使用的欲望。又下了一个 os cleaner, 最后还是用的腾讯柠檬清理还行, 灵动岛还是用的大家建议的 uki x 好 用,还有歌词显示有启动台,不过要付费。今天分享完毕啦啦啦。

今天我们用三个案例带大家彻底解决 excel 的 ctrl 的, ctrl 的 ctrl if d countra 三个统计函数的区别和使用场景,超级干货,建议先收藏再学习。场景一,我们想查询年龄超过四十岁这个单条件的人数,我们只需要在这里面打上等于 ctrl if, 然后双击它两个参数,我们选择函数编辑器,第一个参数,我们选择区域,当然就把年龄区域全选进去,那第二个参数,注意,我们只需要选择在这里面已经提前写好的大于四十就可以点击确定啊,总共七个人, 如果你变的话,比如大于三十岁呢?哎,他就变成了十四个人,这叫单条件。场景二,我们统计符合双条件的人数,在这里面我们想看本科的学历加上大于三十岁的年龄,那这 这时候我们需要引入 count if 函数啊,选择我们 count if, 打开我们的函数编辑器。这个时候呢,我们首先要选择第一个区域是什么?是学历,从头选到尾,那我点击下箭头,在这个标准,我们选择我们这边提前写好的本科, 在第二个条件的区域呢,我们选择所有的年龄区域,那我们的标准呢?依旧选择我们提前写好的这个单元格啊,然后我们点击回车啊, 这时候他告诉我们,又符合本科又大于三十岁的七个人啊,那我们换一个标准,比如说大于四十岁,哎,那就只剩两个人了啊。 这里需要提醒大家的是,无论我这里面如何变换,我的数据员永远来自于这两列,如果你想去查询别的列,对不起,你要去改公式,对不对?列引出了我们第三个场景,老板很多时候想查东西, 他是随心所欲的,所以我们要给老板做一个自助查询表格,什么意思啊?查什么?他的条件是什么?统计的标准老板通通可以自己定义,比方说我们这个地方,老板说我想看年龄,我想从你刚才的学历这一列变成年龄这一列,这就是随心所欲,对不对? 那我的条件是啥呢?是大于四十岁。那我的统计标准是什么呢?他一定得是转正,注意看啊,这时候这三列信息都被他改来改去,这就叫随心所欲啊。那这个时候呢,我们查出来的这三个人就符合老板的所有的这些随心所欲的标准。 整个这个过程里面,大家注意啊,他最神奇的地方是什么?是我们刚才整个切换的过程里面,看到没有,他的公式没有任何变化,永远是这一个公式,所 所以他能做成一个叫自助查询表格。而你用如果用刚才这些方法,对不起,你的公式,必须跟着老板的随心所欲,随时在改,很麻烦。 ok, 那效果演示完了,那如何实现呢?我们删掉他。这里我们需要引入 d ctrl a 函数, 我们只需要在里面输入 d count a 函数,双击它,打开我们的函数,编辑三个参数。第一个参数呢,我们要把整个区,因为老板随心所欲,所以干脆把整个区全选进去,点击下箭头。 第二个呢,就是他的标准,统计的标准是什么呢?哎,我们是这个单元格,他可以按照在岗状态,也可以转正状态,也可以按姓名都可以,我们在这里面的点击下箭头。第三个,你的标准是什么?点击他,哎,我们这次的标准是年龄大于四十岁,下次也可能变成学历的, 等于本科,没关系,我们把这个区域选进去就可以啊,点击下箭头,然后点击确定。哎,这个时候我们发现,哎,年龄四十岁,在岗状态就是四个人。那么切换一下,我们从刚才的在岗状态切换能转正状态。我们看一下啊, 切换转正状态,哎,他就只剩了三个人。那这种自助查询表格对给老板汇报来讲是非常非常实用的,这也是我们 d count 这个函数的神奇威力。好,这就是我们三个最重要的统计函数,难度略大,但超级实用,建议反复观看, 有收获的同学别忘了双击视频或右下角给曹导点个赞!关注曹导,带大家解锁更多的 excel 办公技巧!

大家好,欢迎来到这期深度解析。今天呢,我们要聊一个让无数数据打工人,甚至是有经验的工程师都非常头疼的真实企业级场景,也就是企业级数据库的连接与底层架构。咱们直接进入正题。 作为在企业里摸爬滚打多年的数据分析工程师,我太常看到大家在这个环节被卡的死死的了。今天我们可不只是教你怎么点,下一步我们要把扒开表象,看看这些让人崩溃的连接失败,底层的真实逻辑到底是什么。 为了让大家有代入感,我们直接拿一个最典型的实际场景来开刀,使用最新的 knm, 五点八,通过 jdbc 驱动去连 ibm db2, 听起来是不是很简单,填个 ip, 填个密码,对吧?但实际上里面处处都是坑。 咱们先来看第一关,也就是最容易踩坑的第一阶段,排查 license, 寻找失踪的授权文件。 当你兴奋地配好地址,点下连接时,啪!报错了,非常有意思啊!仔细看这个错误提示,它根本不是说你密码错了或者网络不通,而是告诉你找不到 ibm db 二特有的 license 授权文件。 很多人看到这里直接就蒙了,无从下手。其实破解这招不难,你需要打开系统设置里的 classpath, 这里的核心细节是,千万记得你要把主驱动文件以及那个特殊的授权文件同时加进去, 如果你少加了,哪怕一个 j、 d、 b、 c 都会直接罢工,连门都不让你进好。当你搞定了授权文件,以为万事大吉的时候,往往会迎来第二季重锤。这就是我们要排查的第二阶段,新引擎和老驱动的底层冲突。 这时候系统可能会甩给你一个看起来特别吓人的报错提示,什么绘画无效? 别慌,抓重点,真正的关键线索在这儿。系统提示,当前的驱动不支持 is valid 这个特定的验证方法。 这就很有意思了,为什么会不支持呢?根本原因其实出在软件本身。 knmie 升级了它的底层引擎,全面拥抱了更高版本的 java 十七和 jdbc 四点 x 标准。 这就意味着你手里那个祖传的老旧的 d b j c c 点 j 二已经彻底被时代淘汰了,你必须果断抛弃它,换成支持新标准的新版驱动才行。 这里我必须要插一句,企业级的最佳实践,千万千万不要遇到驱动问题就去网上随便百度一个乱想。 要知道,很多企业级驱动是需要主述权限的,而且版本必须要和你们公司服务器上的版本严格匹配。听我一句劝,最靠谱的做法就是直接去找你们公司的 dba 数据管理员哟,真能帮你省去无数的麻烦。 经过这番折腾,换上对的驱动和 license 节点,终于亮起绿灯了,那种感觉确实很爽,常输一口气对吧?但是大家先别急着开枪兵, 这正是检验你是初级新手还是资深工程师的试金史。温体节点绿了,连接成功了,那你觉得服务器上那几百万上千万条数据,现在是不是已经乖乖躺在你的电脑硬盘里了? 答案是,绝对没有!这就引出了我们今天这一期解析最最核心的概念,下推优化,也就是教你如何真正压榨服务器的算力。 这神奇概念叫做下推优化,页内也常叫 sql pushdown。 它的本质是什么呢?此时此刻, k n i m 其实化身成了一个高级的 s q l 自动化指挥官。 他只是在给数据库发号施令,让数据库去干那些脏活儿、累活儿,而不是傻乎乎地把海量数据全部拖回你的本地电脑自己算。 你看,像建立、连接、执行、查询,甚至做数据分组、聚合这些代表数据操作的节点,他们其实都只是在后台默默生成 s q 罗语句,然后一脚踢给远端的 d b 服务器去执行。 我再强调一遍,在这个阶段,连一滴数据都没有留到你的本地电脑上,一滴都没有,我们到底图什么呢?当然是为了光明正大地利用企业及数据库服务器那庞大的 cpu 和内存资源呀! 你把表关联、过滤、排序这些句号资源的操作,留在数据的老家执行,不仅能享受底层所引的速度加成, 更关键的是,这彻底堵绝了你那台可怜的办公电脑因为瞬间塞进千万条数据而直接卡死崩溃的风险。 那数据到底什么时候才会进入本地呢?请大家死死记住这个特定的提取节点 db reader, 只有当工作流执行到它的时候,才是唯一的一个特定时刻,数据大门才被真正打开。 服务器端算好的精简过的数据才会被抽取并下载到了你本地的内存里,变成你能看到的数据表。这就是为什么我们需要一场彻底的范式转变,放下固有的思维,去真正拥抱企业级的工作流架构, 很多刚从 excel 转过来的同学,思维还停留在我要先把所有原始明细数据全下到本地,然后再去算,遇到几十个 g 的 数据,电脑直接原地升天。 而正中的企业级思维是什么?是把庞大的原始数据死死按在服务器上,尽情调用服务器的算力去处理,最后仅仅把那几百或者几千条轻量级的最终结果,也就是你的洞察下载到本地,这就是妥妥的降维打击。 好了,让我们稍微总结一下今天的核心要点,我们不仅带大家解决了真实环境里因为 license 缺失或者 java 版本引发的驱动操爆难题, 更关键的是,我们揭开了数据节点的真相,带你领略了下推优化和服务器端计算的霸道威力。记住,只要还没跨过那个数据读取节点,数据就还在远端。 既然你现在已经懂得了下推优化的精髓,那么我想留给你一个挑战,明天回到工位,打开电脑后,你会怎么重新审视你的数据工作流? 在你的日常任务中,还有多少原本在本地苦?哈哈,运算了重体力活,是可以反向推回给数据库服务器去承担的, 赶紧去试试看吧,那种性能飙升的感觉一定会让你上瘾。感谢收听这期解析,我们下次再见!

每天一条,讲清一个技术底层逻辑。今天分享 content 优化,从精确到估算。深夜十一点,报表群里炸了,首页总订单数赚了整整十八秒才出来执行计划。一看扫了三点二亿行。有人说加锁影,有人说缓存一下, 有人小声问了一句,这个数字真的需要精确吗? content 的 语义看起来很干净,数出符合条件的行数, 但数据库回答,有多少行,必须把这些行实实在在走一遍。哪怕你只要一个整数引擎,也要读出数据页,对每一行做可见性判断,再累加 count 的 本质是全量便利,只是把结果压缩成了一个数字。很多人以为数据库内部存着这张表,有多少行,查的时候直接返回 m i s a m 时代勉强成立。到了 intel d b 这个全局行数根本不维护,原因只有一条,不同事物看到的行数本来就不一样。当一个事物发起 count, 它要数的不是表里有多少行, 它要数的是在我的事物视角里,有多少行是可见的。有的行刚插入未提交,有的行已删除,但 undo log 未清理。有的行版本链上有多个版本。 count 不 只是数型,它是对每一行做一次可见性判决,三一行就是三一次判决。到了分布式数据库,问题更棘手。数据切成了很多片,分布在不同节点,一次 count 协调节点要给每个分片都发一次请求,等全部返回再聚合。 单机的慢,在分布式里会被节点数直接放大。精确是有价格的。一万行大概两毫秒,随手用,一百万行二百毫秒,小心用一亿行,二十秒定时跑十亿行超过三分钟基本别碰。 代价不是限性增长的,是从没感觉跳到跑,一次压垮半个集群。单次 count man 还不是最可怕的,十 qps 的 并发症就能让二十秒的查询变成二百秒的对联。一次大扫描还会吃掉大量 buffer pool, 把热点数据挤出去,整个库的响应时间都会抖动。 主库抗住了,从库复制现成单,现成回放,追不上就追不回来。精确的代价不只是查询时间,是它对整个系统稳定性的挤占。 面对慢 count, 第一反应通常是加锁瘾。这个直觉不错,覆盖锁瘾能让 count 快 起来,原因是辅助锁瘾比主键锁瘾小得多,数据页更紧凑,一张一百 g 据促锁瘾的订单表 status 字断的辅助锁瘾大概只有两 g, 走起来完全不是一个量级。 但缩影这条路有天花板,缩影能把 count 优化成扫小一点,但不能让它变成不扫。当已完成订单本身就有几亿型,再好的缩影也只是把扫描从几亿缩到几亿,编辑效益在递减。这时候继续在缩影上下功夫,需要换思路了。既然 count 的 本质是每次都数一遍,为什么不数一次,存起来以后直接读? 这就是增量计数器,每次插入异形计数器加一,每次删除异形计数器减一,查询时直接读。听起来很简单,但每个细节都有坑。第一个坑是一致性,计数器更新和业务写同一个事务,意味着写入延迟增加,还会形成热点, 千万 qps 的 系统几乎一定选择一步容忍短暂不一致。第二个坑是热点型,全站订单数计数器每秒十万次更新,这一行会变成行锁的剧烈增强。解法式分桶技术,把一个计数器拆成 n 个桶,每次更新随机选一个桶,查询时把 n 个桶加起来。 热点的解法不是让它更快,而是让它更散。 mysql 单行写入大约三千到五千 qps, 十万 qps 的 并发切三十到五十个桶基本没问题。做完这些优化,你依然会遇到一种场景,精确技术不可能。这时候该问自己,真的需要精确吗? 首页显示十二亿三千四百五十六万七千八百九十,用户会震惊。但如果显示十二亿三千四百五十六万八千零一十二,用户能感受到不同吗? 几乎没有,对展示类的 count 精确到百万级就够了。多出的精度是用 c p u 换来的无效信号,一旦接受不精确解法,空间一下子打开了。最便宜的方式是数据库统计信息。 inodeb 的 information 下划线。 schema tables 里有 table 下划线 rows, p g 有 p g 下划线 class real topos。 这些数字是引擎做查询优化时顺手维护的,误差通常在百分之五到百分之二十之间,几乎零成本。更复杂的聚合可以用采集,比如过去七天有多少用户下过单?全量扫描太贵,随机采集百分之一的用户,看这里面有多少下过单,再乘以一百。作为计算 数学基础是中心极限定律,只要样本足够大,误差是有界的。处理独立元素基数 hyper log log 是 专门的神器,固定十二 kb 内存,计算任意规模唯一元素个数, 误差大概百分之零点八。 readis 的 count 就是 它。很多分析型数据库也内折。这个能力从精确到估算的本质是用一个可控的误差换一个数量级的性能。 所有方案聚在一起,真正需要回答的问题是,这个 count 的 时效性要求是什么?秒级且精确限定,小范围查询,保证高选择性锁影。秒级可容忍误差。分桶计数器加 readis 聚合 分中级定时任务刷新预据核表,小十级或天级走离线计算推送,只需趋势统计信息或 ceo 够了。首页展示总订单数用分桶增量计数器近时时秒级延迟展示类容忍一秒内误差。分页总页数直接禁用精确页数改成上一页下一页,根本不算总数。 实时风控,三十分钟内失败次数用 ready set 区间 count, 精确且毫秒级,因为窗口限定,数据量可控。运营看版,今日 gmv 单数分终极预具和表分终极刷新够了。 报表本月新增用户数,离线任务加预计算次日出结果最划算。管理后台模糊搜索只返回一千加即可。好的架构不是把每个 count 都做快,而是让每个 count 和业务需求对齐。 十万 qps 以下 count 就是 一行 c 框,加个缩影能解决大部分问题,精确和性能不冲突。到了百万 qps, 精确开始有代价了,全表扫描不可忍受,缩影优化的编辑效益在减小, 这时候引入 readys, 引入域据核表,但系统整体还是精确优先的。到了千万 qps, 精确不再是默认选项,每一个 count 都需要问,这里到底需要多精确?分桶计数器普及信息被堂而皇之地拿来用, 从百万到千万 count 优化已经不是数据库层面的问题,而是产品需求设计的问题。这是很多 cq 优化的共性规律。量级上来之后,优化主战场先从代码层转到架构层,再从架构层转到需求层。下次再看到首页总订单数的时候,也许先问一句,他真的需要是精确的吗? 如果答案是不需要,那十八秒的慢查询本来就不应该存在。看完了就点个关注,下一讲继续。