基于MySQL数据库的学生管理系统(python)

一、MySQL数据库的安装

参考博客 https://blog.csdn.net/weixin_44051608/article/details/85163823

二、MySQL 的基本操作

  1. 启动MySQL
service mariadb start
  1. 进入MySQL
mysql -u root -p
  1. 常用快捷命令
help ?   //帮助
status \s  //显示MySQL状态信息
quit    //或者exit,退出mysql
  1. mysql常用数据类型
整数类型:intbigint

浮点数类型:floatdouble

日期类型: date -> YYYY-MM-DD HH:II:SS

		%Y:代表 4 位的年份
		
        %y:代表 2 位的年份
        
        %m:代表月, 格式为(01……12) 
        
        %c:代表月, 格式为(1……12)
        
        %H:代表小时,格式为(00……23) 
        
        %h: 代表小时,格式为(01……12) 
        
        %i: 代表分钟, 格式为(00……59)
        
        %r:代表 时间,格式为 12 小时(hh:mm:ss [AP]M) 
        
        %T:代表 时间,格式为 24 小时(hh:mm:ss)
        
        %S:代表 秒,格式为(00……59) 
        
        %s:代表 秒,格式为(00……59)
        
        常用函数:date_format->将日期转化为字符串
        
                 date_format(now(),'%Y-%m-%d %H:%i:%s')
                 
        		 str_to_date->将字符串转化为日期
        		 
        		 str_to_date('04-05-1919',%m-%d-%Y)
        		 
        		 now->获取当前系统日期
        	
        		 
字符串:
		char     ->  不可变长
		
		varchar  ->  可变长
		
		binary   ->  二进制数据
		
		text     ->  大文本数据(文章,内容,评论等)
		
		longtext ->  大文本数据
		
		blob     ->  特殊二进制(图片、PDF文档等)
		
		longblob ->  特殊二进制
  1. 对数据库操作
查看数据库:show databases;

新建数据库:create database test01;

删除数据库:drop database test01;

进入数据库:create database test01;
		   use test01;
  1. 表的操作
进入数据库test01:use test01;

新建表student:  create table student(
    					 id int(11),
     					 name varchar(20),
    					 sex varchar(4)
     					 yuwen float,
     					 shuxue float,
     					 yingyu float,
     					 python float,
     					 total float 
                       )
                       
                       
删除表:       drop table 表名;

显示表:       show tables;

查看表信息:    desc student;
  1. 数据库操作:增删改查

插入一条数据: insert into student(id,name,sex,yuwen,shuxue,yingyu,python,total) values
			  (1001,'zhangsan','nan',81,67,76,90,314);
			  
插入多条数据:  insert into student(id,name,sex,yuwen,shuxue,yingyu,python,total) values
			  (1001,'zhangsan','nan',81,67,76,90,314)
			  (1002,'lisi','nan',79,82,66,88,315);

删除数据:        delete from student(表名) where id = 1001;

清除表中所有数据: truncate table 表名;

update student set name = 'zhaoliu' where id = 1001;

查询所有字段:    	  select * from student;

查询指定字段:    	  select 字段名1,字段名2...  from student;

条件查询:             select * from student where id = 1001;

多条件查询:           select * from student where 条件表达式1 and(or) 条件表达式2;

between and关键字查询:select * from student where 字段名 (not)between1 and2;

空值查询:             select * from student where 字段名 is (not)null;

查询结果排序:          select * from student order by 字段名;(升序:asc 降序:desc)

限制查询结果数量: 	  select * from student limit 数量;

聚合函数查询: 	      select count(id) from student;   计数
               	      select sum(字段名) from student; 求和
               	      select avg(字段名) from student; 求平均值
               	      select max(字段名) from student; 求最大值
               	      select min(字段名) from student; 求最小值    
               	      注:使用聚合函数要先分组; 
               	      
分组语句:             select * from student group by 字段名 having 过滤条件;   
  1. 约束与索引
l 主键约束primary key

字段名 数据类型 primary key

create table example01(

id int primary key,
name varchar(32)

);

注:主键约束字段不能重复值并且不为null2 非空约束not null

字段名 数据类型 not null

create table example02(

id int primary key,
name varchar(32) not null

);

 

