sqlalchemy多表联合查询(inner outer join 左右连接)详解

sqlalchemy多表联合查询(inner outer join 左右连接)详解

       本篇内容为大家提供的是sqlalchemy多表联合查询(inner outer join 左右连接)详解,该教程主要介绍了sqlalchemy的多表联合查询,以及SQl内,外,左,右,全连接等,详细而全面,感兴趣的同学可以参考学习一下。


#按用户名摸糊查询
trans_details.query.join(Uses).filter(Users.username.like('%xx%'))
#select xxx from trans_details inner join trans_details on users.id=trans_details.user_id where users.username like '%xx%'

#左外联接(left join)
trans_details.query.outerjoin(Uses).filter(Users.username.like('%xx%'))
#select xxx from trans_details left outer join trans_details on users.id=trans_details.user_id where users.username like '%xx%'

#以上是已经设置好外键,它自动找到关联的字段.也可以自己指定:
trans_details.query.join(Uses,trans_details.user_id==Users.id).filter(Users.username.like('%xx%'))
#select xxx from trans_details inner join trans_details on users.id=trans_details.user_id where users.username like '%xx%'

#另外一个更复杂的例子:
q=db.session.query(Credit_bills_details.no,Credit_bills_details.amount,Cards.no).outerjoin(Card_trans_details,
Credit_bills_details.no==Card_trans_details.trans_no).join(Cards,Card_trans_details.to_card_id==Cards.id)\
.filter(Credit_bills_details.credit_bill_id==3)
 

#SELECT credit_bills_details.no AS credit_bills_details_no, credit_bills_details.amount AS credit_bills_details_amount, cards.no AS cards_no
# FROM credit_bills_details LEFT OUTER JOIN card_trans_details ON credit_bills_details.no = card_trans_details.trans_no INNER JOIN cards
ON card_trans_details.to_card_id = cards.id  WHERE credit_bills_details.credit_bill_id = %s

附录:

SQl内,外,左,右,全连接

表结构:

student  

no

name

1

a

2

b

3

c

4

d

  

grade

no

grade

1

90

2

80

3

85

3

95

  

运行语句如下

select * from student,grade WHERE student.no = grade.no ---普通的where语句
select * from student inner join grade on student.no = grade.no    ---内连接语句
select * from student left join grade on student.no = grade.no    ---左连接语句
select * from student right join grade on student.no = grade.no    ---右连接语句
select * from student full join grade on student.no = grade.no    ---全连接语句

运行结果如下:

普通的where语句

no      name      no       grade

1         a            1          90

2         b            2          80

3         c            3           85

3         c            3           90

 内连接语句

no      name       no     grade

1           a             1         90

2           b             2         80

3           c             3         85

3           c             3         90

左连接语句

no           name           no         grade

1                 a               1            90

2                 b               2            80

3                 c               3             85

3                 c                3            90

4                 d            NULL         NULL

右连接语句

no            name           no         grade

1                 a                1              90

2                 b                2              80

3                 c                3               85

3                 c                3               90

全连接语句

no           name            no           grade

1                a                  1              90

2                b                  2               80

3                c                  3              85

3                c                  3               90

4                d               NULL        NULL

总结:

从上面例子可以看出:

内连接和我们平时所用的where语句效果一致,即两个表的共同的部分

外连接包括(左连接、右连接)

左连接,即已左边的表为主表,右边的表为副表,将主表中需要的字段全部列出,然后将副表中的数据按照查询条件与其对应起来,

右连接则相反。

全连接,则是将两个表的需要的字段的数据全排列。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy中,可以使用join()方法实现多表联合查询。下面是一个简单的示例: 假设我们有两个表:students表和grades表。students表包含学生的姓名和ID,grades表包含学生的ID和他们的成绩。 我们想要查询每个学生的姓名和他们的平均成绩,我们可以这样写: ```python from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, func from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy.ext.declarative import declarative_base engine = create_engine('sqlite:///example.db') Base = declarative_base() class Student(Base): __tablename__ = 'students' id = Column(Integer, primary_key=True) name = Column(String) grades = relationship('Grade', backref='student') class Grade(Base): __tablename__ = 'grades' id = Column(Integer, primary_key=True) student_id = Column(Integer, ForeignKey('students.id')) score = Column(Integer) Session = sessionmaker(bind=engine) session = Session() # 使用join进行多表联合查询 query = session.query(Student.name, func.avg(Grade.score)).join(Grade).group_by(Student.name) for name, avg_score in query: print(name, avg_score) ``` 在上面的代码中,我们使用join()方法将Student表与Grade表联合查询。在join()方法中,我们传入了Grade作为参数,表示要联合查询的表。然后我们使用func.avg()函数求出每个学生的平均成绩,并使用group_by()方法按照学生姓名分组。最后,我们使用session.query()方法执行查询,并使用for循环遍历结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值