python进阶09 MySQL高级查询

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
原文地址:https://www.cnblogs.com/xuchengcheng1215/p/8536574.html