第一关 数据库表创建
- 编程要求
在名为 nudt
的数据库下,创建课程表(Course)和教师表(Teacher),表结构如下:
课程表(Course)
字段名 | 字段类型 | 说明 |
---|---|---|
Cno | CHAR(10) | 课程编号(主键) |
Cname | CHAR(100) | 课程名称 |
Tno | CHAR(10) | 教师编号 |
教师表(Teacher)
字段名 | 字段类型 | 说明 |
---|---|---|
Tno | CHAR(10) | 教师编号(主键) |
Tname | CHAR(100) | 教师名称 |
Tsex | CHAR(10) | 教师性别 |
mysql
连接参数如下:
host='localhost',port=3306,user='root',passwd='123123'
- 代码实现
import pymysql
if __name__ == '__main__':
# **********begin********** #
conn = pymysql.connect(host='localhost',port=3306,
user='root',passwd='123123',
charset='utf8',db='nudt')
cursor = conn.cursor();
sql = """
CREATE TABLE Course(
Cno CHAR(10) PRIMARY KEY,
Cname CHAR(100),
Tno CHAR(10)
)ENGINE=innodb DEFAULT CHARSET=utf8;
CREATE TABLE Teacher(
Tno CHAR(10) PRIMARY KEY,
Tname CHAR(100),
Tsex CHAR(10)
)ENGINE=innodb DEFAULT CHARSET=utf8;
"""
cursor.execute(sql)
cursor.close()
conn.close()
# **********end********** #
第二关 数据更新
- 编程要求
将教师数据插入教师表(Teacher)
教师编号 | 教师名称 | 教师性别 |
---|---|---|
T1 | 周海芳 | 女 |
T2 | 周竞文 | 男 |
T3 | 谭春娇 | 女 |
T4 | 陈立前 | 男 |
T5 | 李暾 | 男 |
T6 | 毛晓光 | 男 |
将课程数据插入课程表(Course)
课程编号 | 课程名称 | 教师编号 |
---|---|---|
C1 | 大学计算机基础 | T1 |
C2 | 大学计算机基础 | T2 |
C3 | 数据库原理与技术 | T2 |
C4 | 大学计算机基础 | T5 |
C5 | 程序设计 | T1 |
C6 | 程序设计 | T4 |
C7 | 数字图像处理 | T1 |
C8 | 抽象代数 | T6 |
C9 | 离散数学 | T5 |
C10 | 软件可靠性 | T6 |
数据库连接参数如下:
host='localhost', port=3306,user='root', passwd='123123', db="nudt",charset='utf8'
- 代码实现
import pymysql
if __name__ == '__main__':
# **********begin********** #
conn = pymysql.connect(
host = 'localhost',
port = 3306,
user = 'root',
password = '123123',
database = 'nudt',
charset = 'utf8'
)
cursor = conn.cursor()
sql = 'insert into Teacher(Tno,Tname,Tsex) values(%s,%s,%s);'
data = [
('T1','周海芳','女'),
('T2','周竞文','男'),
('T3','谭春娇','女'),
('T4','陈立前','男'),
('T5','李暾','男'),
('T6','毛晓光','男')
]
cursor.executemany(sql,data)
conn.commit()
sql = 'insert into Course(Cno,Cname,Tno) values(%s,%s,%s);'
data = [
('C1','大学计算机基础','T1'),
('C2','大学计算机基础','T2'),
('C3','数据库原理与技术','T2'),
('C4','大学计算机基础','T5'),
('C5','程序设计','T1'),
('C6','程序设计','T4'),
('C7','数字图像处理','T1'),
('C8','抽象代数','T6'),
('C9','离散数学','T5'),
('C10','软件可靠性','T6')
]
cursor.executemany(sql,data)
conn.commit()
cursor.close()
conn.close()
# **********end********** #
第三关 单表查询
- 编程要求
1.查询所用表:Teacher
;
2.查询男老师数量并将数值赋予给变量 maleNum
;
3.查询女老师数量将数值赋予给变量 femaleNum
;
4.将变量 maleNum
与变量 femaleNum
输出到控制台,格式如 --> 变量名:数值(拼接时使用逗号拼接,不要使用加号)
- 代码实现
import pymysql
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
if __name__ == '__main__':
# **********begin********** #
# 获取连接对象
conn = pymysql.connect(host = 'localhost',port = 3306,
user = 'root',passwd = '123123',
db='nudt',charset='utf8')
# 获取光标
cs = conn.cursor()
# 查询男老师数量并将数值赋予给变量 maleNum
cs.execute("select* from Teacher where Tsex='男'")
maleNum = len(cs.fetchall())
# 查询女老师数量将数值赋予给变量 femaleNum
cs.execute("select* from Teacher where Tsex='女'")
femaleNum = len(cs.fetchall())
# 将变量 maleNum 与变量 femaleNum 输出到控制台,格式如 --> 变量名:数值
# 例如: maleNum:100
# 注意:一行输出一个变量,请先输出变量 maleNum ,其次是变量 femaleNum
print("maleNum: %d" % maleNum)
print("femaleNum: %d" % femaleNum)
cs.close()
conn.close()
# 绘制柱状图
plt.xticks(fontsize=12)
plt.yticks([]) # 不显示y轴刻度
plt.text(0, maleNum * 0.5, maleNum, ha='center', fontsize=30)
plt.text(1, femaleNum * 0.5, femaleNum, ha='center', fontsize=30)
plt.bar(range(2), (maleNum, femaleNum), color='gy', tick_label=('男', '女'))
plt.savefig("img/1.png")
# 关闭资源
# **********end********** #
第四关 多表查询
- 编程要求
-
统计教师的课程数量并按照教师名称倒序。
-
获取结果集,将其赋予给变量
results
并遍历结果集,按照格式 --> 教师:课程数量 ,输出到控制台。
连接参数如下:
host='localhost', port=3306,
user='root', passwd='123123',
charset='utf8', db="nudt"
课程表(Course)
字段名 | 字段类型 | 说明 |
---|---|---|
Cno | CHAR(10) | 课程编号(主键) |
Cname | CHAR(100) | 课程名称 |
Tno | CHAR(10) | 教师编号 |
表数据如下:
教师表(Teacher)
字段名 | 字段类型 | 说明 |
---|---|---|
Tno | CHAR(10) | 教师编号(主键) |
Tname | CHAR(100) | 教师名称 |
Tsex | CHAR(10) | 教师性别 |
表数据如下:
- 代码实现
import pymysql
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
if __name__ == '__main__':
# **********begin***********#
# 获取连接对象
conn = pymysql.connect(host = 'localhost',port = 3306,
user = 'root',passwd = '123123',
db='nudt',charset='utf8')
# 获取光标
cs = conn.cursor()
# 执行SQL,统计教师的课程数量并按照教师名称倒序
sql = "select Tname,count(Cno) \
from Teacher left outer join Course \
on Teacher.Tno = Course.Tno \
group by Tname \
order by Tname desc"
cs.execute(sql)
# 获取结果集,将其赋予给变量 results
results = cs.fetchall()
# 遍历结果集,按照格式 --> 教师:课程数量 ,输出到控制台
for result in results:
print("%s : %d" % (result[0],result[1]))
# 绘制柱状图
names, courseNum = zip(*results)
plt.xticks(fontsize=16)
plt.yticks([]) # 不显示y轴刻度
for i in range(len(courseNum)):
plt.text(i, courseNum[i] * 0.5, courseNum[i], ha='center', fontsize=20)
plt.bar(range(len(courseNum)), courseNum, color='y', tick_label=names)
plt.savefig("step4_img/1.png")
# 关闭资源
cs.close()
conn.close()
# **********end**********#
第五关 信息管理系统
- 编程要求
1.补全 addCourse(cs)
函数,完成添加课程信息功能。
2.补全 updateCourse(cs)
函数,完成修改课程信息功能。
3.补全 findCourseByCno(cs)
函数,完成查询课程信息功能。
4.补全 deleteCourse(cs)
函数,完成删除课程信息功能。
5.补全 findCourseByTeacherName(cs)
函数,完成通过教师名称查询课程名称功能。
6.补全 selectTeacherByCname(cs)
函数,完成通过课程名称查询教师名称功能。
课程表(Course)
字段名 | 字段类型 | 说明 |
---|---|---|
Cno | CHAR(10) | 课程编号(主键) |
Cname | CHAR(100) | 课程名称 |
Tno | CHAR(10) | 教师编号 |
表数据如下:
教师表(Teacher)
字段名 | 字段类型 | 说明 |
---|---|---|
Tno | CHAR(10) | 教师编号(主键) |
Tname | CHAR(100) | 教师名称 |
Tsex | CHAR(10) | 教师性别 |
表数据如下:
- 代码实现
import pymysql
# 添加课程信息,输入课程信息格式为:Cno,Cname,Tno
def addCourse(cs):
courseInfo = input()
# **********begin********** #
course = courseInfo.strip().split(",")
sql="INSERT INTO Course(Cno,Cname,Tno) values(%s,%s,%s)"
Cno = course[0]
Cname = course[1]
Tno = course[2]
cs.execute(sql,[Cno,Cname,Tno])
# **********end********** #
# 修改课程信息(通过课程编号修改课程名称),输入新课程信息格式为:Cno,Cname
def updateCourse(cs):
courseInfo = input()
# **********begin********** #
course = courseInfo.strip().split(",")
sql="UPDATE Course SET Cname=%s WHERE Cno=%s"
Cno = course[0]
Cname = course[1]
cs.execute(sql,[Cname,Cno])
# **********end********** #
# 查询课程信息(通过课程编号查询课程信息),输入课程编号 Cno
# 将课程信息打印到控制台
def findCourseByCno(cs):
courseId = input()
# **********begin********** #
course = courseId.strip()
sql="SELECT* FROM Course WHERE Cno=%s"
cs.execute(sql,course)
print(cs.fetchall())
# **********end********** #
# 删除课程信息(通过课程编号删除课程信息),输入课程编号 Cno
def deleteCourse(cs):
courseId = input()
# **********begin********** #
course = courseId.strip()
sql="DELETE FROM Course WHERE Cno=%s"
cs.execute(sql,course)
# **********end********** #
# 通过教师名称查询课程名称并将其打印到控制台,输入教师名称 Tname
# 打印格式为:课程名 (一个课程名一行,不含其它字符)
def findCourseByTeacherName(cs):
tname = input()
# **********begin********** #
tname = tname.strip()
sql="""SELECT Cname FROM Teacher,Course
WHERE Teacher.Tno=Course.Tno
AND Tname = %s"""
cs.execute(sql,tname)
for name in cs.fetchall():
print(name[0])
# **********end********** #
# 通过课程名称查询教师名称并将其打印到控制台,输出课程名称 Cname
# 打印格式为:教师名 (一个教师名一行,不含其它字符)
def selectTeacherByCname(cs):
cname = input()
# **********begin********** #
cname = cname.strip()
sql="""SELECT Tname FROM Course,Teacher
WHERE Course.Tno = Teacher.Tno
AND Cname = %s"""
cs.execute(sql,cname)
for name in cs.fetchall():
print(name[0])
# **********end********** #
def Test(cs):
sql = "select * from Course"
cs.execute(sql)
courseInfo = cs.fetchall()
print(courseInfo)
if __name__ == '__main__':
conn = pymysql.connect(host='localhost', port=3306,
user='root', passwd='123123', db="nudt", charset='utf8')
command = input()
cs = conn.cursor()
if command == '01':
addCourse(cs)
elif command == '02':
updateCourse(cs)
elif command == '03':
findCourseByCno(cs)
elif command == '04':
deleteCourse(cs)
elif command == '05':
findCourseByTeacherName(cs)
elif command == '06':
selectTeacherByCname(cs)
conn.commit()
Test(cs)
cs.close()
conn.close()