Flask聚合函數(基本聚合函數、分組聚合函數、去重聚合函數))


Flask聚合函數

1.基本聚合函數(sun/count/max/min/avg)

使用聚合函數先導入:from sqlalchemy import func
使用方法:
sun():func.sum
count():func.count
max()
min()
avg()

語法        注意:使用db.session.query()括號內必須要寫東西,不能空着,不然都不知道從哪張表中查詢數據

from sqlalchemy import func
db.session.query(func.聚合函數(實體類.屬性)).all()

代碼示例:

@app.route('/08-aggr')
def aggregat_views():
    #查詢Users實體中所有人平均年齡
    result = db.session.query(func.avg(Users.age)).all()
    return "聚合函數查詢成功"

2.分組聚合查詢   group_by

 db.session.query(查詢列,聚合列)                 ---query括號內的數據是查詢最后展示的數據,列表套元組格式
     .filter(條件)     #分組前數據篩選 --- where     filter括號內放的是查詢的條件
     .group_by("分組列名")     #分組  --- group by  group_by括號內放的是根據分組的列名
     .having(條件)     #分組后篩選  --- having       having括號內也是放篩選條件,不過需要在分組之后才能使用

查詢Users表中年齡大於18歲的,按照isActive分組,組內人數大於2人的組名和人數查詢出來

db.session.query(
 Users.isActive,func.count(Users.id))\   #----查詢結果顯示的數據字段:isActive,Users.id的聚合函數求和
 .filter(Users.age>18)\                  #篩選出年齡大於18的
 .group_by("isActive")\                  #根據isActive分組
 .having(func.count(Users.id) >= 2)      #分組之后再做篩選

分組統計數量 (展示分組的label_name,數量)

dbS.session.query(Label.label_name, func.count(Label.id)).filter(Label.ta == ta).group_by("label_name").limit(50).all()

練習

1.查詢Users實體中年齡大於18歲的人的平均年齡
2.查詢Users實體中按isActive分組后,每組的人數是多少
3.查詢Users實體中按isActive分組后,組內人數大於2人的
4.查詢Users標中年齡大於“QTX”的Users信息
#先filter篩選出age大於18的,然后使用func.avg求平均年齡
1.db.session.query(func.avg(Users.age)).filter(Users.age>18).all()

#先根據isActive分組,使用func.count算出分組后每組的數量,結果是列表套元組[(isActive,數量)]
2.db.session.query(Users.isActive,func.count(Users.id)).group_by('isActive').all()

3.db.session.query(Users.isActive,func.count(Users.id)).group_by('isActive').having(func.count(Users.id>2)).all()
  #子查詢
4.db.session.query(Users).filter(Users.age>db.session.query(Users.age).filter(Users.username=="QTX")).all()

3.去重聚合函數   distinct

from sqlalchemy import distinct

#去重后的標簽名
labels=dbS.session.query(distinct(Label.label_name)).all()
#去重后的標簽數量
label_distinct=dbS.session.query(func.count(distinct(Label.label_name))).all()

4.聚合函數的修改和刪除

#1.修改小紅的isActive的屬性為True
#先查詢出需要修改的對象,然后修改屬性
user=db.session.query(Users).filter_by(username='小紅').first()
user.isActive=True

#2.刪除姓名為小紅的數據
user=db.session.query(Users).filter_by(username='小紅').first()
db.session.delete(user)

5.基於實體類的查詢

1.語法:實體類.query.查詢過濾器函數().查詢執行函數()

2.示例:

1.查詢Users實體中所有的數據
users.query.all()
2.查詢Users實體中isActive為True的數據
Users.query.filter_by(isActive=True).all()
Users.query.filter(Users.isActive==True).all()

比較db.session和實體類的查詢不同點

#基於實體類查詢
post_obj=Post.query.filter(Post.id==1).first()

#db.session查詢方式
post_test=db.session.query(Post.id,Post.title).filter(Post.id==1).first()

注意:db.session方式查詢query中必須要寫東西,因為要從query中獲取從哪張表中查詢
如果查詢是多個結果就是列表套元組:[(id1,title1),(id2,title2),....]
db.session.query(模型類) 等價於 模型類.query ,db.session.query的功能更強大,可以進行多表查詢

 from sqlalchemy import func


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM