网站:SQLFlow
什么是血缘关系
当你在数据库里执行一段SQL代码后,数据库会返回给你一个结果集(record set,简称RS),结果集中的每一列可能来源于不同的表,这些不同的表又依赖别的表,中间可能经过了函数、聚合等计算。源表与结果集关系,就是血缘关系。
例如,有这样的SQL语句,从源表user和order中,查询了一个用户所有订单金额的RS:
-- mysql
SELECT `user`.name,
`order`.price
FROM `user`,
`order`
WHERE `user`.id = `order`.uid
他的血缘关系如下图所示:
如果我们的金额只取整数,他的关系图如下:
-- mysql
SELECT `user`.name,
floor(`order`.price) as price
FROM `user`,
`order`
WHERE `user`.id = `order`.uid
可以看到,和上图相比,price在形成结果之前,经历了floor函数的计算。
我们可以user.id和order.uid之间的join关系列出来:
我们从上面的表中,我们做一个子查询,对于每个人取金额最大的:
-- mysql
SELECT temp.name, max(temp.price) as price
FROM (
SELECT `user`.name,
`order`.price
FROM `user`,
`order`
WHERE user.id = order.uid
) as temp
GROUP BY temp.name
可以看到,和上面的图相比,多个一个叫RESULT_OF_TEMP
的表,他就是我们子查询形成的中间结果,他也出现在我们的血缘关系中。
在线解析
打开网站SQLFlow,注册一个用户, 切换选择数据库,输入sql代码,点击visualize按钮:
在图像空白区域点击右键,可以下载图片:
点击visualize join按钮,切换jon视图:
切换到setting面板,可以设置是否显示中间过程,是否显示函数:
其他选项,请自行探索。