3 唯一性约束unique

字段名 数据类型 unique

create table example03(

id int primary key,
stu_id int unique,
name varchar(32) not null

);

 

4  默认约束default

字段名 数据类型 default 默认值

create table example04(

id int primary key,
stu_id int unique,
name varchar(32) not null,
chengji float default 0

);

 

5  设置字段值自动增加

字段名 数据类型 auto_increment

create table example05(

id int primary key auto_increment,
stu_id int unique,
name varchar(32) not null,
chengji float default 0

);

 

6 创建索引

create table example06
(

id int primary key auto_increment,
name varchar(32) ,
ndex(name)

);

 

7  删除索引

alter table 表名 drop index 索引名;

三、通过python实现基于MySQL数据库的学生管理系统

  1. 下载python与mysql的交互模块,pymysql

pip install pymysql

  1. 代码实现
import pymysql
# 存储学生信息字典,学生信息用字典存,再用列表存储字典,大部分操作将采用字典列表,然后再装入数据库
name_list = []


# 菜单
def display_menu():
    print("-" * 30)
    print("          学生管理系统    " )
    print("         1.添加学生信息   " )
    print("         2.删除学生信息   " )
    print("         3.修改学生信息   " )
    print("         4.查询单个学生信息" )
    print("         5.查询所有学生信息" )
    print("         6.以学生总分成绩排序")
    print("         7.退出系统")
    print("-" * 30)


# 初始化
# 连接数据库 localhost->当前电脑,db->数据库,password->数据库密码,port->数据库在电脑所在端口号
def get_connection():
    connection = pymysql.connect(host="localhost", user="root", password="123456", db="test01", port=3306, charset="utf8")
    return connection
# 初始化函数 -- 数据库查询数据(数据库原有的数据),返回一个字典列表
def query():
    connection = get_connection()
    # 获取游标 对数据库进行操作 并且将返回值设置为字典类型
    cur = connection.cursor(cursor=pymysql.cursors.DictCursor)
    # 写sql语句
    sql = "select * from stu"
    try:
        cur.execute(sql)
        students = cur.fetchall()
        """
            此处判断很重要,如果数据库中没有记录,则会结果是一个空的元组类型,
            如果有记录,则结果是list类型,所以可以根据类型来判断数据库是否为空,
            如果不是就返回一个空列表。
        """
        if type(students) == list:
            return students
        else:
            return []
    except Exception as e:
        raise e
    finally:
        connection.close()  # 关闭连接
# 初始化函数 -- 将返回的字典列表赋值给name_list
def name_init():
    try:
        global name_list
        name_list = query()
        print("成功获取数据库中数据!")
    except Exception as e:
        raise e



# 检查
# 检查性别是否合法
def check_sex(new_sex):
    flag = True
    while flag:
        if new_sex == '男' or new_sex == '女':
            flag = False
        else:
            new_sex = input("输入性别有误,请重新输入(男/女):")
    return new_sex
# 检查学号是否重复或者有误
def check_id(new_id):
    flag = True
    while flag:
        # 先检查是不是纯数字再去考虑是否重复的事情,如果不是纯数字直接pass
        if new_id.isdigit():
            for i in range(len(name_list)):
                if name_list[i]['id'] == int(new_id):
                    new_id = check_id(input("您输入的学号重复,请重新输入:"))
            flag = False
        else:
            new_id = input("您输入的学号有误,请重新输入:")
    return new_id
# 检查输入成绩是否合法
def check_grade(new_grade):
    float = True
    while float:
        if new_grade > 0 and new_grade < 100:
            float = False
        else:
            new_grade = int(input("请你重新输入成绩(0-100):"))

    return  new_grade

