pyDAL一个python的ORM(10) pyDAL的连接查询1

在开始真正讲pyDAL的连接查询时,我们需要花点时间学习/复习下 连接查询:

一、什么是连接查询

我们先直接抛出概念,SQL的7种连接:

pyDAL一个python的ORM(10) pyDAL的连接查询1_第1张图片

7种之中,我们常用以下4种:

(1)JOIN / INNER JOIN(连接/内连接查询)

集合求交集

(2)LEFT JOIN/ LEFT OUTTER JOIN (左连接/左外连接查询)

以左表为底数据,补充右表的匹配的数据,即使右表中没有匹配,也从左表返回所有的行。

类似于我们用excel时,在一张表中使用vlookup函数去另一张表匹配数据

(3)RIGHT JOIN / RIGHT OUTTER JOIN

LEFT RIGHT 就是一回事,看你把谁放左边而已

(4)FULL JOIN(全连接查询)

两个表合起来,相互补充字段对方表中匹配的字段

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, chairallen

我们改成

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、适用范围

(1)嵌套查询的select字段只能是局限在1张表内,它本质上是用  “中间结果” 作为查询条件,最终落脚到某1张表中去执行查询操作;

(2)连接查询的select字段就没有限制了,当你需要的数据字段是在不同表中里面,只能用连接查询;

2、性能

连接查询性能优于嵌套查询,特别是数据量大,多表,嵌套层数多时;

3、结果范围

(1)当 连接查询 的 连接字段 是 11 关系时, 嵌套 与 连接 的结果一样;

例如:如果每个人只能拥有一个物品,上述例子的rows1和rows3一样的

(2)当 连接查询 的 连接字段 存在 1对N 关系连接查询结果 会有N条,必须使用distinct去重;

你可能感兴趣的:(web2py,python基础,数据库,python,web2py)