导航:首页 > 编程语言 > python员工信息表作业

python员工信息表作业

发布时间:2023-04-15 14:18:38

python对数据库表格里面的内容增删查改怎么写

本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:
具体需求:
员工信息表程序,实现增删改查操作:
可进行模糊查询,语法支持下面3种:
select name,age from staff_data where age > 22 多个查询参数name,age 用','分割
select * from staff_data where dept = 人事
select * from staff_data where enroll_date like 2013
查到的信息,打印后,最后面还要显示查到的条数
可创建新员工纪录,以phone做唯一键,phone存在即提示,staff_id需自增,添加多个记录record1/record2中间用'/'分割
insert into staff_data values record1/record2
可删除指定员工信息纪录,输入员工id,即可删除
delete from staff_data where staff_id>=5andstaff_id<=10
可修改员工信息,语法如下:
update staff_table set dept=Market,phone=13566677787 where dept = 运维 多个set值用','分割
使用re模块,os模块,充分使用函数精简代码,熟练使用 str.split()来解析格式化字符串
由于,sql命令中的几个关键字符串有一定规律,只出现一次,并且有顺序!!!
按照key_lis = ['select', 'insert', 'delete', 'update', 'from', 'into', 'set', 'values', 'where', 'limit']的元素顺序分割sql.
分割元素作为sql_dic字典的key放进字典中.分割后的列表为b,如果len(b)>1,说明sql字符串中含有分割元素,同时b[0]对应上一个分割元素的值,b[-1]为下一次分割对象!
这样不断迭代直到把sql按出现的所有分割元素分割完毕,但注意这里每次循环都是先分割后赋值!!!当前分割元素比如'select'对应的值,需要等到下一个分割元素
比如'from'执行分割后的列表b,其中b[0]的值才会赋值给sql_dic['select'] ,所以最后一个分割元素的值,不能通过上述循环来完成,必须先处理可能是最后一个分割元素,再正常循环!!
在这sql语句中,有可能成为最后一个分割元素的 'limit' ,'values', 'where', 按优先级别,先处理'limit' ,再处理'values'或 'where'.....
处理完得到sql_dic后,就是你按不同命令执行,对数据文件的增删改查,最后返回处理结果!!
示例代码# _*_coding:utf-8_*_# Author:Jaye Heimport reimport os def sql_parse(sql, key_lis): ''' 解析sql命令字符串,按照key_lis列表里的元素分割sql得到字典形式的命令sql_dic :param sql: :param key_lis: :return: ''' sql_list = [] sql_dic = {} for i in key_lis: b = [j.strip() for j in sql.split(i)] if len(b) > 1: if len(sql.split('limit')) > 1: sql_dic['limit'] = sql.split('limit')[-1] if i == 'where' or i == 'values': sql_dic[i] = b[-1] if sql_list: sql_dic[sql_list[-1]] = b[0] sql_list.append(i) sql = b[-1] else: sql = b[0] if sql_dic.get('select'): if not sql_dic.get('from') and not sql_dic.get('where'): sql_dic['from'] = b[-1] if sql_dic.get('select'): sql_dic['select'] = sql_dic.get('select').split(',') if sql_dic.get('where'): sql_dic['where'] = where_parse(sql_dic.get('where')) return sql_dic def where_parse(where): ''' 格式化where字符串为列表where_list,用'and', 'or', 'not'分割字符串 :param where: :return: ''' casual_l = [where] logic_key = ['and', 'or', 'not'] for j in logic_key: for i in casual_l: if i not in logic_key: if len(i.split(j)) > 1: ele = i.split(j) index = casual_l.index(i) casual_l.pop(index) casual_l.insert(index, ele[0]) casual_l.insert(index+1, j) casual_l.insert(index+2, ele[1]) casual_l = [k for k in casual_l if k] where_list = three_parse(casual_l, logic_key) return where_list def three_parse(casual_l, logic_key): ''' 处理临时列表casual_l中具体的条件,'staff_id>5'-->['staff_id','>','5'] :param casual_l: :param logic_key: :return: ''' where_list = [] for i in casual_l: if i not in logic_key: b = i.split('like') if len(b) > 1: b.insert(1, 'like') where_list.append(b) else: key = ['<', '=', '>'] new_lis = [] opt = '' lis = [j for j in re.split('([=<>])', i) if j] for k in lis: if k in key: opt += k else: new_lis.append(k) new_lis.insert(1, opt) where_list.append(new_lis) else: where_list.append(i) return where_list def sql_action(sql_dic, title): ''' 把解析好的sql_dic分发给相应函数执行处理 :param sql_dic: :param title: :return: ''' key = {'select': select, 'insert': insert, 'delete': delete, 'update': update} res = [] for i in sql_dic: if i in key: res = key[i](sql_dic, title) return res def select(sql_dic, title): ''' 处理select语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r', encoding='utf-8') as fh: filter_res = where_action(fh, sql_dic.get('where'), title) limit_res = limit_action(filter_res, sql_dic.get('limit')) search_res = search_action(limit_res, sql_dic.get('select'), title) return search_res def insert(sql_dic, title): ''' 处理insert语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r+', encoding='utf-8') as f: data = f.readlines() phone_list = [i.strip().split(',')[4] for i in data] ins_count = 0 if not data: new_id = 1 else: last = data[-1] last_id = int(last.split(',')[0]) new_id = last_id+1 record = sql_dic.get('values').split('/') for i in record: if i.split(',')[3] in phone_list: print('\033[1;31m%s 手机号已存在\033[0m' % i) else: new_record = '%s,%s\n' % (str(new_id), i) f.write(new_record) new_id += 1 ins_count += 1 f.flush() return ['insert successful'], [str(ins_count)] def delete(sql_dic, title): ''' 处理delete语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r', encoding='utf-8') as r_file,\ open('staff_data_bak', 'w', encoding='utf-8') as w_file: del_count = 0 for line in r_file: dic = dict(zip(title.split(','), line.split(','))) filter_res = logic_action(dic, sql_dic.get('where')) if not filter_res: w_file.write(line) else: del_count += 1 w_file.flush() os.remove('staff_data') os.rename('staff_data_bak', 'staff_data') return ['delete successful'], [str(del_count)] def update(sql_dic, title): ''' 处理update语句命令 :param sql_dic: :param title: :return: ''' set_l = sql_dic.get('set').strip().split(',') set_list = [i.split('=') for i in set_l] update_count = 0 with open('staff_data', 'r', encoding='utf-8') as r_file,\ open('staff_data_bak', 'w', encoding='utf-8') as w_file: for line in r_file: dic = dict(zip(title.split(','), line.strip().split(','))) filter_res = logic_action(dic, sql_dic.get('where')) if filter_res: for i in set_list: k = i[0] v = i[-1] dic[k] = v line = [dic[i] for i in title.split(',')] update_count += 1 line = ','.join(line)+'\n' w_file.write(line) w_file.flush() os.remove('staff_data') os.rename('staff_data_bak', 'staff_data') return ['update successful'], [str(update_count)] def where_action(fh, where_list, title): ''' 具体处理where_list里的所有条件 :param fh: :param where_list: :param title: :return: ''' res = [] if len(where_list) != 0: for line in fh: dic = dict(zip(title.split(','), line.strip().split(','))) if dic['name'] != 'name': logic_res = logic_action(dic, where_list) if logic_res: res.append(line.strip().split(',')) else: res = [i.split(',') for i in fh.readlines()] return res pass def logic_action(dic, where_list): ''' 判断数据文件中每一条是否符合where_list条件 :param dic: :param where_list: :return: ''' logic = [] for exp in where_list: if type(exp) is list: exp_k, opt, exp_v = exp if exp[1] == '=': opt = '==' logical_char = "'%s'%s'%s'" % (dic[exp_k], opt, exp_v) if opt != 'like': exp = str(eval(logical_char)) else: if exp_v in dic[exp_k]: exp = 'True' else: exp = 'False' logic.append(exp) res = eval(' '.join(logic)) return res def limit_action(filter_res, limit_l): ''' 用列表切分处理显示符合条件的数量 :param filter_res: :param limit_l: :return: ''' if limit_l: index = int(limit_l[0]) res = filter_res[:index] else: res = filter_res return res def search_action(limit_res, select_list, title): ''' 处理需要查询并显示的title和相应数据 :param limit_res: :param select_list: :param title: :return: ''' res = [] fields_list = title.split(',') if select_list[0] == '*': res = limit_res else: fields_list = select_list for data in limit_res: dic = dict(zip(title.split(','), data)) r_l = [] for i in fields_list: r_l.append((dic[i].strip())) res.append(r_l) return fields_list, res if __name__ == '__main__': with open('staff_data', 'r', encoding='utf-8') as f: title = f.readline().strip() key_lis = ['select', 'insert', 'delete', 'update', 'from', 'into', 'set', 'values', 'where', 'limit'] while True: sql = input('请输入sql命令,退出请输入exit:').strip() sql = re.sub(' ', '', sql) if len(sql) == 0:continue if sql == 'exit':break sql_dict = sql_parse(sql, key_lis) fields_list, fields_data = sql_action(sql_dict, title) print('\033[1;33m结果如下:\033[0m') print('-'.join(fields_list)) for data in fields_data: print('-'.join(data))