# 添加
# 添加学生信息
def add_name():
    new_info = {}
    new_id = check_id(input("请输入学号:"))
    new_info['id'] = new_id
    new_name = (input("请输入姓名:"))
    new_info['name'] = new_name
    new_sex = check_sex(input("请输入性别(男/女):"))
    new_info['sex'] = new_sex
    new_yuwen = check_grade(int(input("请输入语文成绩:")))
    new_info['yuwen'] = new_yuwen
    new_shuxue = check_grade(int((input("请输入数学成绩:"))))
    new_info['shuxue'] = new_shuxue
    new_yingyu = check_grade((int(input("请输入英语成绩:"))))
    new_info['yingyu'] = new_yingyu
    new_python = check_grade((int(input("请输入Python成绩:"))))
    new_info['python'] = new_python
    new_total = 0
    new_info['total'] = new_total
    name_list.append(new_info)
    new_info['total'] = int(new_yuwen) + int(new_shuxue) + int(new_yingyu) + int(new_python)
    # 将新学生信息添加到字典列表中
    name_list.append(new_info)
    # 将新学生信息添加到数据库中
    stu_insert(new_info)
    print("添加成功!")
# 添加学生信息 -- 将新学生信息写入数据库中
def stu_insert(stu):
    connection = get_connection()
    # 获取游标 对数据库进行操作 并且将返回值设置为字典类型
    cur = connection.cursor(cursor=pymysql.cursors.DictCursor)
    # 写sql语句
    sql = "insert into stu(id,name,sex,yuwen,shuxue,yingyu,python,total) values('%s','%s','%s','%s','%s','%s','%s','%s')"

    try:
        cur.execute(sql % (stu['id'], stu['name'],stu['sex'], stu['yuwen'], stu['shuxue'], stu['yingyu'],stu['python'],stu['total']))
        connection.commit()
    except Exception as e:
        # 错误回滚
        connection.rollback()
        raise e
    finally:
        connection.close()  # 关闭连接



# 查询
# 查询单个学生信息 --利用字典列表查询
def find_name():
    find_id_is = int(input("请输入要查询的学生学号:"))
    flag = False
    index = 0
    for i in range(len(name_list)):
        if name_list[i]['id'] == find_id_is:
            flag = True
            index = i
            break
    if flag:
        print("学生查询到,学生信息为:")
        print(name_list[index]['id'], name_list[index]['name'], name_list[index]['sex'], name_list[index]['yuwen'], name_list[index]['shuxue'], name_list[index]['yingyu'], name_list[index]['python'])
    else:
        print("学生未找到!")
# 查询所有学生信息 --利用字典列表查询
def find_all():
    print("=" * 30)
    global name_list
    name_list = query()
    print("学号     姓名     性别     语文     数学     英语     python     总分")
    for name in name_list:
        print("%s     %s      %s      %s    %s    %s     %s     %s" % (name['id'], name['name'], name['sex'], name['yuwen'], name['shuxue'], name['yingyu'], name['python'], name['total']))
    print("=" * 30)



# 删除
# 删除学生信息
def del_name():
    del_id_is = int(input("请输入要删除的学生学号:"))
    flag = False
    index = 0
    for i in range(len(name_list)):
        if name_list[i]['id'] == del_id_is:
            flag = True
            index = i
            break
    if flag:
        # 在字典列表中将其移除
        name_list.pop(index)
        # 在数据库中将其移除
        stu_delete(del_id_is)
        print("删除成功!")
    else:
        print("学生未找到!请检查学号输入是否有误!")
# 删除学生信息 -- 在数据库中将其移除
def stu_delete(sid):
    connection = get_connection()
    cur = connection.cursor()
    sql = "delete from stu where id = '%s'"
    try:
        cur.execute(sql % sid)
        connection.commit()
    except Exception as e:
        # 错误回滚
        connection.rollback()
        raise e
    finally:
        connection.close()  # 关闭连接



# 修改
# 修改学生信息
def re_name():
    id_is = int(input("请输入要修改的学生学号:"))
    flag = False
    index = 0
    # 先找到要修改的学生的下标
    for i in range(len(name_list)):
        if name_list[i]['id'] == id_is:
            flag = True
            index = i
            break
    if flag:
        choice_of_name(index,id_is)
        print("修改成功!")
    else:
        print("修改失败,学生信息未找到!")
