如何成为写SQL高手(上)

    标准结构化查询语言(Structured Query Language)简称SQL,sql是我们日常工作中使用最多一项技能,写sql可以说是一个可以干到退休的技能。看似简单,但要精通却很难。 熟悉我的小伙伴都知道我之前写过关于《sql实践》的文章,小伙伴们说它是经典,后来经过我与小伙伴交流,发现来自基层的小伙伴技术水平普遍不高,在处理一个问题时候,经常会岀现“卡壳“现象。市面关于这种HIT真正实用技术干货,实在很难寻觅!实在有必要重写一遍,全面提升大家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未出现这个函数,如下图所示:

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

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

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

[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')

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

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

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

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

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

    计算机内部使用高精度的小数(一般是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月份,再关联生成每日在院人数

sql

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339