【sql+python】数据库与程序实践——某自来水公司收费系统
题目
某自来水公司收费管理系统
要求
实现客户信息、用水类型(类别号、类别名、水价)及业务员管理;
实现客户用水信息管理(客户号、月份、用水类别号、用水量);
实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为‘未收’;
实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);
创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;
创建存储过程统计指定月份应收费用和实收费用;
创建存储过程查询指定月份未交费的用户信息,以便催费;
建立表间关系。
工具
SQL Server 2008 R2(中文版);
PyCharm 2021.3.2 (社区版)。
数据库建立
新建数据库Tap water charge。
新建查询:
注意:运行代码时,要一段代码一段代码的运行(已分好代码段),不能全部代码一起运行。
/* 客户信息表 */
CREATE TABLE 客户信息( 客户号 varchar(10),客户名 nchar(10),结余金额 float NOT NULL,PRIMARY KEY(客户号)
)/* 业务员信息表 */
CREATE TABLE 业务员信息( 业务员号 varchar(10),业务员名 nchar(10),PRIMARY KEY(业务员号)
)/* 用水类型表 */
CREATE TABLE 用水类型( 类别号 varchar(10),类别名 nchar(10),单位水价 float NOT NULL,PRIMARY KEY(类别号),
)/* 用水信息管理表 */
CREATE TABLE 用水信息管理( 客户号 varchar(10) references 客户信息(客户号),月份 nchar(20),用水类别号 varchar(10) references 用水类型(类别号),用水量 float,PRIMARY KEY (客户号,月份)
)/* 收费登记表 */
CREATE TABLE 收费登记( 客户号 varchar(10) references 客户信息(客户号),月份 nchar(20),应收费用 float DEFAULT 0,实收费用 float DEFAULT 0,业务员 varchar(10) references 业务员信息(业务员号),PRIMARY KEY(客户号,月份)
)/* 费用管理表 */
CREATE TABLE 费用管理( 客户号 varchar(10) references 客户信息(客户号),月份 nchar(20),费用 float ,收费标志 nchar(10) default ('未收费'),PRIMARY KEY(客户号,月份),CHECK (收费标志='已收费' or 收费标志='未收费')
)/* 订单管理表 */
CREATE TABLE 订单管理
(订单号 varchar(20),客户号 varchar(10) references 客户信息(客户号),月份 nchar(20),收取费用 float,业务员号 varchar(10) references 业务员信息(业务员号),PRIMARY KEY(订单号)
)CREATE TRIGGER 用水消费记录_插入
ON 用水信息管理
AFTER INSERT
AS
DECLARE @客户号 varchar(10)
DECLARE @用水类别 varchar(10)
DECLARE @单位水价 float
DECLARE @用水量 float
DECLARE @水价 float
DECLARE @月份 nchar(20)
SELECT @用水量=用水量,@月份=月份,@客户号=客户号
FROM INSERTED
SELECT @单位水价=单位水价,@用水类别=类别号
FROM 用水类型
BEGININSERT INTO 收费登记(客户号,月份,应收费用) VALUES((select @客户号 from inserted),(select @月份 from inserted),(@用水量*@单位水价))
ENDCREATE TRIGGER 用水消费记录_更改
ON 用水信息管理
AFTER UPDATE
AS
DECLARE @客户号 varchar(10)
DECLARE @用水类别 varchar(10)
DECLARE @单位水价 float
DECLARE @用水量 float
DECLARE @水价 float
DECLARE @月份 nchar(20)
SELECT @用水量=用水量,@月份=月份,@客户号=客户号
FROM INSERTED
SELECT @单位水价=单位水价,@用水类别=类别号
FROM 用水类型
BEGINUPDATE 收费登记 SET 应收费用=@用水量*@单位水价 WHERE @客户号=收费登记.客户号 AND @月份=收费登记.月份
ENDCREATE TRIGGER 订单信息管理
ON 订单管理
AFTER INSERT
AS
DECLARE @客户号 varchar(10)
DECLARE @月份 nchar(20)
DECLARE @实收费用 float
DECLARE @收取费用 float
DECLARE @业务员号 varchar(10)
SELECT @客户号=客户号,@月份=月份,@收取费用=收取费用,@业务员号=业务员号
FROM INSERTED
SELECT @实收费用=实收费用 FROM 收费登记 where 客户号=@客户号 AND 月份=@月份
BEGINIF (SELECT 收费标志 FROM 费用管理 WHERE 客户号=@客户号 AND 月份=@月份)='已收费'ROLLBACKELSEUPDATE 收费登记 SET 业务员=@业务员号,@实收费用=@实收费用+@收取费用,实收费用=@实收费用 where @客户号=收费登记.客户号 and @月份=收费登记.月份 print(@实收费用)
END/* 规则 */
CREATE RULE 月份
AS
@月份 like'%年%月'/* 客户费用管理统计存储过程 */
CREATE PROCEDURE 客户费用管理统计
@月份 nchar(20)
AS
SELECT 收费登记.客户号,收费登记.应收费用,收费登记.实收费用,费用管理.收费标志
FROM 收费登记,费用管理
WHERE 收费登记.月份=@月份 AND 收费登记.客户号=费用管理.客户号 AND 费用管理.月份=@月份/* 客户欠费统计存储过程 */
CREATE PROCEDURE 客户欠费统计
@月份 nchar(20)
AS
SELECT 费用管理.客户号,客户信息.客户名,(应收费用实收费用) 拖欠费用
FROM 费用管理,客户信息,收费登记
WHERE 客户信息.客户号=费用管理.客户号 AND 费用管理.客户号=收费登记.客户号 AND 收费登记.月份=费用管理.月份 AND 费用管理.月份=@月份
创建用户:
第一步,点击新建登录名;
第二步,设定登录名和密码;
第三步,勾选所有的权限,并勾选自来水公司收费管理系统的数据库。
PyCharm连接数据库
首先,在PyCharm中引入pymssql库,作用是可以使用SQL语句。
方法:点击工具栏左上角File,点击Settings,点击Project,点击Python Interpreter,点击左上角加号,搜索pymssql然后安装。
之后,连接数据库:
import pymssqlconnect = pymssql.connect('(local)', 'MQiyirs', '123456', 'Tap water charge') # 建立连接
if connect:print("连接自来水公司收费管理系统成功!")# 代码内容
connect.close()
这里的(local)是服务器名称, MQiyirs是登录名, 123456是密码, Tap water charge是数据库名称。
下面是完整python代码(中文乱码已解决):
import pymssqlconnect = pymssql.connect('(local)', 'MQiyirs', '123456', 'Tap water charge') # 建立连接
if connect:print("连接华北自来水公司收费管理系统成功!")print("选择您要办的业务编号:1.客户信息管理 2.用水类型管理 3.业务员信息管理 4.用水登记 5.订单登记 6.未缴费信息")key = int(input())if key == 1:print("选择您要办的业务编号:1.增加信息 2.删除信息 3.更改信息 4.查询信息")key1 = int(input())if key1 == 1:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行sql = 'insert into 客户信息(客户号,客户名,结余金额) values(%s,%s,%s)'print("客户号:")a = input()print("客户名:")b = input()print("结余金额:")c = input()cursor.execute(sql, (a, b, c))connect.commit()cursor.close()elif key1 == 2:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("客户号:")a = input()rows = cursor.execute('delete from 户信息 where 客户号=%s ', a)connect.commit() # 确认cursor.close()elif key1 == 3:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("客户号:")a = input()print("结余金额:")b = input()rows = cursor.execute('update 客户信息 set 结余金额=%s where 客户号=%s' % (b, a))connect.commit()cursor.close()elif key1 == 4:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行cursor.execute("select 客户号, 客户名, 结余金额 from 客户信息") # 执行sql语句row = cursor.fetchone() # 读取查询结果while row: # 循环读取所有结果print("客户号:%s,客户名:%s,结余金额:%s" % (row[0], row[1], row[2])) # 输出结果row = cursor.fetchone()cursor.close()else:print("未知错误!")elif key == 2:print("选择您要办的业务编号:1.增加信息 2.删除信息 3.更改信息 4.查询信息")key2 = int(input())if key2 == 1:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行sql = 'insert into 用水类型(类别号,类别名,单位水价) values(%s,%s,%s)'print("类别号:")a = input()print("类别名:")b = input()print("单位水价:")c = input()cursor.execute(sql, (a, b, c))connect.commit()cursor.close()elif key2 == 2:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("类别号:")a = input()rows = cursor.execute('delete from 用水类型 where 类别号=%s', a)connect.commit() # 确认cursor.close()elif key2 == 3:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("类别号:")a = input()print("单位水价:")b = input()rows = cursor.execute('update 用水类型 set 单位水价=%s where 类别号=%s' % (b, a))connect.commit()cursor.close()elif key2 == 4:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行cursor.execute("select 类别号, 类别名, 单位水价 from 用水类型") # 执行sql语句row = cursor.fetchone() # 读取查询结果while row: # 循环读取所有结果print("类别号:%s,类别名:%s,水价:%s" % (row[0], row[1], row[2])) # 输出结果row = cursor.fetchone()cursor.close()else:print("未知错误!")elif key == 3:print("选择您要办的业务编号:1.增加信息 2.删除信息 3.查询信息")key3 = int(input())if key3 == 1:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行sql = 'insert into 业务员信息(业务员号,业务员名) values(%s,%s)'print("业务员号:")a = input()print("业务员名:")b = input()cursor.execute(sql, (a, b))connect.commit()cursor.close()elif key3 == 2:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("业务员号:")a = input()rows = cursor.execute('delete from 业务员信息 where 业务员号=%s', a)connect.commit() # 确认cursor.close()elif key3 == 3:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行cursor.execute("select 业务员号, 业务员名 from 业务员信息") # 执行sql语句row = cursor.fetchone() # 读取查询结果while row: # 循环读取所有结果print("业务员号:%s,业务员名:%s" % (row[0], row[1])) # 输出结果row = cursor.fetchone()cursor.close()else:print("未知错误!")elif key == 4:print("选择您要办的业务编号:1.增加信息 2.查询信息 3.删除信息")key4 = int(input())if key4 == 1:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行sql = 'insert into 用水信息管理(客户号,月份,用水类别号,用水量) values(%s,%s,%s,%s)'print("客户号:")a = input()print("月份:")b = input()print("用水类别号:")c = input()print("用水量:")d = input()cursor.execute(sql, (a, b, c, d))connect.commit()cursor.close()elif key4 == 2:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行cursor.execute("select 客户号, 月份, 用水类别号, 用水量 from 用水信息管理") # 执行sql语句row = cursor.fetchone() # 读取查询结果while row: # 循环读取所有结果print("客户号:%s,月份:%s,用水类别号:%s,用水量:%s" % (row[0], row[1], row[2], row[3])) # 输出结果row = cursor.fetchone()cursor.close()elif key4 == 3:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("客户号:")a = input()print("月份:")b = input()rows = cursor.execute('delete from 用水信息管理 where 客户号=%s and 月份=%s', (a, b))connect.commit() # 确认cursor.close()else:print("未知错误!")elif key == 5:print("选择您要办的业务编号:1.增加信息 2.查询信息 3.删除信息")key5 = int(input())if key5 == 1:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行sql = 'insert into 订单管理(订单号,客户号,月份,收取费用,业务员号) values(%s,%s,%s,%s,%s)'print("订单号:")a = input()print("客户号:")b = input()print("月份:")c = input()print("收取费用:")d = input()print("业务员号:")e = input()cursor.execute(sql, (a, b, c, d, e))connect.commit()cursor.close()elif key5 == 2:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行cursor.execute("select 订单号,客户号,月份,收取费用,业务员号 from 订单管理") # 执行sql语句row = cursor.fetchone() # 读取查询结果while row: # 循环读取所有结果print("订单号:%s,客户号:%s,月份:%s,收取费用:%s,业务员号:%s" % (row[0], row[1], row[2], row[3], row[4])) # 输出结果row = cursor.fetchone()cursor.close()elif key5 == 3:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("订单号:")a = input()rows = cursor.execute('delete from 订单管理 where 订单号:=%s', a)connect.commit() # 确认cursor.close()else:print("未知错误!")elif key == 6:print("选择您要办的业务编号:1.查询信息 2.删除信息")key6 = int(input())if key6 == 1:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行cursor.execute("select 客户号,月份,费用,收费标志 from 费用管理 where 收费标志='未收费'") # 执行sql语句row = cursor.fetchone() # 读取查询结果while row: # 循环读取所有结果print("客户号:%s,月份:%s,费用:%s,收费标志:%s" % (row[0], row[1], row[2], row[3])) # 输出结果row = cursor.fetchone()cursor.close()elif key6 == 2:cursor = connect.cursor() # 创建一个游标对象python里的sql语句都要通过cursor来执行print("客户号:")a = input()print("月份:")b = input()rows = cursor.execute('delete from 用水信息管理 where 客户号=%s and 月份=%s', (a, b))connect.commit() # 确认cursor.close()else:print("未知错误!")else:print("未知错误!")connect.close()
【sql+python】数据库与程序实践——某自来水公司收费系统相关推荐
- python小程序源代码-Python数据库小程序源代码
源代码: # dict1 是 字典 , 用来对应相应元素的下标,我们将文件转成列表,对应的也就是文件的下标,通过下标来找文件元素 dict1 = {'sort':0 , 'name':1 ,'age' ...
- 自来水公司收费管理系统升级
实际上,在我接手这个系统的时候,我就觉得公司是完全为了赚取客户的钱而故意将弄的很复杂. 对于一个小县城的收费系统,数据库完全可以采用较为好管理的SQLServer,但公司却采用了Oracle, ...
- B站黑马程序员Oracle学习——项目案例:送水公司收费系统
目录 一.项目介绍和需求分析 1. 项目背景: 2. 需求分析: 二.表结构设计 三.创建表空间 四.创建用户 五.用户赋权 一.项目介绍和需求分析 1. 项目背景: 某自来水公司为了更好地对自 ...
- SQL Server数据库迁移最佳实践,可降低风险和停机时间
介绍 (Introduction) The main goal of many organizations, today, is reducing costs while maintaining th ...
- python 博客程序_项目1——博客系统 - Python测试和开发 - OSCHINA - 中文开源技术交流社区...
一.绪言 今天又来更新博文了,学习Java也已经有一段时间了,经过这段时间的学习,我对Java有了更深一层的理解.从刚开始的HelloWorld到了现在的小型网页项目,这中间也经历了很多.话不多说,下 ...
- python完整程序源代码_Python数据库小程序源代码
源代码: # dict1 是 字典 , 用来对应相应元素的下标,我们将文件转成列表,对应的也就是文件的下标,通过下标来找文件元素 dict1 = {'sort':0 , 'name':1 ,'age' ...
- 人人都是 DBA(V)SQL Server 数据库文件
SQL Server 数据库安装后会包含 4 个默认系统数据库:master, model, msdb, tempdb. SELECT [name],database_id,suser_sname(o ...
- 10步骤优化SQL Server 数据库性能
作者从基础的数据库索引开始全面讲述了SQL Server数据库应用程序的性能优化,包括数据库设计和数据访问代码.系列文章如下: Top 10 steps to optimize data access ...
- c++课程设计——绘本之家信息管理系统(qt图形化工具,SQL server数据库)
绘本之家管理系统 一.题目需求 开发一个"绘本之家"信息管理系统,分为三大管理模块,综合查询模块和统计分析模块. (1)绘本资料的管理 绘本信息包括:绘本编号.绘本名.作者.出版社 ...
最新文章
- cssbefore图片大小_两小时学会CSS-before after 伪元素
- Java项目:嘟嘟图片展览馆管理系统(java+Springboot+SpringMVC+JPA+Jsp+maven+mysql)
- ftp在命令行状态下下载跟上传东西
- 存储过程排版工具_我的绘图工具箱
- input自适应_深度残差网络+自适应参数化ReLU(调参记录18)Cifar10~94.28%
- Mac bower install bootstrap bug解决
- ./和bash的区别
- [转]在ROS下使用zeroconf配置多机通信
- 程序员到底会不会修电脑?
- ESP定律手工脱壳步骤
- 【设计素材】表格数据形平面海报素材
- c++byte数组和文件的相互转换_5分钟系列之Java类文件结构(三、字节码指令简介)...
- ISO18000-6C超高频RFID蓝牙写卡器HX9816UBT上位机命令数据块
- php懂erp是什么意思,ERP是个什么鬼,这里的讲解通俗易懂
- 关于大学生期末复习学习地点和学习时间的调查
- java 获取 yyyymmdd_从JS日期对象获取YYYYMMDD格式的字符串?
- 云效告诉你如何进行研发排期,高效达成目标
- 苹果平板可以用html么,哪些苹果平板可以用苹果笔
- matlab中输入数学字母,Matlab希腊字母和数学符号
- 算法和设计模式(面经)