# 学生信息修改细节函数
def choice_of_name(index,op):
    while True:
        choice = input("请输入要修改学生的(1.学号 2.姓名 3.性别 4.语文成绩 5.数学成绩 6.英语成绩 7.Python成绩 8.全部修改):")
        if choice == '8':
            """
                先修改本地的数据,再对数据库中的数据做修改
            """
            new_id = check_id(input("请输入新的学号:"))
            name_list[index]['id'] = new_id
            new_name = input("请输入新的姓名:")
            name_list[index]['name'] = new_name
            new_sex = check_sex(input("请输入性别(男/女):"))
            name_list[index]['sex'] = new_sex
            new_yuwen = check_grade(int((input("请输入新的语文成绩:"))))
            name_list[index]['yuwen'] = new_yuwen
            new_shuxue = check_grade(int((input("请输入新的数学成绩:"))))
            name_list[index]['shuxue'] = new_shuxue
            new_yingyu = check_grade(int((input("请输入新的英语成绩:"))))
            name_list[index]['yingyu'] = new_yingyu
            new_python = check_grade(int((input("请输入新的python成绩:"))))
            name_list[index]['python'] = new_python
            stu_modify(name_list[index],op)
            break
        elif choice == '1':
            new_id = check_id(input("请输入新的学号:"))
            name_list[index]['id'] = new_id
            stu_modify(name_list[index],op)
            break
        elif choice == '2':
            new_name = input("请输入新的姓名:")
            name_list[index]['name'] = new_name
            stu_modify(name_list[index], op)
            break
        elif choice == '3':
            new_sex = check_sex(input("请输入性别(男/女):"))
            name_list[index]['sex'] = new_sex
            stu_modify(name_list[index],op)
            break
        elif choice == '4':
            new_yuwen = check_grade(int((input("请输入新的语文成绩:"))))
            name_list[index]['yuwen'] = new_yuwen
            stu_modify(name_list[index], op)
            break
        elif choice == '5':
            new_shuxue = check_grade(int((input("请输入新的数学成绩:"))))
            name_list[index]['shuxue'] = new_shuxue
            stu_modify(name_list[index],op)
            break
        elif choice == '6':
            new_yingyu = check_grade(int((input("请输入新的英语成绩:"))))
            name_list[index]['yingyu'] = new_yingyu
            stu_modify(name_list[index], op)
            break
        elif choice == '7':
            new_python = check_grade(int((input("请输入新的python成绩:"))))
            name_list[index]['python'] = new_python
            stu_modify(name_list[index],op)
            break
        else:
            print("输入有误,请重新输入!")
# 修改学生信息 -- 修改数据库中的学生成绩
def stu_modify(stu,op):
    connection = get_connection()
    cur = connection.cursor()
    sid = stu['id']
    name = stu['name']
    sex = stu['sex']
    yuwen = stu['yuwen']
    shuxue = stu['shuxue']
    yingyu = stu['yingyu']
    python = stu['python']
    total = int(yuwen)+int(shuxue)+int(yingyu)+int(python)
    sql = "update stu set id = '%s',name='%s',sex='%s',yuwen='%s',shuxue='%s',yingyu='%s',python='%s',total = '%s'where id='%s'"

    try:

        cur.execute(sql %(sid,name, sex, yuwen, shuxue, yingyu, python,total,op))
        connection.commit()
    except Exception as e:
        # 错误回滚
        connection.rollback()
        raise e
    finally:
        connection.close()  # 关闭连接


# 排序
def rank():
    connection = get_connection()

    #采用冒泡排序算法
    for j in range(0,len(name_list)-1):
        for i in range(0,len(name_list)-1-j):
            if name_list[i]['total'] < name_list[i+1]['total']:
                name_list[i],name_list[i+1] = name_list[i+1],name_list[i]
    try:
        for i in range(0,len(name_list)):
            stu_delete(name_list[i]['id'])
        for i in range(0,len(name_list)):
            stu_insert(name_list[i])
        print("排序成功!")

    except Exception as e:
        connection.rollback()
        raise e
    finally:
        connection.close()  # 关闭连接


if __name__ == "__main__":
    name_init()
    exit_name = True
    while exit_name:
        display_menu()
        key = input("请输入选择的序号:")
        if key == '1':
            add_name()
        elif key == '2':
            del_name()
        elif key == '3':
            re_name()
        elif key == '4':
            find_name()
        elif key == '5':
            find_all()
        elif key == '6':
            rank()
        elif key == '7':
            exit_name = False

        else:
            print("请输入正确的数值!")

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值