在开始真正讲pyDAL的连接查询时,我们需要花点时间学习/复习下 连接查询:
我们先直接抛出概念,SQL的7种连接:
7种之中,我们常用以下4种:
两个集合求交集
以左表为底数据,补充右表的匹配的数据,即使右表中没有匹配,也从左表返回所有的行。
类似于我们用excel时,在一张表中使用vlookup函数去另一张表匹配数据
LEFT 和 RIGHT 就是一回事,看你把谁放左边而已
两个表合起来,相互补充字段对方表中匹配的字段
Oracle数据库支持full join,mysql是不支持full join,
pyDAL也不支持full join也不支持 right join,我们没说的另外3个left / right / outter excluding join也不支持,大家感兴趣可自行补充学习;
有以下两个表和数据:
(1)person表
id |
name |
dept |
1 |
allen |
marketing |
2 |
fiona |
finance |
3 |
richard |
retail |
4 |
lily |
marketing |
(2)things表
id |
name |
owner |
1 |
printer |
allen |
2 |
chair |
allen |
3 |
scanner |
richard |
4 |
desk |
|
5 |
keyboard |
fiona |
查询要求:
marketing部门拥有东西的人
owers = db()._select(db.things.owner, distinct=True)
rows1 = db((db.person.dept == 'marketing')&(db.person.name.belongs(owers))).select()
rows1 返回结果:
1,allen,marketing
rows2 = db((db.things.owner == db.person.name) & (db.person. dept == 'marketing')).select()
rows2返回结果:
1,allen,marketing, 1, printer allen
1,allen,marketing, 2, chair,allen
我们改成
rows3 = db((db.things.owner == db.person.name) &
(db.person. dept == 'marketing')).select(db.person.ALL)
rows3返回结果还是有两行:
1,allen,marketing
1,allen,marketing
rows4 = db((db.things.owner == db.person.name) &
(db.person. dept == 'marketing')).select(db.person.ALL,distinct=True)
rows4返回结果终于跟row1一样了:
1,allen,marketing
(1)嵌套查询的select字段只能是局限在1张表内,它本质上是用 “中间结果” 作为查询条件,最终落脚到某1张表中去执行查询操作;
(2)连接查询的select字段就没有限制了,当你需要的数据字段是在不同表中里面,只能用连接查询;
连接查询性能优于嵌套查询,特别是数据量大,多表,嵌套层数多时;
(1)当 连接查询 的 连接字段 是 1对1 关系时, 嵌套 与 连接 的结果一样;
例如:如果每个人只能拥有一个物品,上述例子的rows1和rows3一样的
(2)当 连接查询 的 连接字段 存在 1对N 关系时, 连接查询结果 会有N条,必须使用distinct去重;