最近身边有小伙伴在准备python数据工程师的面试,趁这个机会整理了Python与数据库的相关问题,话不多说,直接开始。
一、关系数据库与非关系数据库
以SQLite为例
我们使用SQLite来举例,首先,导入所需的Python库并创建一个新数据库
接下来,创建以下三个表:
-
客户:此表包含一个主键以及客户的名字和姓氏。
-
物品:此表包含主键,物品名称和物品价格。
-
购买的项目:此表将包含订单号,日期和价格。它还将连接到“项目”和“客户”表中的主键。
再往表里插入一些数据
OK,现在每个表中都有一些数据,现在我们用这些数据来回答进行下一步
SQL聚合函数
聚合函数是对结果集执行数学运算的函数。比如AVG
,COUNT
,MIN
,MAX
,和SUM
。一般来说,还要使用GROUP BY
和HAVING
子句来搭配使用。拿AVG函数来说
,可以用来计算给定结果集的平均值:
上面sql语句就提取出数据库中购买的每个商品的平均价格。也可以显示项目名称,而不是itemid
⬇️
另一个有用的聚合函数是SUM
。比如可以使用此功能显示每个客户花费的总金额⬇️
加速SQL查询
SQL语句的执行速度取决很多因素,但主要受以下几种因素的影响:
-
连接
-
聚合
-
遍历
-
记录
连接数越多,表的复杂度越高,遍历次数也越多。在涉及多个表的数千条记录上执行多次连接非常麻烦的,因为数据库还需要缓存中间结果,所以真的需要的话就要考虑增加内存大小。
执行速度还受数据库中是否存在索引的影响。索引非常重要,它可以快速搜索表并找到查询中指定列的匹配项。索引以增加插入时间和一些存储为代价对记录进行排序。可以组合多个列以创建单个索引。
调试SQL查询
大多数数据库都包含一个EXPLAIN QUERY PLAN
描述数据库执行查询的步骤。对于SQLite,可以通过EXPLAIN QUERY PLAN
在SELECT
语句前面添加来启用此功能:
该查询尝试列出所有购买商品的名字,商品标题,原始价格和购买价格。而该查询在SQL中应这样写⬇️
二、有关非关系数据库的问题
在上一节已经说明了关系数据库和非关系数据库之间的差异,并将SQLite与Python结合讲解,本节主要讲NoSQL。
以MongoDB为例
首先安装在python中安装MongoDB相关的库
pip install pymongo
再创建数据库并插入一些数据⬇️
可以发现MongoDB将数据记录存储在collection中,等价于Python中的字典列表。
使用MongoDB查询
首先尝试复制BoughtItem表,就在SQL中所做的一样。先向客户追加一个新字段。MongoDB的文档指定关键字操作符集可以用来更新一条记录,而不必写所有现有的字段:
实际上,可以稍微更改架构来更新另一个客户:
可以像在SQL中一样执行查询。首先,可以创建一个索引
然后,就可以更快的检索按升序排序的客户名称:
还可以遍历并打印购买的物品:
甚至可以在数据库中检索唯一的名字列表:
现在我们已经知道数据库中客户的名称,可以创建一个查询检索有关他们的信息:
写成SQL语句就是
NoSQL与SQL
如果架构是不断变化的(例如财务监管信息),则NoSQL可以修改记录并嵌套相关信息。想象一下,如果我们有八个嵌套顺序,那么在SQL中必须执行的连接数需要多少。但是现在,如果需要运行报告,提取有关该财务数据的信息并推断结论该怎么办?在这种情况下,就需要运行复杂的查询,并且SQL在这方面往往会更快。
注意: SQL数据库(尤其是PostgreSQL)还有一项功能允许将可查询的JSON数据作为记录的一部分插入。虽然这可以结合两个方面的优势,但速度可能并没有很好。而从NoSQL数据库查询非结构化数据比从PostgreSQL中的JSON类型列查询JSON字段要快。
由于存在各种各样的数据库,每个数据库都有其自身的功能,因此,还需要具体分析,以决定使用哪个数据库。
三、有关缓存数据库的问题
以Redis为例
首先用pip安装相关的库
pip install redis
现在,考虑一个简单的例子:从ID中获取用户名的请求:
此代码使用id来
检查名称是否在Redis中。如果不是,则使用过期时间来设置名称,现在,如果面试官问这段代码是否有问题,回答应该是没有异常处理!数据库可能有很多问题,例如连接断开,因此永远要考虑异常捕捉。
四、结束语
有关数据库相关的问题还有设计模式、ETL概念或者是大数据中的设计模式。这些就留到以后再聊。
点击阅读原文,阅读菜鸟学Python 400篇干货
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
内容反馈