首页 > 数据库 >Navicat及python第三方模块pymysql

Navicat及python第三方模块pymysql

时间:2022-11-28 21:59:41浏览次数:43  
标签:python pymysql Navicat course teacher student where id select

目录

可视化软件Navicat

可视化软件就是第三方开发的用来充当数据库客户端的简单快捷的操作界面,底层的本质还是SQL,第三方的可视化最出名还是Navicat

1.Navicat的下载

​ 官网直接下载,版本很多,能充当数据库客户端也很多版本,版本越新兼容性越强。关于破解方式,可以直接下载老版本,或者下载新版本先试用再破解(比如修改日期)

常用的操作有:创建库、表、记录、外键;逆向数据库到模型、模型创建;新建查询可以编写SQL语句并自带提示功能;运转、转储SQL文件等操作

SQL语句注释
单行注释   -- 、# 、
		eg: -- SELECT * from userinfo;
多行注释  \**\

2.Navicat下的多表查询练习题

小技巧:编写复杂的SQL,要明确思路,一步一步的写

​ 1.先确定需要用到几张表

​ 2.预览表中的数据,做到心中有数

​ 3.确定多表查询的思路(连表、子查询、混合操作)

1、查询所有的课程的名称以及对应的任课老师姓名

#  1.先确定需要用到几张表  课程表 课程表
# 2.预览表中的数据 做到心中有数
-- select * from course;
-- select * from teacher;
# 3.确定多表查询的思路 连表 子查询 混合操作
-- select * from course inner join teacher on course.teacher_id=teacher.tid
select teacher.tname,course.cname from course inner join teacher on course.teacher_id=teacher.tid

2、查询平均成绩大于八十分的同学的姓名和平均成绩

#  1.先确定需要用到几张表  分数表  学生表
# 2.预览表中的数据 做到心中有数
select * from score;
select * from student;
# 3.根据已知条件80分 选择切入点 分数
# 求每个学生的平均成绩 按照student_id分组 然后avg求num即可
select student_id,avg(num)as avg_num from score group by student_id
select student_id,avg(num)as avg_num from score group by student_id having avg_num > 80;
# 4.确定最终的结果需要几张表 需要两张表 采用连表更加合适
select student.sname,t1.avg_num from student inner join(select student_id,avg(num)as avg_num from score group by student_id having avg_num > 80) as t1 on student.sid = t1.student_id;

3、查询没有报李平老师课的学生姓名

#  1.先确定需要用到几张表  课程表,老师表,分数表  学生表
# 2.预览表中的数据
# 3.思路1:正向推导   思路2:筛选所有报了李平老师课程的学生id 然后取反即可
#先获取李平老师教授的课程id
select tid from teacher where tname= '李平老师';
select cid from course where teacher_id=(select tid from teacher where tname= '李平老师');
根据课程id筛选出所有报了李平老师的学生id
select distinct student_id from score where course_id in (select cid from course where teacher_id=(select tid from teacher where tname= '李平老师'));
根据学生id去学生表中取反获取学生姓名
select sname from student where sid not in (select distinct student_id from score where course_id in (select cid from course where teacher_id=(select tid from teacher where tname= '李平老师')));

4、查询没有同时选修物理课程和体育课程的学生姓名

# 1.先确定需要的表 课程表  学生表 分数表
# 2.预览表数据
# 3.根据物理和体育筛选课程表id
select cid from course where cname in ('物理','体育');

# 4.根据课程id筛选出所有物理和体育相关的学生id
select * from score where course_id in (select cid from course where cname in ('物理','体育'));
# 统计每个学生报了的课程数,筛选出等于1的
select student_id from score where course_id in (select cid from course where cname in ('物理','体育')) group by student_id having count(course_id)=1;

# 子查询获取学生姓名即可
select sname from student where sid in (select student_id from score where course_id in (select cid from course where cname in ('物理','体育')) group by student_id having count(course_id)=1);

5、查询挂科超过两门(包括两门)的学生姓名和班级

# 1.先确定需要的表 学生表 班级表 分数表
# 2.预览数据
select * from class;
select * from student;
select * from score;
# 3.先筛选出小于60分
select * from score where num < 60;
# 4.统计每个学生挂科的次数
select student_id,count(course_id) from score where num <60 group by student_id;
# 5.筛选出次数大于等于2的学生id
select student_id,count(course_id)  from score where num <60 group by student_id having count(course_id) >=2; 

# 6.连接班级表和学生表 然后基于学生id筛选即可
select student.sname,class.caption from student inner join class on student.class_id = class.cid where student.sid in (select student_id from score where num <60 group by student_id having count(course_id) >=2);

python操作MySQL

pymysql模块,需要下载 >>> pip3 install pymysql

1.连接MySQL服务器

import pymysql
conn = pymysql.connect(
	host= '127.0.0.1',
    post= 3306,
    user= 'root',
    password= '123',
    db='db4_03',
    charset= 'utf8mb4'
)

2.产生游标对象

# 括号里不填写额外参数,返回的数据是元组 但指定性不强 [(),()]
cursor = conn.cursor()

# 括号里填写参数,返回就是指定的参数
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

3.编写SQL语句

# sql = 'select * from teacher;'
sql = 'select * from score;'

4.发送SQL语句

affect_rows = cursor.execute(sql)  # execute 也有返回值,接收的是SQL语句影的行数
print(affect_rows)

5.获取SQL语句执行之后的结果

res = cursor.fetchall()
print(res)

pymysql补充说明

1.获取数据

fetchall()   获取所有的结果
fetchone()   获取结果集的第一个数据
fetchmany()  获取指定数量的结果集
这三种有点类似于文件光标移动的特性
如图
cursor.scroll(1,'relative')  # 基于当前位置往后移动
cursor.scroll(0,'absolute')  # 基于数据的开头往后移动
如图

2.增删改查

1.直接配置,自动确认
autocommit = True   # 针对增、删、改
2.代码确认,需要自动手动代码编辑
conn.commit()      # 针对增、删、改

标签:python,pymysql,Navicat,course,teacher,student,where,id,select
From: https://www.cnblogs.com/zhanglanhua/p/16933734.html

相关文章