sql server numeric 可存几位小数_想成为优秀SQL高手?你就差这些细节

标准结构化查询语言(Structured Query Language)简称SQL,sql是我们日常工作中使用最多一项技能,写sql可以说是一个可以干到退休的技能。看似简单,但要精通却很难。 sql包括增、删、改、查,创建表、删除表、修改表等等内容,我们今天所讲的sql是一种狭义上select语句,这个使用最频繁,也是最复杂的。写一篇关于技术类的文章,既要深刻,又要通俗易懂,的确要耗费我不少精力,如果大家觉得此文对你或者有需要的人有所帮助,整理不易,记得关注小编 欢迎您转发!

一、sql会不会淘汰?

大家满怀热情点进来学习一下sql,首先要搞清楚一个问题,sql会淘汰吗?要回答这个问题,首先有必要了解sql发展背景,它是关系型数据库诞生的产物,有时候不得不佩服这些先辈,当关系型数据库起步发展的时候,就制定了一个统一的操作标准,就是SQL标准,所有关系型数据库(mysql/mssql/oracle)都会实现这个标准,这也是为什么sql会长盛不衰的原因,所以sql会不会淘汰,要看关系型数据库会不会淘汰?到目前为止没有看到任何关系型数据库淘汰的迹象,传统关系型数据库过渡到分布式关系型数据库,这是未来极有可能发生的事。

你可能会问市面不是有一个nosql的东西?首先nosql翻译成中文,不是”没有sql“的意思,而是”不仅仅有sql,还有其它“,nosql是not only sql的简称。nosql说的一种补充,什么意思,sql主要处理结构化的数据,nosql主要处理非结构化的数据。目前来说nosql没有一个统一的标准,都是按照用途来发展,比如键值(Key-Value)存储数据库, Redis;列存储数据库,Cassandra;文档型数据库, MongoDb;图形(Graph)数据库,Neo4J。

二、什么是IT高手

扎实理论基础知识,这是决定一个人水平飞得有多高。灵活运用这个基础知识(非常难),才决定一个人水平有多牛。为什么我会说经常出现”卡壳“现象,有些看上去很难的问题,其实运用一些基础知识就可以解决,但是要做这一点非常困难。

我们通常对高手定义都是可以处理日常工作中一些难题,注意我说的是一些难题,不要期望解决所有的难题,什么是日常工作的难题?特点一:问题偶然出现,无法重现问题;特点二,没有明显的逻辑错误,没有解决问题思路;特点三:问题本身就很难(比如数据结构与算法)。比如,我们HIS里面医技系统就有这样一个难题一直无法解决,护士录入A代码记录,后台偶然间会保存B代码记录,半年时间偶然出现1,2次,但是我们在HIS程序里面各种极端操作测试,始终无法重现问题,实在令人不解!

在这里我分享一下曾经处理过难题,你会惊讶的发现,解决问题的方法很简单,都是用的最基本的基础知识解决的,但是你想到这种解决方法,非常不易!

第一个问题:使用netbeans开发环境,在书写js函数queryStr的时候,按ctrl+shift+F格式化代码的时候,偶然会出现结构混乱,有时候发现导航器js未出现这个函数,如下图所示:

4fba2809ff730917d48a6a9562ee756f.png
482f42465da5a1f6dbaf2640cb0bcbe3.png

问题原因: 原来js代码与html在同一个文件来写的,原来在queryStr函数是包含动态生成html代码的片断,虽然这个代码放变量赋值里面,在格式化的时候,netbeans依然会检测这个html是否合法,导致缩进混乱,和导航器分析不出这个函数。我个人猜测格式化的底层实现,将整个文档解析,解析html标签,即便html标签写在js字符串变量里面,如果没有完整配对,依然会出问题。

解决方法:保证queryStr涉及的html字符完整,并且里面提及的函数必须声明出来。

第二个问题:下面来分享mysql bug。通过mysqldump导出来sql脚本,测试还原过程中,出现[Err] 1064错误,跟踪到是以下语句出错,百思不得其解,当时写进数据库没有任何问题,为什么导出来,再导进去的时候就报错。