总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

⑵ 企业员工信息表:员工编号 性别 姓名 出生年月 登记日期 1.编写一个存储过程实现员工信息的添加

CREATE TABLE T_YGXXB( --员工信息表
YGBH char(6) primary key, --员工编号,主键,格式:此基YYxxxx YY年2位 xxxx流水
YGXM varchar2(8), --员工姓名
YGXB char(1) CHECK (ygxb IN ('M','W')), --员工性别,男=M 女=W
CSRQ char(8)); --出生日期,格式:YYYYMMDD
1、返扒埋存储过程
create or replace procere P_insert(
v_ygbh IN varchar2,
v_ygxm IN varchar2,
v_ygxb IN varchar2,
v_csrq IN varchar2) is
begin
INSERT INTO t_ygxxb values(v_ygbh,v_ygxm,v_ygxb,v_csrq);
COMMIT;
end P_insert;
调用:BEGIN p_insert('130001','曹操','M','01550101'); END;
2、Select * from t_ygxxb where ygbh='&bh'漏蚂;
3、函数
create or replace function F_max(i in int,j in int,k IN INT) return integer is
Result integer;
begin
if i>=j then
IF i>=k THEN Result:=i;
ELSE Result:=k;
END IF;
ELSE
IF j>=k THEN Result:=j;
ELSE Result:=k;
END IF;
end if;
return(Result);
end F_max;
调用:BEGIN dbms_output.put_line(f_max(5,6,7)); END;
4、函数
create or replace function F_name(v_ygbh varchar2) return varchar2 is
v_name VARCHAR2(8);
begin
SELECT ygxm INTO v_name FROM t_ygxxb WHERE ygbh=v_ygbh;
return(v_name);
end F_name;
调用:BEGIN dbms_output.put_line(f_name('130001')); END;

