百科问答小站 logo
百科问答小站 font logo



为什么会有人写出几百行的SQL语句啊?这些人的心态是怎样的?为了凸显自己的强大吗? 第1页

  

user avatar   yu-zai-zhi-jian-40 网友的相关建议: 
      

作为一个以前经常要写300-900行SQL的人来说。这种SQL经常出现在需求变化快变化频繁的地方。而他之所以特别长和频繁的需求变化不无关系。

比如当领导要求你开发一个绩效排名功能的时候,他通常会先给你一个标准,然后你会按照这个标准写出一个逻辑来。这个时候可能是一个很简单的SQL 并排序。而当他看完之后,通常会发现这样那样的问题,诸如有相同排名啊,排名不合他的心意啊,于是提出新的标准。

需求发生了变化,你就要跟着变更业务代码,比如他要求在排序的时候考虑工作年限。于是你不得不在已经完成的SQL中连接新表,并在排序的时候加入一个字段。而通常这样的过程可不会只发生一次。

于是需求会再再再再再次发生变化,这个时候就会发现,标准可能会变成了先看加权总工作量,然后看加权难度系数,再然后看近五年累计工作量,再计算所在科室或者专业的平均绩效排名,最后在上述条件下再按照工作年限排个序

如果你来这个任务你会如何选择呢,如果是只修改存储过程的语句和前端展示的业务逻辑,而服务端代码完全不动,是不是更省事儿呢?而在我还在写这种SQL的时候,几乎每半年都会产生非常大的需求变化,甚至每次都要加入新表或者剔除旧表,甚至是加入之前剔除的表格。当时我都认为完全没有必要对代码进行重构,因为构了也白构,优化完了下次情况又不一样了。


user avatar   aspwebchh 网友的相关建议: 
      

SQL语句复杂好与不好不能一概而论,写复杂为了凸显自己强大也不见得,这个还得根据具体应用场景和技术流派分析。

现在的互联网应用很多已经不兴关系数据库那一套了,因为并发量大,操作缓存比较多,如直接读写redis或设置进程内存,SQL最多数据落盘的时候用下。有的应用甚至不用关系数据库而是用mongodb,那么连仅有的SQL都省下了。

现在很多年轻的程序员,开发互联网应用出生,对于关系数据库的使用仅限select、update、insert、delete,但是这并不妨碍他们拿高薪,因为程序本身用不上关系数据库的高级特性,对于公司来说,用不上的技术,员工掌握了意义也不大。

mySql应该算是关系数据库管理系统的下限了,就数据库技术的先进性和性能而言,不知道被oracle和sql server甩几条街,但是在互联网行业,照样很流行,因为互联网企业并不需要很多先进的关系数据库特性。

如果在mysql上运行复杂的sql,如嵌套的很深的子查询或者多表连接查询,性能肯定非常差劲。但是换成sql server和oracle就不一样了,这些商业数据库对复杂sql优化支持的很好,索引利用得当,性能会非常好。

此外,也不是所有的应用系统都是高并发的,有的系统可能只是一些内部系统,如OA,用的人不多,但是业务逻辑非常复杂,一个功能涉及到N个表的数据,这个时候复杂SQL就能显现威力了,一个SQL语句就能完成所有的业务逻辑需求,这对于深入掌握SQL的程序员而言,开发效率非常高,这也是有程序员喜欢用复杂SQL的原因,可能这个SQL执行需要一秒,但是对于一些内部系统而言,无所谓啦。

但是复杂的SQL有一个毛病,有门槛,如果一个不精通SQL的程序员去阅读一个复杂SQL,就跟看天书一样,完全看不懂,然后去谷歌百度一顿搜索,依旧看不懂。这和复杂的程序代码不一样,程序代码即使很复杂,只要花时间啃,总是能看明白的,而且也能改进优化。如让一个初级java程序员改一段复杂的业务逻辑实现代码,照样没问题。

然而,让一个对SQL了解仅限增删查改的程序员,去改一段复杂的SQL,就不行了,因为SQL编程本身就比用编程语言编程复杂,SQL语言中看似关键字不多,但是很多关键字都蕴含很多种变化。

如表连接,分out join 、inner join、cross join、full join,还分left join、right join,而且还可以互相组合,组合代码的结果还不一样,差之毫厘谬以千里。

如子查询,分相关子查询,不相关子查询, 不相关子查询还好理解,相关子查询要是没经过系统学习,肯定理解不了。

另外还有case when,pivot、unpivot 这种很有用,但是又不常用的东西,真的会要了没见过的人的命。

因此对SQL掌握不深的程序员见到这种SQL真的会骂娘,因为把他整不会了,而且通过搜索引擎还解决不了问题,必须经过系统的学习,因为SQL编程知识更像一个体系,而不是片段。

题主说的这个程序员估计是传统编程行业出生,而不是互联网行业出生,否则不是这个思维。当然,如果他是大数据库开发人员,也可能会写出这种SQL。

我以前做传统行业的系统,用的.net + sql server,真的很兴复杂SQL这一套解决问题的,同时还会用存储过程、SQL函数、触发器来解决问题,效率很高,开发也很轻松。

后来跑到互联网行业,想在公司应用这套机制,被所有人都喷了,那自然也就不用了。最近在互联网混的这几年,连普通SQL都不写,数据的存取不是redis就是mongodb,要不就是进程内存,复杂SQL怎么写都快忘记了。

最后推荐一本书,有兴趣可以去看看,《SQL Server 2005技术内幕:T-SQL查询》,豆瓣9.4

理解这本书的内容,对SQL的掌握会有翻天覆地的变化,而且是纯实践的,可以堪称神书。




  

相关话题

  怎么通过类型形式化地表达SQL语句? 
  很多网站源码都是分为 GBK 和 UTF-8 版,为什么要同时开发两种? 
  数据库中将物理删除改为逻辑删除,如何不改变之前的SQL语句呢? 
  LBS数据库的架构是怎样的? 
  为什么没有人实现 P2P 数据库? 
  Cache 和 Buffer 都是缓存,主要区别是什么? 
  C# 为何MySQL无法打开连接? 
  安装vs2015社区版后如何安装Microsoft SQL express版? 
  MySQL已经可以干大部分事情了,还有必要使用商业数据库或者PostgreSQL吗? 
  图数据库的应用有哪些优点? 

前一个讨论
what works in ways you might not otherwise怎么翻译理解?
下一个讨论
普朗克长度是否在瓦解文明的意义?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利