MySQL数据库多表查询;练习和Python代码操作MySQL

MySQL数据库

多表查询练习题

python代码操作MySQL

基于python代码和MySQL实现用户登录注册

 

 

多表查询练习题

在编写较为复杂的SQL查询语句时不要想着一口气写完

写一点检查一下看一下再写

任何复杂的SQL语句都是慢慢拼凑出来的

在编写复杂的SQL语句的时候可以先写出中文的思路 之后在慢慢拼凑SQL语句

 

多表查询题目的大体思路

这道题目涉及到几张表的数据

组要的数据在这几张表中 需要利用多表查询 思考到底是用连表的方法还是子查询的方法何时

最后再确定select后面需要的字段名称

 

1.查询所有的课程名称以及对应的认可老师姓名

 步骤1:这个题目涉及到几张表 课程表和老师表

步骤2:需要的数据在这两张表中 需要利用多表查询 思考一下决定用连表操作

步骤3:最后确定select后需要的字段名称

select course.cname,
teacher.tname
from course
inner join
teacher on course.teacher_id
=teacher.tid;

 

 

 

 

2.查询平均成绩大于80分的同学的姓名和平均成绩

步骤1:需要用到几张表 学生表和成绩表

步骤2:分析题目的意思可以知道现需要拿到分数表中平均成绩大于80分的学生id号

步骤3:由于最终的需求是学生姓名和第二步中的平均成绩 所以采用连表的方法更合适

先求每个学生的平均成绩 按照学生的id分组再利用几何函数avg求平均值

select student_id,avg(num) from score group by student_id having avg(num) >80;

 

 

 

然后将上面求出来的表与学生表连接到一起

select student.sname,d1.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 d1 on student.sid=d1.student_id;

 

 

 

 

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

步骤1.这道题目需要用到4张表

步骤2.求报了李平老师课程的学生的id

步骤3.再去学生表中取反操作获取到没有报李平老师课程的学生姓名

1 查询李平老师的id号

select tid from teacheer where tname='李平老师';

 

 

 

2 根据李平老师的id号筛选出课程的id号

select cid from course where teacher_id=
(select tid from teacher where tname='李平老师');

 

 

 

3 根据上一步筛选出的课程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='李平老师'));

 

 

 

4 去学生表中依据筛选出的学生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.先获取物理和体育课程的id号

select cid from course where name in ('体育','物理');

 

 

 

2.根据课程id筛选出所有报了物理和体育的学生id(两门都报了和只报一门的都在里面)

select * from score where course_id in 
(select cid from course where cname in ('物理','体育'));

 

 

 

3.按照学生的id分组 统计分组下课程数量 筛选出数量为1的即可(看到统计就可以使用聚合函数count)

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;

 

 

 

4.根据上步筛选出的学生id去学生表中筛选出学生姓名

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.在score表中筛选出挂科超过两门的学生

1.1 首先筛选出所有num小于60分的数据

select * from score where num <60;

 

 

 

2 然后按照学生id分组 统计每个学生挂科的次数 筛选出两门以及两门以上的

select student_id from score where num <60 
group by student_id having count(course_id) >=2;

 

 

 

3.根据学生id获取对应的学生姓名和班级号

select sname,class_id from student where sid in 
(select student_id from score where num < 60
group by student_id having count(course_id) >= 2)

 

 

 

4.最后将上述步骤的表和class连起来

select class.caption,d1.sname 
from class inner join
(select sname,class_id from student where sid in
(select student_id from score where num < 60
group by student_id having count(course_id) >= 2))
as d1 on class.cid=d1.class_id;

 

 

 

python操作MySQL需要借助于第三方模块

python代码操作MySQL需要借助于第三方模块

第三方模块也只是别人在网络上写的

要想使用第三方模块就必须现在网络上下载

 

python如何下载模块

pip3 (环境变量 python解释器文件夹下面的scripts目录)

 

下载模块的方法及语句

1.cmd终端

pip3 install pymysql

2.pycharm终端

pip3 install pymysql

3.pycharm快捷方式

 

 

 

远程仓库

pip3下载模块的时候默认都是从国外的仓库下载模块数据

下载的过程有时候会非常的慢,我们可以切换到国内的仓库

(1)阿里云 http://mirrors.aliyun.com/pypi/simple/
(2)豆瓣 http://pypi.douban.com/simple/
(3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
(4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
(5)华中科技大学http://pypi.hustunique.com/

1.命令临时切换
pip3 install 模块名 -i 仓库地址


2.pycharm更改仓库地址
settings 下载模块界面下方点击manage...

 

 

3.永久更改
需要修改python解释器内置的配置文件(不推荐使用)

 

pip3下载模块报错怎么解决

1.报错信息里面含有timeout关键字
原因:当前计算机网络不稳定
措施:多执行几次或者更换网络


2.报错信息里面含有warning警告版本过低
原因:pip3工具版本过低需要更新
措施:直接拷贝提示的更新命令更新即可


3.报错信息里面没有任何关键字就是一堆红色字体
原因:可能是即将下载的模块对计算机环境有要求
措施:下载之前需要先准备好环境(百度搜一下)

 

pymysql模块

import pymysql
# 创建连接对象
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='2000915',
    database='ddd5',
    charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 生成游标对象 等待用户输入命令
# 自定义sql语句
sql = 'select * from teacher'
# 执行sql语句
cursor.execute(sql)
# 获取执行的结果
res = cursor.fetchall()
print(res)

 

多表查询练习题库:https://www.cnblogs.com/Dominic-Ji/p/10875493.html

 

posted @ 2021-09-09 16:08  ふじわらたくみ  阅读(313)  评论(0编辑  收藏  举报