⑶ 二级python程序题

1、利用random随机库里的函数,生成一个由四个大小写字母组成的验证码,显示在屏幕上
我的解答:

系统解答:

系统解析:
1.用随机数要导入random库,并记别名为r
2.先定义好要使用的陪枣英文字母表;
3.用seed(1)初始化随机函数,保证后面产生的随机数跟标准答案的一致
4.初始化密码code为一个空字符串;

系统解答:

系统解析:
题目给出了基本数据的定义,后面要使用这些变量
在for循环里面,主要问题是画笔的定位,要考虑圆心的位置是(0,0)的时候,画笔要移动到圆心位置正下方,因此坐标点是(0,-ra[i])
画笔颜色要从颜色列表里选取
画圆李携的半径也从变量里面获取

系统解答:

系统解析:
字典members里的value是个列表,所以需要用到列表的索引
对着字典members遍历,按照要求显示每个员工的工资和部门信息,另外还要取得工资和部门的名称存入字典sal_dep
为了统计工资最高的部门的工资,需要字典sal_dep来保存这两个信息
并且这个字典的key应该是工资数
用max函数对字典sal_dep的key进行求最大值的计算,并将最大值赋给变量max_val
再从字典里,取出key为max_val的value赋给变量max_name
最后按照要求显示结果

系统解答:

5、输入一个正整数(范围为65-96),请输出对应的Unicode字符。

6、获得用户输入的一个字符串,将字符串逆序输出,同时紧接着输出字符串的个数
我的解答:

我的是错的,因为reverse()是对列表进行反转,而不是字符串,所以正确解答应该是:

7、以123为随机哪乱伏数种子,随机生成10个在1(含)到999(含)之间的随机整数,每个随机数后跟随一个逗号进行分隔,屏幕输出这10个随机数。

⑷ 学习python必备的基础知识

python作为当下最热门的计算机编程语言之一,是许多互联网大厂(如阿里腾讯等)在招聘时会作出要求的能力之一。学好python对于将来大数据方向、云计算方向等物联网时代新兴岗位的学习很有帮助。

想要学习Python,需要掌握的内容还是比较多的,对于自学的同学来说会有一些难度,不推荐自学能力差的人。我们将学习的过程划分为4个阶段,每个阶段学习对应的内容,具体的学习顺序如下:

Python学习顺序:

①Python软件开发基础

想要系统学习,你可以考察对比一下开设有IT专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能,南京北大青鸟、中博软件学院、南京课工场等都是不错的选择,建议实地考察对比一下。

