内容回顾: 1.外键的变种 表和表之间的关系 一对多或多对一 多对多 一对一 左表 右表 多 一 一 多 多对多,使用第三张表 建立关系 2.补充 核心: 数据驱动视图 json-server 设计模式: MVC ===> MTV Model - View -Controller 3.单表查询 关键字的优先级 select * from user where id > 2 group by post having count(1) > 10 order by age desc limit 0,2; from where group by having select order by limit where >,< >=,<=, != between xxx and ooo in(20,30,40) and or not sql_mode = ONLY_FULL_GROUP_BY 分组之后只能获取分组的字段,如果想获取组内的信息,是通过聚合函数 聚合函数: count(1) 计算总个数 avg() sum() max() min() 今日内容: 1、单表查询 having 二次筛选 having后面的字段只能是分组(group by)之后字段 1.查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数 select post,group_concat(name),count(1) from employee group by post having count(1) < 2; 2. 查询各岗位平均薪资大于10000的岗位名、平均工资 select * from employee where salary not in (select avg(salary) as A from employee group by post having A > 10000); select post,avg(salary) as A from employee group by post having A > 10000 3. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资 select post,avg(salary) from employee group by post having avg(salary) between 10000 and 20000; order by asc 升序 desc 降序 limit 0,5 第一个参数起始位置,第二个参数显示的个数 2、多表查询 select employee.name as a,department.name as b from employee,department where employee.dep_id = department.id and employee.name = 'egon'; select * from (select employee.name as a,department.name as b from employee,department where employee.dep_id = department.id) as A where A.a ='egon'; select * from employee,department where employee.dep_id = department.id 外链接操作 内连接: 符合条件查询 只连接匹配的行 select * from employee inner join department on employee.dep_id = department.id; 左连接: 优先显示左表记录 select * from employee left join department on employee.dep_id = department.id; 右连接: 优先显示右边记录 select * from employee right join department on employee.dep_id = department.id; 全外连接: select * from employee left join department on employee.dep_id = department.id union select * from employee right join department on employee.dep_id = department.id 3.符合条件查询 以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25, 即找出年龄大于25岁的员工以及员工所在的部门 select department.name,employee.name from employee inner join department on employee.dep_id = department.id where age > 25 4.子查询 子查询是将一个查询语句嵌套在另一个查询语句中。 一个查询语句查询的结果作为另一个查询语句的条件 1、查询平均年龄在25岁以上的部门名 select name from department where id in (select dep_id from employee group by dep_id having avg(age) > 25); 2、查看不足1人的部门名 select name from department where id not in (select dep_id from employee group by dep_id); 3、查询大于所有人平均年龄的员工名与年龄 select name,age from employee where age > (select avg(age) from employee); 4、查询大于部门内平均年龄的员工名、年龄 思路: (1)先对员工表(employee)中的人员分组(group by),查询出dep_id以及平均年龄。 (2)将查出的结果作为临时表,再对根据临时表的dep_id和employee的dep_id作为筛选条件将employee表和临时表进行内连接。 (3)最后再将employee员工的年龄是大于平均年龄的员工名字和年龄筛选。 select * from employee inner join (select dep_id,avg(age) as b from employee group by dep_id) as A on employee.dep_id = A.dep_id where employee.age > A.b; 5.查询每个部门最新入职的那位员工 select name from employee inner join (select post,max(hire_date) as newTime from employee group by post) as A on employee.post = A.post where employee.hire_date = A.newTime; 5.pymysql模块的使用 (1)pip install pymysql import pymysql username = input('请输入用户名:') pwd = input('请输入密码:') # 建立连接 conn = pymysql.connect( host='localhost', user='root', password="", database='db13', port=3306, charset='utf8' ) # 创建游标 cur = conn.cursor() sql = 'select * from userinfo where name="%s" and pwd="%s"'%(username,pwd) print(sql) res = cur.execute(sql) print(res) # 游标关闭 连接关闭 cur.close() conn.close() if res: print('登录成功') else : print('登录失败')