多表查询练习题

python cursor执行多个查询sql python多表联合查询_mysql

python cursor执行多个查询sql python多表联合查询_mysql_02

/*
 数据导入:
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 50624
 Source Host           : localhost
 Source Database       : sqlexam

 Target Server Type    : MySQL
 Target Server Version : 50624
 File Encoding         : utf-8

 Date: 10/21/2016 06:46:46 AM
*/

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
COMMIT;

-- ----------------------------
--  Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
COMMIT;

-- ----------------------------
--  Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
COMMIT;

-- ----------------------------
--  Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '钢蛋'), ('3', '男', '1', '张三'), ('4', '男', '1', '张一'), ('5', '女', '1', '张二'), ('6', '男', '1', '张四'), ('7', '女', '2', '铁锤'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '刘三'), ('14', '男', '3', '刘一'), ('15', '女', '3', '刘二'), ('16', '男', '3', '刘四');
COMMIT;

-- ----------------------------
--  Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

View Code

将数据表创建为sql文件

python cursor执行多个查询sql python多表联合查询_Server_03

 

 

navicat中导入sql文件

首先建立连接,选择mysql

python cursor执行多个查询sql python多表联合查询_mysql_04

 

 

 

输入密码

python cursor执行多个查询sql python多表联合查询_mysql_05

 

 

右键新建数据库,字符编码选择 utf8mb4

python cursor执行多个查询sql python多表联合查询_Server_06

 

 

 

右键 t2 运行sql文件,文件选择建好的sql文件 刷新表 数据内容关系如下:

 

python cursor执行多个查询sql python多表联合查询_ci_07

 

 

 

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

 

python cursor执行多个查询sql python多表联合查询_mysql_08

 

 

 解题思路要先考虑要到哪几张表 这道题用到了老师表与课程表,做inner join 拼接 课程表中的teacheri_id对应教师表中的id

然后在根据题目意思 把获取到的数据表格看做一张新的数据表 ,从中获取想要的 课程名和老师名

python cursor执行多个查询sql python多表联合查询_ci_09

 

 

 

python cursor执行多个查询sql python多表联合查询_ci_10

 

 

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

第一步 考虑需要用到哪两张表  学生表&成绩表

第二步 先获取学生表中的平均成绩

select student_id,avg(num) from score group by student_id

python cursor执行多个查询sql python多表联合查询_ci_11

 

 

 第三步 获取大于八十分的同学

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

python cursor执行多个查询sql python多表联合查询_ci_12

 

 

 第四步 做连表操作 与学生表进行相连 需要给这个avg(num)重命名一个名字,不然在取值时 因为是个函数 而不是一个名字 会报错

select * from student inner join(select  student_id,avg(num) as av_num

python cursor执行多个查询sql python多表联合查询_ci_13

 

 

 第五步 将* 替换成想要的数据

python cursor执行多个查询sql python多表联合查询_mysql_14

 

 

   

python cursor执行多个查询sql python多表联合查询_mysql_15

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

 

 

 第一步 需要用到课程表 学生表 老师表 成绩表 

第二步 获取李平老师的授课id号

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

python cursor执行多个查询sql python多表联合查询_ci_16

 

 

 

 第三步 从课程表中获取李平老师教课的id号

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

python cursor执行多个查询sql python多表联合查询_mysql_17

 

 

 第四步 从成绩表中获取选了李平老师课程的学生id 并进行去重

SELECT DISTINCT student_id FROM score where course_id in( select cid FROM course where teacher_id=(select tid from teacher where tname='李平老师'));

python cursor执行多个查询sql python多表联合查询_Server_18

 

 

 第五步 与student 表做对比 筛选出没有选李平老师的课的学生的名字

python cursor执行多个查询sql python多表联合查询_mysql

python cursor执行多个查询sql python多表联合查询_mysql_02

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='李平老师')));

View Code

 

python cursor执行多个查询sql python多表联合查询_mysql_21

 

 

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

       (只要报了一门的 两门都报和都不报的都不要)

第一步  需要用到课程表,学生表,成绩表

第二部 先获取 体育和物理的编号 

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

python cursor执行多个查询sql python多表联合查询_ci_22

 

 

 第三步 获取报了物理和体育 以及都报了的学生编号

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

python cursor执行多个查询sql python多表联合查询_mysql_23

 

 

 第四步 获取只报了体育或者物理的学生id

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

python cursor执行多个查询sql python多表联合查询_mysql_24

 

第五步 对比姓名

 

python cursor执行多个查询sql python多表联合查询_Server_25

 

 

 

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

第一步 需要用到 学生表 成绩表 班级表

第二步 先获取所有挂科的人

select student_id from score where num<60;

python cursor执行多个查询sql python多表联合查询_Server_26

 

 

 第三步 在对挂了两次的人进行分组筛选

python cursor执行多个查询sql python多表联合查询_mysql_27

 

 

 

python cursor执行多个查询sql python多表联合查询_ci_28

 

 

 第四步 获取姓名 以及班级

python cursor执行多个查询sql python多表联合查询_mysql_29

 

 

 

python cursor执行多个查询sql python多表联合查询_Server_30

 

 

 

第五步 对应班级表 做拼接

python cursor执行多个查询sql python多表联合查询_ci_31

 

 

 

python cursor执行多个查询sql python多表联合查询_mysql_32

 

 

用 python操作mysql

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

 从本质上来说 第三方模块也是模块,网上其他人写的模块

如果需要使用就要从网络中下载,就类似于打一个dlc

首先需要使用一个工具 pip

打开 cmd 输入pip 

python cursor执行多个查询sql python多表联合查询_Server_33

 

 

 

打开pycharm 

查看 现在使用的python 解释器是哪个

python cursor执行多个查询sql python多表联合查询_mysql_34

 

 

 找到路径D:\Python\Scripts添加到环境变量中去

下载模块的基本语句

1.通过cmd终端 输入

 pip3 install pymysql  即可下载

2.通过pychram 下载

python cursor执行多个查询sql python多表联合查询_ci_35

 

 

 点击 terminal 输入 pip3 instal pymysql

python cursor执行多个查询sql python多表联合查询_ci_36

 

 

 再输入python -m pip install --upgrade pip更新到最新版本

python cursor执行多个查询sql python多表联合查询_mysql_37

 

 

关于远程工具

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/

命令临时切换

pip3 install 模块名 -i 网站地址

pycharm 更改仓库地址

python cursor执行多个查询sql python多表联合查询_Server_38

 

 

 点击下方

python cursor执行多个查询sql python多表联合查询_mysql_39

 

 

python cursor执行多个查询sql python多表联合查询_mysql_40

 

 

 #在下载模块中报错信息里有timeout关键字意为网络连接不稳定 

warning 警告版本过低  可以直接拷贝提示的更新命令 更新就行

如果是一堆红字的警告 可能是环境出了问题

pymsql模块

python cursor执行多个查询sql python多表联合查询_ci_41

 

 

import pymysql

# 创建连接对象
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123456',
    database='t2',
    charset='utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor #固定搭配 可以显示每一个数据对应的内容并且以列表套字典的形式打包返回方便以后for 取值)  # 生成游标对象 等待用户输入命令
# 自定义sql语句
sql = 'select * from teacher'
# 执行sql语句
cursor.execute(sql)
# 获取执行的结果
res = cursor.fetchall()
print(res)