python进阶09 MySQL高级查询
一、筛选条件
# 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空:IS NULL 非空:IS NOT NULL
# NULL 的查询比较特殊,只有在条件里加上IS NULL 或IS NOT NULL 才能够查询出NULL
#逻辑运算符 #与:AND 或:OR 非:NOT
范围查询
BETWEEN a AND b SELECT * FROM students WHERE age BETWEEN 17 AND 18;#查询students表中年龄在17和18之间(包括)的列 IN SELECT * FROM students WHERE age IN (16,19); #查询students表中年龄是16和19的列
模糊查询
LIKE % #任意多个字符 _ #一个字符 SELECT * FROM students WHERE name LIKE '%八';#查询students表中名字结尾为八的(前面可以是任何字符)的行 SELECT * FROM students WHERE name LIKE '_七';#查询students表中名字结尾为七的(前面只能是一个字符)的行 #% 和 _可以放前面和后面,_可以是任意个 #原则是以“像什么样子样子”去皮费
二、排序与去重
排序
ORDER BY (排序) SELECT columns FROM students ORDER BY ord_col_1 [asc/desc];#中括号可加可不加 asc #正序(默认) desc #倒序 SELECT * FROM students ORDER BY age desc,number asc ;#查询students表中按年龄倒序,学号正序的顺序排序的结果;age后不加东西默认表示正序
去重
DISTINCT #去重关键字 SELECT DISTINCT columns FROM tb_name SELECT DISTINCT klass,age FROM students;#将students表中klass列和age列都相同的列去重 如果直接SELECT * ...是不会重复的(因为有主键的存在(唯一+非空)),所以我们要指定列查询
三、分组和聚合
#聚合:为了统计信息,将多个值聚在一起 #分组对于聚合意味着可以分组统计 #常用聚合函数 COUNT(*) #统计个数 MAX(columns) #最大值 MIN(columns) #最小值 SUM(columns)#求和 AVG(columns)#平均数 SELECT COUNT(*) FROM students;#统计这个表中有多少行 SELECT name,age(*) FROM students; #会报错,原因是永乐聚合函数就不能原来的查询方法,用子查询可以解决这个问题 SELECT * FROM students WHERE age =(SELECT MAX(age) FROM students);#这个就可以解决想要实现的聚合函数课原来函数的方法
聚合分组
GROUP BY #分组 SELECT group_columns,aggregations FROM tb_name GROUP BY group_column; SELECT * FROM students GROUP BY klass;#报错,原因是在分组的情况下,只应该出现分组列和聚合列,其他的列没有任何意义 SLEECT klass,COUNT(*) FROM students GROUP BY klass;#按klass分组后,查询这两klass中各组的数量 #分组的时候只应该出现分组列和聚合列 原因是获得的聚合数不属于任何一个原来的数据 #如果不分组,如果有聚合列就只能有聚合列
聚合筛选
#筛选出平均年龄大于17.5的行 SELECT klass,AVG(age) FROM students GROUP BY age HAVING AVG(age)>17.5 HAVING #只有在聚合分组的时候筛选的 #筛选顺序总结: #ON > WHERE > HAVING
四、限制与分页
#一次性不需要那么多数据,如何第自定义行开始算 #限制结果个数 SELECT columns FROM tb_name LIMIT count; #限制为start个结果 SELECT columns FROM tb_name LIMIT start,count;#从start+1行开始计算,限制count个结果 #分页:必须要在python里面定义变量 SELECT columns FROM tb_name LIMIT (n-1)*m,m sql=(SELECT * FROM students LIMIT %s%s)%((n-1)*m,m)
五、作业
用python实现分页查询(先input函数获取用户想看的页码,再去返回查询)
import pymysql#导入pymysql db_config = { 'user': 'root', 'password': 'qwe123', 'db': 'python3', 'charset': 'utf8', } def get_page(n, m):定义获取n,m函数 try: cur = conn.cursor()#连接游标 sql='SELECT * FROM students LIMIT %s,%s' % ((n - 1) * m, m)#sql代码:按第n-1页,每m行查询 cur.execute(sql)#执行sql代码 for s in cur.fetchall():遍历结果集 print(s) except Exception as a:#错误情况 print(a) conn.rollback() finally: cur.close()#关闭游标连接 try: conn=pymysql.connect(**db_config)#连接 while True:#除非正确,不然不执行 n=int(input('请输入页面号:'))#输入页码 m=int(input('请输入行号:'))#确定行号 get_page(n,m)#执行get_page函数 except Exception as b:#错误情况 print(b) #这里没有加cur.commit()的原因是没有修改数据库,只有修改了才需要commit