1.10数据库编程练习

第一关 数据库表创建 

  • 编程要求

        在名为 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 并遍历结果集,按照格式 --> 教师:课程数量 ,输出到控制台。

连接参数如下:

  1. host='localhost', port=3306,
  2. user='root', passwd='123123',
  3. charset='utf8', db="nudt"

课程表(Course)

字段名 字段类型 说明
Cno CHAR(10) 课程编号(主键
Cname CHAR(100) 课程名称
Tno CHAR(10) 教师编号

表数据如下:

1.10数据库编程练习

教师表(Teacher)

字段名 字段类型 说明
Tno CHAR(10) 教师编号(主键
Tname CHAR(100) 教师名称
Tsex CHAR(10) 教师性别

表数据如下:

1.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) 教师编号

表数据如下:

1.10数据库编程练习

教师表(Teacher)

字段名 字段类型 说明
Tno CHAR(10) 教师编号(主键
Tname CHAR(100) 教师名称
Tsex CHAR(10) 教师性别

表数据如下:

1.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()

上一篇:Android opengrok


下一篇:数据库系统概论实验四——管理SQL sever数据表的数据