Python服務器運維筆記:第一章數據庫精講 - 1.1.7 SQL統計與排序

前言:本文是學習網易微專業的《python全棧工程師》 中的《服務器運維開發工程師》專題的課程筆記,歡迎學習交流。同時感謝老師們的精彩傳授!

一、課程目標

  • limit限制
  • 聚合查詢
  • 結果排序

二、詳情解讀

2.1.limit限制
2.1.1.limit限制查詢記錄數

如果記錄數很多的時候,通常不會在一次查詢中取出全部結果,而是通過limit來限制

select * from table limit offset_start, row_count;

說明:
offset_start:偏移起始位置,默認爲0,查詢結果不包含起始位置。
row_count:記錄數。

例子:

select * from users limit 0, 10 # 取出前 10 條會員記錄
select * from users limit 10 # 取出前 10 條會員記錄。省略了offset_start
select * from users limit 10, 15 # 從偏移點 10 的位置向後取出 15 條會員記錄
2.1.2.count - 統計

如果我們想通過limit的方法來實現翻頁的話,需要知道總頁數,那麼就需要知道有多少條記錄

select count(1) from table
select count(field) from table  # field爲null的不統計
select count(*) from table # 全部列統計

例子:統計上海的會員數量

select count(*) from users where city=021
2.1.3.sum - 求和

sum對某個列進行求和,count是統計有多少條記錄

select sum(field) from tables

例子:
統計上海會員的money總額

select sum(money) from users where city=021

統計北京會員的age總和

select sum(age) from users where city=010
2.1.4.avg - 求均值

avg對某個列求平均值,相當於sum(field)/count()

select avg(field) from tables

例子:
查詢上海會員的money平均值

select avg(money) from users where city=021

統計北京會員的age平均值

selct avg(age) from users where city=010
2.1.5.max、min - 最大值、最小值
select max(field) from tables
select min(field) from tables

例子:
查詢上海會員中最有money

select max(money) from users where city=021

統計北京會員中age最小的

select min(age) from users where city=010
2.1.6.group by - 分組統計

將之前的聚合查詢進行分組查詢

select func from tables group by field

例子:
查詢各城市最有money

select max(money) from users group by city

統計各城市的會員數量

select count() from users group by city

統計各城市的會員中男性數量

select count() from users where sex='男' group by city

實操一: sqlalchemy實現聚合查詢

新建文件12_count_groupby.py,寫入以下代碼:

# -*- coding=utf-8 -*-

from select_sqlalchemy import session, Users
from sqlalchemy import func

# count方法不能用於分組統計
# res = session.query(Users).count()

# 使用func
# count
res = session.query(func.count(1),Users.city).group_by(Users.city).all()
print("count:",res)
print("*"*100)
# avg
res = session.query(func.avg(Users.age),Users.city).group_by(Users.city).all()
print("avg:", res)
print("*"*100)

# sum
res = session.query(func.sum(Users.age),Users.city).group_by(Users.city).all()
print("sum:", res)
print("*"*100)

#max
res = session.query(func.max(Users.age),Users.city).group_by(Users.city).all()
print("max:",res)

select_sqlalchemy.py內容如下:

# -*- coding=utf-8 -*-
# 需要安裝sqlalchemy
# pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
# pip install pymysql
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String, Enum
from sqlalchemy.ext.declarative import declarative_base

# 創建數據庫引擎
engine = create_engine("mysql+pymysql://root:123456@localhost/mycms")

# 創建會話對象,根據不同的數據庫引擎創建對應的會話對象
Session = sessionmaker(bind=engine)
# 創建會話對象實例
session= Session()

# Base爲映射基類
Base = declarative_base()
# 數據表模型
class Users(Base):
    __tablename__ = "users"
    user_id =  Column(Integer, primary_key=True)
    username = Column(String(25))
    realname = Column(String(25))
    password = Column(String(64))
    age = Column(Integer)


# 查詢
if __name__ == "__main__":
    res = session.query(Users, Users.username).filter(Users.username.like("%x%")).limit(10).all()

    print(res)
2.1.7.having - 對查詢結果過濾

where條件語句是對field字段的值進行過濾查詢,有時我們需要對查詢結果字段進行過濾,比如對count的結果中大於某個值進行過濾,這時候需要having

select count(*) as num from tables group by field having num > 20
2.1.8. order by - 排序

根據字段值排序
desc:降序
asc:升序

select * from tables order by field desc | asc

例子:
根據用戶id降序排序

select * from users order by user_id desc

根據用戶id升序排序

select * from users order by user_id asc

示例:

從降序排序的查詢結果中取出20條記錄值。

select * from mycms.users order by user_id desc limit 20

實操二:sqlalchemy中使用排序:

新建文件13_order_sqlalchemy.py,並寫入下面代碼:

# -*- coding=utf-8 -*-
# select_sqlalchemy與實操一中的一樣
from select_sqlalchemy import session, Users
from sqlalchemy import func

res = session.query(Users,Users.user_id,Users.username, Users.city)\
             .order_by(Users.user_id.desc()).limit(10000).offset(10).all()
for item in res:
    print(item)
2.2.翻頁實現

翻頁實現步驟:
1.根據條件,使用count()獲得記錄總數total
2.設定每頁顯示記錄數pagesize
3.總頁數計算公式:total_pages = ceil(total/pagesize)
4.根據當前頁數計算查詢偏移:start=(current_page-1)*pagesize
5.使用limit獲得相應的記錄:limit start, pagesize

實操三: 使用sqlalchemy實現翻頁

# -*- coding=utf-8 -*-

from select_sqlalchemy import session, Users
from math import ceil

# 每頁顯示條數
PAGE_SIZE = 10

# 查詢獲得總條數
total = session.query(Users).count()
print(total)

# 根據總條數計算總頁數
total_page = ceil(total/PAGE_SIZE)
print(total_page)

# 根據當前頁計算start位置
# 第一頁
CURRENT_PAGE=10
# limit start, offset
# 第一頁是limit 0,10
# 因此計算方法爲:
start = (CURRENT_PAGE-1)*PAGE_SIZE

res = session.query(Users).offset(start).limit(PAGE_SIZE).all()
for item in res:
    print(item.user_id, item.username)

三、課程小結

  • 01 limit,限制每次查詢結果數量
  • 02 count
  • 03 order
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章