導航:首頁 > 編程語言 > 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員工信息表作業相關的資料

熱點內容
安卓怎麼換相機 瀏覽:931
華為相片文件夾怎麼刪除重復照片 瀏覽:312
plc編程視頻教程大全 瀏覽:938
直播用哪個app播放背景音樂 瀏覽:850
點歌機系統app在哪裡下載 瀏覽:609
javadate類型轉換string 瀏覽:694
RPG游戲解壓後亂碼 瀏覽:988
無線通信的幾個密鑰演算法 瀏覽:644
王者榮耀app數據修復在哪裡 瀏覽:429
基於單片機飲水機溫度控制系統的設計 瀏覽:455
c中委託被編譯後的結構 瀏覽:152
飛燕app怎麼注銷賬號 瀏覽:895
cad命令縮小 瀏覽:154
linux發展史 瀏覽:629
伺服器選用什麼CPU比較好 瀏覽:334
明星怎麼宣傳安卓 瀏覽:953
8255晶元編程 瀏覽:65
java文件bat運行 瀏覽:747
java常見筆試 瀏覽:529
360程序員模式 瀏覽:363