Mysql学习感悟-2

Author Avatar
Carrie Dong 4月 07, 2018

sql学习计划搁置了几天,因为今天有一场理论考试-digital management,自己吓唬了自己一场。
说实话,米理管理对digital这方面的授课不够先进,也怨不得米理,欧洲整体情况使然。比如这个时代了,老师还专门讲了一大章mobile的东西,牵涉到EDI,MNO,OTT等我觉得很遥远的名词,因为我们这代人已经把它们当成理所当然了。而Blockchain虽然定义为趋势的一种,但实际上只有潦潦一页而已。而且mobility仍然被化为趋势之一,没有被删掉。(我不太理解为什么现在还保留,不是已经被玩烂了吗。)
不过个人仍然很感兴趣eSupply Chain的东西。因为商业/制造业,作为今后能继续玩并且当下暂时没有Monopoly模式的行业,最大的发展基础就是eSupplyChain。今天碰巧还考了一下如何帮助traditional company制定digital business strategy,嗯, 这里不敢肯定和eSupplyChain是一回事,毕竟教授没说,但是我隐隐觉得差不多,起码有overlap。

还是让我们回到sql…

出现问题

仍然是在学基础课程,第一个难点是内置函数。
会用Max/min之后,我尝试查询最大值所在的条。比如返回最大工资的员工所在部门,信息在同一表中。
于是我写了如下

1
$ select dpt from table where salary=max(salary);

理所当然地返错:‘Invalid use of group function’
我原先还想显示工资在avg-Max区间的部门,暂时流产了。。

第二个难点是子查询。
原理很简单,子查询的目的是显示与1表和2表中相同因素a有关系的查询,所以在查询语句中通过对a的定义就可以将1和2连接起来了。我最开始是尝试用IN,比如

1
$ select count(A) from table1 where B IN (select BB from table2 where BB=C);

总是会跳出错误‘this is incompatible with sql_mode=only_full_group_by’。。。很折磨人,后来把in换成=就成功了,我不知道为什么,这不是应该一样的吗?

解决办法

对这两处出错总结,第一个出错可以修改为

1
$ select dpt from table where salary=(select max(salary)from table);

而avg-max区间的部门,假设各部门的工资区间没有重叠,则为

1
$ select dpt from table where salary>(select avg(salary)from table) and salary<(select max(salary)from table);

第二个出错要修改sql设置,因为是5.7版本only group by设置导致的问题

1
$ set sql_mode=' ';

句子不变

了解其他

另外又补了group by/having的知识
1.‘列函数对于group by子句定义的每个组各返回一个结果’。简单说,没有group by部门的话,这里的max都为整个公司的。
2.将where与group by一起用,则可以定向限定,但where必须在group by子句之前。
3.可以在group by之后使用having子句,仅对满足条件的组返回结果,其子句可包含一个/多个and/or。

关于基础编辑

表格设置就是alter table…add/drop/change/modify…(change必须抄一遍数据类型)
表内容设置就是update…set…where…

下次就可以学进阶啦,以上!