面试题常见

SQL

查找SQL的问题

如下,table2比table1 id 数少,id和name是一对一的,如果希望保留table1的全量数据,请找出下面SQL的问题:

SELECT *

FROM table1

LEFT JOIN

table2

ON table1.id = table2.id

WHERE table2.name = ‘blablabla’

;

答: 因为是table1 left join table2. 如果table2中没有,而table1中有,则table2中相应的id, name列会是NULL。然而where statement在table2的列上面,则完全忽视了NULL的行,最终结果和INNER JOIN的结果是一样的。如果一开始写这个LEFT JOIN是有意图的,则不能达到原有的意图。

需要明白:WHERE条件是正对join后的数据集进行筛选,如果需要针对join前的表进行筛选,应该将条件放到on的后面。对于left join,不管on后面跟什么条件,左表的数据全部查出来。

on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。   根据上面的分析,可以知道where也应该比having快点的,因为它过滤数据后才进行sum,所以having是最慢的。但也不是说having没用,因为有时在步骤3还没出来都不知道那个记录才符合要求时,就要用having了。

SQL中inner join 和outer join的区别?

 假设你要join两个没有重复列的表,这是最常见的情况:

  • inner join  A 和 B 获得的是A和B的交集(intersect),即韦恩图(venn diagram) 相交的部分.

  • outer join A和B获得的是A和B的并集(union), 即韦恩图(venn diagram)的所有部分.

SQL中union 和union all的差别?

union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了

编写sql进行表关联统计

请用一段SQL回答以下问题: 我有一个application表,还有一个transaction表。Application表记录的是申请,有apply_id, transaction表记录了交易,也有apply_id。只要先申请成功,才有可能有交易。想知道有多少人申请了,有多少人交易了?

答:

SELECT COUNT(DISTINCT application.apply_id) AS num_apply

, COUNT(DISTINCT transaction.apply_id) AS num_trans

FROM application

LEFT JOIN

transaction

ON application.apply_id = transaction.apply_id

Python

Python里面tuple和list的差别?

(答: list is imputable, tuple is non-imputable.直白一点就是tuple定义完之后不能再改了。List还可以更改赋值)

长数据转换为宽数据,宽数据转换为长数据

df=pd.DataFrame(np.random.rand(3,6),columns=['x','lev2015','roa2015', 'roa2016', 'lev2016','lev2017'])

df['stkcd']=['a1','a2','a3']

宽表->长表

df=df.melt(id_vars=['stkcd','x'],value_vars=['lev2015','roa2015','roa2016', 'lev2016','lev2017'],var_name='name',value_name='score')

长表->宽表

df=df.pivot_table(index=['stkcd','x','year'], columns='name', values='score')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值