Python-pymysql模块和多表查询

pymysql模块

  • 建立链接 conn

  • 获取游标cur

  • 执行sql execute(sql,(可迭代类型的参数集))

    • sql是查 -- 只涉及文件的读操作

      • fetchone()

      • fetchmany(n)

      • fetvhall()

    • 增删改 -- 涉及到文件的写操作

      • conn.comimit()

  • 关闭游标和链接

    • cur.close()

    • conn.close()

代码实现:

import pymysql
conn = pymysql.conn(host = 'localhost', user = 'root', password = '123', database = 'demo')  # 返回的是一个对象

# cur游标 cur数据库操作符
cur = conn.curson()  
sql = 'insert into employee values(%s, %s, %s, %s)'
# 操作文件
with open('add.file', 'r', encoding='utf-8') as f:
   for line in f:
       try:
           lst = line.strip().split('|')
           cur.execute(sql,lst)  # 会自动将数据补充
           conn.commit()
       except:
           conn.rollback()
cur.close()
conn.close()


# sql 注入
# 登录注册 + database
# 表 userinfo

cur = conn.curson()
name = input('请输入用户名:')
password = input('请输入用户密码:')
sql = 'select * from userinfo where username = %s and password = %s;'
ret = cur.execute(sql,(name,password))
if ret:
   print('登陆成功')
else:
   print('登陆失败')

多表查询

连表

内连接(所有不在条件匹配内的数据,都会被踢出连表)

方式一:
select * from employee,department where dep_id = department.id;

方式二:
select * from employee inner join department on dep_id = department.id;

实例1:以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,即找出年龄大于25岁的员工以及员工所在的部门
select employee.name,department.name from eemployee inner join department on dep_id = department.id wwhere age > 25;
取别名简写代码:
select e.name,d.name from employee e inner join department d on dep_id = d.id where age > 25;

示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示
select * from employee inner join department d on dep_id = d.id order by age;

外连接

左外连接 left join
select * from employee left join department on dep_id = department.id;

右外连接 right join
select * from employee right join department on dep_id = department.id;

全外连接 full join
select * from employee left join department on dep_id = department.id
union
select * from eemployee right join department on dep_id = department.id;

子查询

查询平均年龄再25以上的部门名:
   先再employee中查询平均年龄再25以上的部门id
   select dep_id from employee group by dep_id having avg(age) > 25;
   再去department中查询部门名字
   select name from department where id in (select dep_id from employee group by dep_id having avg(age) > 25);
   
查看技术部员工姓名:
   先去department中查询技术部的id
   select id from department where name = '技术':
   再去employee中查询员工姓名
   select name from employee where dep_id = (select id from department where name = '技术');
   
查看不足1人的部门名(子查询得到的是有人的部门id):
   先再employee中查看有人的部门id
   select distinct dep_id from employee;
   再去department中找什么id没有再上面的表中
   select name from department where id not in (select distinct dep_id from employee);
   
查询大于所有人平均年龄的员工名与年龄:
   先查所有人的平均年龄
   select avg()age from employee;
   在查询大于平均年龄的员工名与年龄
   select name,age from employee where age > (select avg(age) from employee);
   
查询大于部门内平均年龄的员工名、年龄:
   先查询各部门的平均年龄
   select dep_id,avg(age) from employee group by dep_id;
   将上面所得到表与employee表连接起来
   select * from employee as e inner join (select dep_id,avg(age) from employee group by dep_id) as t on e.dep_id = t.dep_id;
   再查询大于各部门中大于平均年龄的人
   select * from employee as e inner join (select dep_id,avg(age) from employee group by dep_id) as t on e.dep_id = t.dep_id where e.age > t.avg(age);
   

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/womenzt/p/12436853.html