91c28d5931fa235da4ff2497c45aa7fd.png

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''

质控科刘成章要求统计2018.04.01---2018-06-30门诊医生的收' at line 9

可能存在的原因:

UPDATE `info`.`fh_comm_detail` set `cl_proc` = ‘.....’ WHERE (`mxid` = '100005')

d53e4c201a9080158ebcc98645fac118.png

cl_proc后面的值当中包含/*,*/注释符号,mysql去解析的时候,触发bug,原本包含在‘’中字符串含义发生变化,导致语句报错。(但是我在mysql查询分析器,怎么样都模拟不出来这种错误,就是偶然发生)。

解决方法:将/*注释符号替换为其他字符即可,比如”--”,让其不触发解析注释串。

b29b64246100117ce27f2eeea8fd016e.png

问题三:联网医保金额与本地程序计算,有少数患者偶尔会存在金额不一致问题。翻看程序代码左看右看,都没有问题,如下所示。

lc_jine_sum = round(tab_1.tabpage_1.dw_1.getitemnumber(1,"jine_total"),2)

问题原因:我突然想起一个基础知识,计算机浮点数本身是不准确的,每次运算都有可能得出不同的结果,既然不准确,为什么我们还会大规模使用计算机来解决问题,解决方法就是提高计算机处理精度,让它无限逼近准确。什么意思,我们大部分现实当中,大部分都是计算到2位小数,最多也是4位小数,但是计算机就无所谓,10-20位都可以处理,10-20位小数精度再截取2-4位小数,当然就可以做到准确无误。大家是否遇到过这种问题,明明只有一位小数,把这些数字加起来的时候,你会看到一长串小数,这就是计算机内部使用高精度计算的问题,如下图所示。

7a86e4eae39c5c7670c6b172dcf4b5e4.png

计算机内部使用高精度的小数(一般是10几位以上),来解决小数不准确的问题。所以我当时就把代码改了一下,果然改完以后,问题从此没有出现过。这就是利用基础知识去解决实际当中的难题,你看得我写的很简单,其实想到这个方法是非常困难的。

lc_jine_sum =round(tab_1.tabpage_1.dw_1.getitemnumber(1,"jine_total"),4) //先取出 4 位小数

lc_jine_sum = round(lc_jine_sum,2) //再进行 2 位小数四舍五入

三、解决一个sql问题基本思路

日常工作sql语句主要用途,临时统计数据、后台查数找问题原因、制作报表。拿到一个sql语句的问题首先我们先从业务角度分析,后台是否存在数据,它们是否存在相应关联?没有数据,没有关联,后继工作毫无意义。

举例说明,患者用药追踪,统计患者用了哪个厂家哪个批次的药品。统计的意义,如果发药哪个批次有问题,可以精准找到相关患者。第一个问题,后台有数据吗,有的。his里面基本上都有药品出入库、患者用药数据,但是药品管理的厂家、批次,与患者用药之间没有关联。这也是his系统里面的一个难题,目前我还没有看到靠谱的解决方案。由上述可以得知,患者用药追踪,这个问题无法用sql解决。

其次,通常你拿到一个稍微复杂sql问题一般不能一步到位写出来。别操之过急,学会化解问题。举例说明,统计历史连续某段时间内每日在院人数,假设his系统中没有生成数据(每天将在院人数数据拷贝生成一个中间表数据)。

第一步分解:假设你现在统计历史某日(2020-03-01)的在院人数,在院人数 = (入院日期 <= 在院人数 <= 出院日期) + 一直未出院的在院人数。

第二步分解:模拟生成连续某段时间,比如2020-03月份,再关联生成每日在院人数

e839b33c71a3dc957459b50828150f2e.png

最后,需要验证统计出来的数据是否正确,经过验证,统计出来的历史在院数据是完全正确的,发现有个别出现1,2个人的误差,是因为人为修改了”入院日期“,”出院日期“所致,如果你想检验sql水平怎么样,我给你一个判断标准,是否使用了中间表。严格来说,只要数据库存在数据,存在关联,就可以用sql语句查出来,如果你精通sql是不会用到中间表的。

四、SQL基础理论知识

掌握基础理论知识是成为SQL高手第一步,我不会照搬教科书式的讲课,我只会讲解我认为你最应该的掌握的3个知识点。

1、集合(Set)。我给大家一个简单的概念,sql里面一切皆集合。SQL 以关系代数为基础发展出来的一门语言,关系代数主要是“集合”。

sql语句形式:select .... from ....

集合在sql当中的表现形式:每一个select语句都是一个集合,写在from后面的每个表、子查询、视图可以算作一个集合。

06a16a89ed4bd395dd6b8584e2998f28.png

第一种情况

408a64d01f5d6f794e97726ba880af7b.png

第二种情况

1875b3860f08b7a9af3bc7ea54c5071a.png

第三种情况

2、笛卡尔积

select * from table1,table2,table1存在a列m行,table12存在b列n行,最后形成的集合是(a+b)列,(m*n)行记录。我们学计算机你会发现一个现象,越往前追溯,都会一个简单模型,如果你把所有sql问题往前推,最后都会看到 “笛卡尔积”的身影。

我举一个简单的例子,SQL理论中会把选取字段这个操作叫作“投影(project) ”。我不知道大家有无想过这个问题,为什么叫“投影"这个概念,而不是叫其他名称,因为任何sql语句其实到最后都是回归一个“笛卡尔积”,你在选取字段操作,好似对“笛卡尔积”做了一次“投影"。

3、集合之间的关系

集合之间的关系 一对一、一对多(最频繁)、多对多(几乎不用),在数据库表中通常用FOREIGN KEY表示一对多的关系 。为什么要关注它们之间的关系,主要写sql的语句发现记录重复现象,你一定要检查是不是一对多,多对多之间的关系。但是当sql语句复杂以后了,即便你分析清楚集合之间的关系,很可能出现记录重复的现象,当与你的预期不符,我们可以distinct去重。

五、SQL中实战技巧

这次我不再分析如何去书写一个sql语句,我相信大家多多少少会写sql。我只是跟大家分享一下我掌握的技巧。

1、能少写,就不要多写(write less,do more)。为什么要这样,第一个提高效率;第二个减少出错几率。举例说明:假设我们写内连接语句。其实是有2种写法,我推荐大家使用第一种写法。

f3bd9892b6328ad520447811299e7808.png

特别注意在oracle数据库当中,左连接、右连接有一种简写的方式。

71d6e6787c309d7ec75f5b473b51677f.png

2、为什么有时候别名需要增加双引号。当你的别名,包含特殊符号的时候,就要增加双引号,比如+、-、*、/、(、)。

e849290ee76ebfa2165f96af86d0b815.png

3、使用null注意事项。null指的是理论意义上的绝对的空,不指任何含义。所以空字串、空数组、空对象表示含义的空,不是null。所以null一般使用身份运算符 is,以示区分,is null或者is not null。像python是用is判断,但是java,js中用==来判断,有些编程语言对这个问题并没有严格区分。

4、union 和union all之间的区别。union将两个集合去掉重复记录合并在一起,union all只是简单合并在一起。

5、group by使用问题。有时候会发现聚合函数,感觉数值明显错误,先去掉group by 查看原始记录,看where条件是否写错。

a81272f44e13cfedf4c26d1ce95931a2.png

6、充分利用数据库提供函数,简化sql书写难度。举例说明:同时统计采购物品A、B、C、D分类的小计

7ed249f45418da637e23bcb13f272d2a.png

同时统计某个科室的出库给中心药房的基数、节约的小计。

4346c400e259bef0d9a102887ce871f6.png
7ae3b21810744570bc398c9cf435c039.png

当然我不可能穷举所有的技巧,我只是把我使用最多一些技巧分享给大家,精通sql需要大家长期实践。

六、案例分析

我曾经收到来自基层医疗机构的多位小伙伴的求助,他们在写sql的时候出现“卡壳”问题。其实不管使用oracle、mssql、mysql解决问题的原理思路都是一样,只不过表现形式不同。以下分享协助小伙伴处理问题2个案例。

案例一:某小伙伴遇到数据上报问题,某个药品入库与出库数据需要在同一行展示,因为“入库与出库”来源于不同的表,小伙伴用了一种最原始的方法来处理。小伙伴的解决方案,把“入库数据”统计出来放入一个中间表,把“出库数据”统计出来放入一个中间表,再将两个中间表关联查询。

106655c23fa5cbbfd88028d6425dd412.png

入库

216b5a0e7b374d9a1007aec44fb4bd5b.png

出库

小伙伴感觉这样处理比较麻烦,期望能用一条sql语句解决问题。我帮小伙伴分析是否可以用一条sql搞定的可能性,第一,对于来自于不同来源数据“入库”和“出库”,相当于不同的集合,可以使用union连起来;第二,union合并有个特点,要求两个集合是相同字段类型,相同的字段的个数,缺少的字段可以使用虚拟列来解决;第三,将union结果当作子查询(相当于得到一个新的集合),再进行group by处理,可以完成整个操作。 最终sql语句部分截图如下所示:

89d7754c498365ffda78255f44fedb93.png

入库补充虚拟列

62d0eb3c1aa0c6fe6882007ac64fe773.png

出库补充虚拟列

7d87aa98c2befabbca58e7302206d486.png

union当作子查询再进行group by

案例二:某小伙伴,制作检验视图给第三方调用,当某个检验结果,超过了正常范围,显示↑,↓,否则为空,如下图所示。

33138c93f6dc63f4dcd7a22de1ebe5ea.png

需求

20d89f4ba2ee2a28480b48a1fbd8c385.png

使用case when

小伙伴在百度搜寻很多资料或许也是看了我的文章,想到了可以用case when来解决这个问题,但是执行过程中报“sql server 从数据类型varchar 转换为 float时出错”。

2742a5daca709928f138a91cff0211a5.png

出错信息

因为我对mssql不熟悉这个问题对于我来说还是有一定的难度。我的思考过程如下,既然是数据类型出错,ISNUMERIC(b.lac13) > 0,这个条件嫌疑就很大,isnumeric没有真正把“数字值”过滤干净,我百度一下isnumeric返回值,只有两个返回值1,0。我当时敏锐感觉到问题就在这里,ISNUMERIC(b.lac13) > 0这种写法本身就是一个“坑”,假设判断ISNUMERIC(‘阴性’) 返回0,0>0就成立,convert去转换的时候就会报“sql server 从数据类型varchar 转换为 float时出错”。

我叫小伙伴改成ISNUMERIC(b.lac13) and CONVERT(float, b.LAC10) < CONVERT(float, b.lac13),再测试,果然问题就解决了。1代表true,0代表false这个习惯是从C语言那里继承过来的。不过小伙伴有点担心,如果ISNUMERIC(‘阴性’) and CONVERT(float, ‘阴性’) 这样判断不是一样有问题吗?我了解小伙伴这个担心,如果他掌握一个基础知识,这种担心是完全是多余的。什么意思,一般编程语言都会有一个if条件熔断机制。举例说明:条件1 and 条件2 and 条件3,假设条件1是false,就可以决定整个表达式的值,意味着条件2 , 条件3不会再去做判断处理,就好像发生了“熔断”。再比如:条件1 or 条件2 or 条件3,假设条件1是true,就可以决定整个表达式的值,意味着条件2 , 条件3不会再去做判断处理。

如果小伙伴还是不放心,可以将条件改成ISNUMERIC(b.lac13) == 1,就不会存在理解不了这个问题了。

0dafd829f807cabbcb260faa93c68fee.png

处理效果

七、总结

俗说“光说不练假把式”。多写sql才能掌握真技术,同时也要不停的跳出自己的“舒适区”。为什么有人干了10年,水平还是很菜,因为他只不过把有些事情重复干了10年而己,并没有真的成长。每次写sql的时候,能不能不用中间表、能不能再简单一点,每次挑战一下自己,完成同样的效果。所谓的高手,大部分都在挑战自己能力边界。最后祝大家都从文中有所收获,成为sql高手!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云空间兑换码在哪里找_华为云空间在哪里找到

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。华为云空间可以在文件管理中找到&#xff0c;具体的操作步骤如下&#xff1a;1、这里以华为p10 plus手机为例&#xff0c;先打开手机上的【实用工具】。2、进入到手机的实用工具以后…

android webview全屏时自动切换横屏,Android强制横屏+全屏的几种常用方法

CLR via C&num;深解笔记二 - 类型设计类型基础 所有类型都从System.Object派生 CLR要求所有对象都用new 操作符来创建. Employee e new Employee("Constructor Para ...vim常用命令笔记(转载)添加多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl v,进入列(也叫…

java random产生随机数_java的三种随机数生成方式,必掌握

随机数的产生在一些代码中很常用&#xff0c;也是我们必须要掌握的。而java中产生随机数的方法主要有三种&#xff1a;第一种&#xff1a;new Random()第二种&#xff1a;Math.random()第三种&#xff1a;currentTimeMillis()第一种需要借助java.util.Random类来产生一个随机数…

android n-ify miui,MIUI7.5版刷机包

MIUI7.5先行版给你带来跟多的天气信息和资讯&#xff0c;小米MIUI8的正式版虽然还没有推出&#xff0c;如空气质量&#xff0c;所以在Android N-ify模块下有点显示问题。MIUI7.5版刷机包小米miui7.5刷机方法下载Miflash线刷工具&#xff0c;双击进行安装&#xff0c;安装期间如…

python代码书写_Python代码的优雅写法,让代码更简洁

我们都知道&#xff0c;Python 的设计哲学是「优雅」、「明确」、「简单」。这也许很多人选择 Python 的原因。但是我收到有些伙伴反馈&#xff0c;他写的 Python 并不优雅&#xff0c;甚至很臃肿&#xff0c;那可能是你的姿势不对哦&#xff01;今天就给大家带来 Python 语句的…

C 怎么处理windows路径_python学习笔记-7:文件读写之文件与文件路径

文件关键属性:路径文件名根据已知的文件路径生成包含正确路径分隔符的文件路径字符串&#xff1a;import osstt os.path.join(usr,bin,spam)print(stt)#usrbinspamwindows的路径分隔符为&#xff0c;字符串中使用需要转义字符&#xff0c;因此应输入为当前工作目录程序运行时&…

android手机图标 足球球星,世界足坛九大现役球星标志性绰号,第一名所有人都服!...

原标题&#xff1a;世界足坛九大现役球星标志性绰号&#xff0c;第一名所有人都服&#xff01;9&#xff0c;“大腿”桑切斯自打智利天王桑切斯离开当年无比辉煌的巴萨加盟阿森纳后&#xff0c;就被无数球迷冠以“大腿”的绰号&#xff0c;当然这完全源自于他在英超阿森纳队中极…

mysql 互为主备 宕机 数据丢失_Devops部署-mysql主备多从搭建

​双主多从架构原理介绍IP端口账号密码服务名10.1.1.23306root/syncabc123!数据库A10.1.1.33306root/syncabc123!数据库B10.1.1.43306root/syncabc123!数据库C1.两台mysql都可读写&#xff0c;互为主备&#xff0c;默认只使用一台&#xff08;masterA&#xff09;负责数据的写入…

sourcetree mac 免登录_「vscode remote ssh 免登录」mac

如果你只知道传统的ssh操作&#xff0c;或者sftp/ftp上传下载操作&#xff0c;那可能有点太low了。强烈推荐你使用 vscode remote ssh。举个栗子来形象比喻一下&#xff1a;钥匙开门 和 指纹开门 的区别。已经用 vscode remote ssh 功能有很久了&#xff0c;这种体验真的太棒了…

signature=9e6873686326b073f8f457fa0e6c2f70,Signature required

摘要&#xff1a;Model comprehension and effective use and reuse of complex subsystems are problems currently encountered in the automotive industry. To address these problems we present a technique for extracting, presenting, and making use of signatures f…

python中汉字与变量不可同时出现_Python语言应用培训课(选择练习)

第一部分1、多选题&#xff1a;Python在金融中的运用包括( )选项&#xff1a;A:绩效分析B:风险分析C:程序化交易D:量化分析答案: 【绩效分析;风险分析;程序化交易;量化分析】第二部分1、判断题&#xff1a;python语言支持中文字符作为变量名称&#xff0c;但具有语法意义的符号…

python find函数 和index的区别_find方法和index方法的区别

Python find()&#xff1a; find 方法检测字符串中是否包含子字符串 str &#xff0c;如果指定 beg&#xff08;开始&#xff09; 和 end&#xff08;结束&#xff09; 范围&#xff0c;则检查是否包含在指定范围内&#xff0c;如果包含子字符串返回开始的索引值&#xff0c;否…

html5图像映射坐标怎么看,如何将AxesImage中的坐标映射到已保存图像文件中的坐标?...

这是尝试从matplotlib获取精确像素值的更令人困惑的部分之一. Matplotlib将绘制精确像素值的渲染器与绘制图形和轴的画布分开.基本上,最初创建(但尚未显示)图形时存在的渲染器不一定与显示图形或将其保存到文件时使用的渲染器相同.你正在做的是正确的,但是它使用的是初始渲染器…

vue获取元素距离页面顶部的距离_VUE实时监听元素距离顶部高度的操作

效果图如下所示.html今日热门今日热销.jsmounted(){window.addEventListener(scroll,this.handleScrollx,true)},methods: {handleScrollx() {console.log(滚动高度,window.pageYOffset)console.log(距离顶部高度,this.$refs.pronbit.getBoundingClientRect().top)},}补充知识&…

鸿蒙首饰用什么合成,天下HD鸿蒙炼炉是什么?鸿蒙炼炉讲解

在玩天下HD的时候各位又是否知道鸿蒙炼炉是什么呢&#xff1f;其实鸿蒙炼炉是游戏之中一个很重要的系统&#xff0c;而对于这个系统本次小编就给各位带来了鸿蒙炼炉讲解。或许各位都有用到天下HD的鸿蒙炼炉系统&#xff0c;但是各位又是否了解鸿蒙炼炉系统是怎么样的呢&#xf…

如何区分网线是几类的_小移课堂 | 网线这样选,网速才能嗖嗖的!

在家宅到长蘑菇的日子里最亲近的&#xff0c;除了家人&#xff0c;就是WiFi想必大家碰上网速不好的时候都会很抓狂为什么家里的网络明明签约的是千兆可网速一直上不去?网线&#xff0c;是卡住网速的关键因素&#xff01;问网线不是通用的吗&#xff1f;还要用专门的网线吗&…

navicat premium 链接postgresql 无法加载表_PostgreSQL 每周新闻 2020311

PostgreSQL 每周新闻 2020-3-11英文原文地址&#xff1a;https://postgresweekly.com/issues/346Postgres子事务和性能本文展示了过度使用子事务对性能的影响&#xff0c;以及如何诊断在您的数据库里是否有这样的问题。Laurenz AlbePostgreSQL匿名器0.6&#xff1a;假名化和改进…

python无法打开_如何解决Windows命令行无法运行python文件?

我在使用windows的命令行运行python文件&#xff0c;但是每次出现的都是这种情况我设置了Path&#xff0c;D:Python&#xff0c;后来又设置了个PythonPath&#xff0c;添加了Lib和DLLS的路径&#xff0c;但是没用。 我觉得还是设置环境变量的问题&#xff0c;请问大家有什么办法…

iis7设置html支持asp,Win7下启用IIS7配置ASP运行环境的详细方法

第一次在windows7下配置IIS&#xff0c;虽然有丰富的xp下配置IIS的经验&#xff0c;但还是会遇到不少的问题。特别是对入门者来说&#xff0c;搞清一些东西还是挺费时间的。其实win7下的IIS7配置过程是非常简单的。下面让seo博客来详细的介绍一下win7下配置IIS7环境运行ASP网站…

java 手写阻塞队列_Java阻塞队列的实现

阻塞队列与普通队列的区别在于&#xff0c;当队列是空的时&#xff0c;从队列中获取元素的操作将会被阻塞&#xff0c;或者当队列是满时&#xff0c;往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞&#xff0c;直到其他的线程往空的队列插入新…