前言:本文是學習網易微專業的《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