先给出一个题目:
现在有十万个主键ID,对应某个记录表的主键。现在是写代码要求把十万个ID对应的记录拿到。
我下面给出两个方式。
第一个是,用SQL里的In查询,但是因为受限于SQL自身的长度,我们不可能把十万个ID都放到一条SQL里,所以我们将ID集合切分,然后并发去访问得到结果。
select * from table1 where id in (....ids...)
第二个方式是,将ID保存成一个表A,然后将A和记录表进行Join关联。
如果是第一种做法,那么这就是我说的"编程思维",而第二种则是“SQL思维”。
我之前将"编程思维","SQL思维"发了个朋友圈,问大家他们之间有啥区别,答案五花八门。不过就我的认知而言,SQL本质上是面向集合,将一切操作都转化为集合操作。而编程的话,则是一种高度灵活的思维,他本身没有给你一个方向,所以一般大家会按照编程的自然习惯,也就是for循环的思维去解决问题。
通常而言,我们在编程时,用的最多的其实就是集合类,做的非常多的也是对集合进行操作。但是编程语言自身并没有对如何操作集合给出一个“规范的”思维,因为它允许用户用无数的解决方案去解决。而SQL则对这一类操作做了一个总体的设计和规范,如果你习惯了SQL的模式,大部分数据操作会很简单。
以编程思维为主的人接触SQL会觉得各种别扭,还是觉得自己for循环(包含if/else)的模式更可控,更自由。但是,一个相对来说复杂一点的SQL完成的任务,如果让大家用for循环模式来完成(其实就是用一些基础的集合类),大家可能会花一天甚至几天的时间才能完成,并且性能可能会比较差,而SQL可能只要几分钟。
SQL的流行取决于数据自然就是按集合组织的,无论有无数据库(SQL),他都会是这种形态。那么SQL又天然是面向集合操作,自然会有很强的能量。
Excel -> SQL -> Python, Excel符合托拉拽的操控数据,所以是最广泛的操作数据的工具,其次就是SQL了,Python虽然流行,但他是一个通用的语言,复杂度摆在那。
所以我这些年一直以来,一直努力于MLSQL,一个以SQL为主内嵌Python的新语言,这有别于其他的统一的大数据分析/AI工具以Python为主,内嵌SQL。最易于被人接受的才是最有价值的。