一、MySQL数据库的安装
参考博客 https://blog.csdn.net/weixin_44051608/article/details/85163823
二、MySQL 的基本操作
- 启动MySQL
service mariadb start
- 进入MySQL
mysql -u root -p
- 常用快捷命令
help ? //帮助
status \s //显示MySQL状态信息
quit //或者exit,退出mysql
- mysql常用数据类型
整数类型:int 、bigint
浮点数类型:float、double
日期类型: 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 -> 特殊二进制
- 对数据库操作
查看数据库:show databases;
新建数据库:create database test01;
删除数据库:drop database test01;
进入数据库:create database test01;
use test01;
- 表的操作
进入数据库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;
- 数据库操作:增删改查
增
插入一条数据: 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)between 值1 and 值2;
空值查询: 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 过滤条件;
- 约束与索引
l 主键约束primary key
字段名 数据类型 primary key
create table example01(
id int primary key,
name varchar(32)
);
注:主键约束字段不能重复值并且不为null。
2 非空约束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数据库的学生管理系统
- 下载python与mysql的交互模块,pymysql
pip install pymysql
- 代码实现
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("请输入正确的数值!")