zoukankan      html  css  js  c++  java
  • sqlalchemy多表联合查询的左连接、右连接等使用

     #按用户名摸糊查询
    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

    with session() as s:
    	machineList = s.query(OnlinePerfMachine, MachineUsed, OnlinePerfProject).
    		outerjoin(MachineUsed, OnlinePerfMachine.machine_id==MachineUsed.machine_id).
    		outerjoin(OnlinePerfProject, OnlinePerfProject.project_id==MachineUsed.perf_project_id).all()
    

    等价于:

    SELECT xxx  FROM online_perf_machine LEFT OUTER JOIN machine_used ON online_perf_machine.machine_id = machine_used.machine_id LEFT OUTER JOIN online_perf_project ON online_perf_project.project_id = machine_used.perf_project_id

    上面语句的调试信息:

    在查询结果里显示query()括号里的内容,因此,你可以在查询结果里得到匹配的某个表某些字段的信息、几个表的信息、几个表的某些字段的信息,比如

    1、匹配到的Table1的所有字段信息

    2、匹配到的Table1、Table2的所有字段的信息

    3、匹配到的Table1.column1、Table1.column2、Table2.column1、Table2.column4这些字段的信息

     

    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语句效果一致,即两个表的共同的部分

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

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

    右连接则相反。

    全连接,则是将两个表的需要的字段的数据全排列。---我这边实际上报错

    参考:http://www.codexiu.cn/python/blog/727/

  • 相关阅读:
    linux nohup
    并发编程-多进程模块介绍
    并发编程-多进程
    网络编程-粘包现象
    Typora快捷键Mac
    网络编程
    异常处理
    面向对象-元类介绍
    面向对象-内置方法
    面向对象-反射
  • 原文地址:https://www.cnblogs.com/shengulong/p/8385966.html
Copyright © 2011-2022 走看看