祝你学有所成,望采纳。

⑸ 数据库作业 有一个员工信息表(属性表) 要求每名员工对自己的信息有查询功能 怎么做啊

还要建几个表

查询所有员工
-- 查询所有女员工
---查询一个员工的工作业绩
-- 把上面的查询写成一个存储过程
---找出业绩最好的员工
-- 显示前三条业绩最好的员工信息
---显示显示 业厅祥改绩第 4==7条
---显示用户和它订房的信息
-- 如 张三 身份证 501 双人间 价格
--把用户消费做宴扮成一个视图
--找出所有没有入住的房间信息
-- 定义存储过程 输入一个身份证号查找这个人所在的房间
-- 定义存储过程 输入身份证找出这个人的所有消费
--客户编写会员扮判卡 入住次数〉5 金牌会员 3--5 银

⑹ python AttributeError: 'tuple' object has no attribute 'keys',不知道哪里错了。。

for i in results[0].keys():这行错的。

results的数据类型应该是数组

类似 [(字段值1,字段值2,。。。),((字段值1,字段值2,。。。睁毁尺)]

所以results[0] 是个元组类型,元组类型没有这个keys的属性。

原因:append会修改a本身,并且返回None。不能把返回值再赋值给a。

a=[]

b=[1,2,3,4]

a = a.append(b)

执行一次后发现a的类型变为了NoneType。

下次执行时就会出现如题所示的错误。

把a = a.append(b)改为a.append(b)后问题解决。

(6)python员工信息表作业扩展阅读:

一个数组中的所有元素具有相同的数据类型(在C、C++、Java、pascal中都这样。但也并非所有涉及数组的地方都这样,比如在Visual Foxpro中的数组就并没这样的要求)。当然,当数据类型为 Variant 时,各个元素能余歼够包含不同种类的数据(对象、字符串、悉高数值等等)。可以声明任何基本数据类型的数组,包括用户自定义类型和对象变量。

如果要用户输入的是一个数组,一般是用一个循环,但是在输入前也需要固定数组的大小。

⑺ 第四章 简单查询 课后作业

练习一:

1.使用两种方式查询所有员工(EMP)信息

select * from emp;

select empno 员工编号,ename 员工姓名,job 员工职位,mgr 领导编号,hiredate 入职日期,sal 工资,comm 奖金,deptno 部门编号

from emp;

2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。

select empno 员工编号,ename 员工姓名,job 员工职位,sal 员工月薪,deptno 工作部门编号 from emp;

练习二:

1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。

select *,sal*(1+0.2)+ifnull(comm,0) 员工转正后的月薪 from emp;

2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得

(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)

select *,sal*6+6*(1.2*sal) 第一年年薪 from emp;

练习三:

1.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入

(需考虑奖金部分),要渣孙氏求显示列标题为员工姓名,工资收入,奖金收入,总收入。

select ename 员工姓名,sal 工资收入,comm 奖金收入,(sal+ifnull(comm,0))*6+6*(1.2*sal+ifnull(comm,0)) 总收入

from emp;

练习四:

1.查询员工表中一共有哪几种岗位类型。

select distinct job from emp;

练习五:

1. 分别查看员工表、部门表、薪资等级表的表结构。

desc emp;

describe dept;

describe salgrade;

练习六:

1.查询职位为SALESMAN的员工编号、职位、入职日期。如散

select empno 员工编号,job 职位,hiredate 入职日期 from emp

where job='SALESMAN';

2.查询1985年12月31日之前入职的员工姓名及入职日期。

select ename 员工姓名,hiredate 入职日期 from emp

where hiredate<'1985-12-31';

3.查询部门编号不在10部门的员工姓名、部门编号。

select ename 员工姓名,deptno 部门编号 from emp

where deptno<> 10;

练习七:

1.查询入职日期在82年至85年的员工姓名,入职日期。

select ename,hiredate from emp

where hiredate between '1982-01-01' and '1985-12-31';

2.查询月薪在3000到5000的员工姓名,月薪。

select ename,sal from emp

where sal between 3000 and 5000;

3.查询部门编号为10或者20的员工姓名,部门编凯扒号。

select ename,deptno from emp

where deptno in (10,20);

4.查询经理编号为7902, 7566, 7788的员工姓名,经理编号。

select ename,mgr from emp

where mgr in (7902,7566,7788);

练习八:

1.查询员工姓名以W开头的员工姓名。

select ename from emp where ename like 'W%';

2.查询员工姓名倒数第2个字符为T的员工姓名。

select ename from emp where ename like '%T_';

3.查询奖金为空的员工姓名,奖金。

select ename,comm from emp where comm is null;

练习九:

1.查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的员工姓名、职位、工资

select ename ,job ,sal from emp

where sal>2000 and job='MANAGER' or job='SALESMAN';

2.查询工资超过2000并且职位是 MANAGER或SALESMAN的员工姓名、职位、工资。

select ename ,job ,sal from emp

where sal>2000 and job in ('MANAGER','SALESMAN');

3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。

select ename,deptno,sal from emp

where deptno in (10,20) and sal between 3000 and 5000;

4.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。

select ename,hiredate,job from emp

where (hiredate between '1981-01-01' and '1981-12-31') and job not like 'SALES%';

5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名包含A的员工姓名、职位、部门编号。

select ename,job,deptno from emp

where job in ('SALESMAN','MANAGER') and deptno in (10,20);

练习十:

1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。

select ename 员工姓名,deptno 部门编号 from emp

where deptno in (20,30)

order by sal ASC

2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。

select ename 员工姓名,deptno 部门编号,sal 工资 from emp

where (sal between 2000 and 3000) and deptno<>10

order by deptno asc,sal desc

3.查询入职日期在82年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,

并按照入职日期降序排序。

select ename 员工姓名,hiredate 入职日期,job 职位 from emp

where (hiredate between '1982-01-01' and '1983-12-31') and (job like 'SALES%' or job like 'MAN%')

order by hiredate desc

练习十一:

1.查询入职日期最早的前5名员工姓名,入职日期。

select  ename 员工姓名,hiredate 入职日期 from emp

order by hiredate asc

limit 0,5;

2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。

(1)一种写法:

select emp.ename 员工姓名,emp.hiredate 入职日期 from emp,dept

where emp.deptno=dept.deptno and loc='CHICAGO'

order by emp.hiredate DESC

limit 0,2;

(2)一种写法:

select ename 员工姓名,hiredate 入职日期 from emp

where deptno=(select deptno from dept where loc='CHICAGO')

order by hiredate DESC

limit 0,2;

3.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。

第一页:

select ename 员工姓名,hiredate 入职日期,deptno 部门名称 from emp

order by hiredate DESC

limit 0,5;

第二页:

select ename 员工姓名,hiredate 入职日期,deptno 部门名称 from emp

order by hiredate DESC

limit 5,5;

第三页:

select ename 员工姓名,hiredate 入职日期,deptno 部门名称 from emp

order by hiredate DESC

limit 10,5;

课后作业

1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。

select ename 员工姓名,hiredate 入职时间,job 职位 from emp

where hiredate>'1982-07-09' and job<>'SALESMAN'

2.查询员工姓名的第三个字母是a的员工姓名。

select ename 员工姓名 from emp

where ename like '__a%'

3.查询除了10、20号部门以外的员工姓名、部门编号。

一种写法:

select ename 员工姓名,deptno 部门编号 from emp

where deptno<>10 and deptno<>20;

一种写法:

select ename ,deptno  from emp

where deptno not in (10,20);

4.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。

select * from emp

where deptno=30

order by sal desc, ename asc

5.查询没有上级的员工(经理号为空)的员工姓名。

select ename 员工姓名 from emp

where mgr is null;

6.查询工资大于等于4500并且部门为10或者20的员工的姓名\工资、部门编号。

select ename 员工姓名,sal 员工工资,deptno 部门编号 from emp

where sal>=4500 and deptno in (10,20);

⑻ python删除超龄员工的一道题,我的代码如下,不知道哪里错了

我做了下,你看启裂看悄拦闭吧衡敏。

阅读全文

与python员工信息表作业相关的资料

热点内容
RPG游戏解压后乱码 浏览:986
无线通信的几个密钥算法 浏览:644
王者荣耀app数据修复在哪里 浏览:429
基于单片机饮水机温度控制系统的设计 浏览:455
c中委托被编译后的结构 浏览:152
飞燕app怎么注销账号 浏览:895
cad命令缩小 浏览:154
linux发展史 浏览:629
服务器选用什么CPU比较好 浏览:334
明星怎么宣传安卓 浏览:953
8255芯片编程 浏览:65
java文件bat运行 浏览:747
java常见笔试 浏览:529
360程序员模式 浏览:363
AQS算法的查询树构造 浏览:329
小猪微信营销源码 浏览:12
阿里云服务器能连接打印机吗 浏览:175
命令行参考 浏览:281
怎么初步认识编程 浏览:208
为什么程序员都喜欢谷歌 浏览:891