⑴ 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軟體開發基礎
掌握計算機的構成和工作原理
會使用Linux常用工具
熟練使用Docker的基本命令
建立Python開發環境,並使用print輸出
使用Python完成字元串的各種操作
使用Python re模塊進行程序設計
使用Python創建文件、訪問、刪除文件
掌握import 語句、From…import 語句、From…import* 語句、方法的引用、Python中的包
②Python軟體開發進階
能夠使用Python面向對象方法開發軟體
能夠自己建立資料庫,表,並進行基本資料庫操作
掌握非關系資料庫MongoDB的使用,掌握Redis開發
能夠獨立完成TCP/UDP服務端客戶端軟體開發,能夠實現ftp、http伺服器,開發郵件軟體
能開發多進程、多線程軟體
③Python全棧式WEB工程師
能夠獨立完成後端軟體開發,深入理解Python開發後端的精髓
能夠獨立完成前端軟體開發,並和後端結合,熟練掌握使用Python進行全站Web開發的技巧
④Python多領域開發
能夠使用Python熟練編寫爬蟲軟體
能夠熟練使用Python庫進行數據分析
招聘網站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刪除超齡員工的一道題,我的代碼如下,不知道哪裡錯了
我做了下,你看啟裂看悄攔閉吧衡敏。