數(shù)據(jù)查詢是數(shù)據(jù)庫(kù)常規(guī)操作的四大龍頭之一,既然想要享受查出數(shù)據(jù)時(shí)的喜悅,必然要經(jīng)受數(shù)據(jù)查詢語(yǔ)句的洗禮。胖胖奉上一份查詢語(yǔ)句小總結(jié)。
這里做了一個(gè)簡(jiǎn)單的表,插入了一些數(shù)據(jù),創(chuàng)建數(shù)據(jù)表可看上篇書書:淺談flask_sqlalchemy(1)
class Person(db.Model):
"""
用戶表
"""
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), unique=True)
password = db.Column(db.String(32))
nickname = db.Column(db.String(32), default="")
age = db.Column(db.Integer, default=18)
gender = db.Column(db.String(16), default="男")
photo = db.Column(db.String(32), default="1.jpg") # 頭像
phone = db.Column(db.String(32), nullable=True) # 用戶電話
email = db.Column(db.String(64), nullable=True) # 用戶郵箱
address = db.Column(db.Text, nullable=True) # 用戶地址
score = db.Column(db.Float, nullable=True)
1. 查詢單個(gè)數(shù)據(jù) - get
# 查詢id為25的用戶信息
person = Person.query.get(25)
print(person)
print(person.nickname, person.gender, person.age)

單個(gè)查詢.png
get方法只能通過(guò)id查詢,使用較少
2. 查詢所有數(shù)據(jù) - all
# 查詢所有用戶信息
person_list = Person.query.all()
print(person_list)
for person in person_list:
print(person.nickname, person.gender, person.age)
查詢所有數(shù)據(jù)得到的是一個(gè)列表,要通過(guò)for循環(huán)將其列出
3.查詢當(dāng)前的部分?jǐn)?shù)據(jù) - filter-by和filter
# 查詢所有的男性用戶
person_list = Person.query.filter_by(gender="男")
for person in person_list:
print(person.nickname, person.gender, person.age)
# 查詢所有的年齡大于20歲的男性用戶
person_list = Person.query.filter(Person.age > 20, Person.gender == "男")
for person in person_list:
print(person.nickname, person.gender, person.age)
這里胖胖想想強(qiáng)調(diào)filter_by和filter的些許區(qū)別
- filter_by適合簡(jiǎn)單的、按照字段進(jìn)行固定值的查詢,比如:性別為男
- filter適合比較復(fù)雜的查詢,比如:比較、模糊、聚類
- 不知道大家發(fā)現(xiàn)沒(méi)有,filter_by和filter都查詢了條件性別為男,但是一個(gè)用了
=,另一個(gè)用了==,在使用時(shí)千萬(wàn)要注意哦
4. 模糊查詢 - like
# 查詢所有年齡大于21歲的張性男同事
person_list = Person.query.filter(
Person.age > 21,
Person.gender == "男",
Person.nickname.like("張%")
)
for person in person_list:
print(person.nickname, person.gender, person.age)

模糊查詢.png
5.限制查詢 - limit和offset
# 查詢10位年齡小于21歲的女性用戶
person_list = Person.query.filter(
Person.age < 21,
Person.gender == "女"
).limit(10)
for person in person_list:
print(person.nickname, person.gender, person.age)
一般和限制查詢搭配使用的有.offset()方法
# 從第二十位用戶開始查詢10位年齡小于21歲的女性用戶
person_list = Person.query.filter(
Person.age < 21,
Person.gender == "女"
).limit(10).offset(20)
for person in person_list:
print(person.id, person.nickname, person.gender, person.age)
- .limit()方法限制返回的條數(shù)
- .offset()方法規(guī)定查詢的起始位置
6.排序查詢 - order_by
# 從查詢10位年齡小于21歲的女性用戶且按年齡升序排列
person_list = Person.query.filter(
Person.age < 21,
Person.gender == "女"
).order_by(Person.age)
for person in person_list:
print(person.id, person.nickname, person.gender, person.age)

升序排列.png
# 從查詢10位年齡小于21歲的女性用戶且按年齡降序排列
person_list = Person.query.filter(
Person.age < 21,
Person.gender == "女"
).order_by(Person.age.desc())
for person in person_list:
print(person.id, person.nickname, person.gender, person.age)

降序排列.png
- 通過(guò)上面的代碼和圖片對(duì)比發(fā)現(xiàn),
order_by默認(rèn)升序排列,但是通過(guò)設(shè)置.desc()方法進(jìn)行降序排列
7.聚合查詢 ( 敲黑板 )
聚合查詢常用的方法有Max、Min、count、sum、avg
但是需要注意的是使用聚合方法需要引入func模塊
from sqlalchemy import func
result = db.session.query(
func.count(Person.id),
func.Max(Person.score),
func.Min(Person.age),
func.avg(Person.age),
).filter(Person.gender == "男", Person.nickname.like("趙%")).all()
print(result)

截圖參考.png
8. 分組查詢 - group_by
# 查詢男性用戶和女性用戶的數(shù)量
from sqlalchemy import func
result = db.session.query(
Person.gender,
func.count(Person.id),
).group_by(Person.gender).all()
print(result)

分組查詢.png
9. 邏輯查詢 - and_ or_ not_
filter多條件查詢得到的是并列關(guān)系,但是sqlalchemy有專門的邏輯查詢模塊,只要在導(dǎo)入就可以使用啦
- 導(dǎo)入模塊語(yǔ)句
from sqlalchemy import and_
from sqlalchemy import or_
from sqlalchemy import not_
- 并列也可以通過(guò)filter體現(xiàn),取反也可以通過(guò)不等于體現(xiàn),這里胖胖以
or_來(lái)舉例
# 查詢所有趙姓同事或者女同事
person_list = Person.query.filter(
or_(
Person.nickname.like("趙%"),
Person.gender == "女"
)
)
for person in person_list:
print(person.id, person.nickname, person.gender, person.age)
結(jié)語(yǔ):
還是要勤加練習(xí),眼過(guò)千遍不如手過(guò)一遍。一直在路上,奧利給。
如有不妥,歡迎指正