1、mysql內置方法java
1)視圖的概念和用法python
1、什麼是視圖 視圖就是經過查詢獲得一張虛擬表,而後保存下來,下次用的直接使用便可 2、爲何要用視圖 若是要頻繁使用一張虛擬表,能夠不用重複查詢 3、如何用視圖 建立視圖: create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 查看視圖:create * from teacher2course; 刪除視圖:drop view teacher2course;
特別強調mysql
1、在硬盤中,視圖只有表結構文件,沒有表數據文件 2、視圖一般是用於插敘,儘可能不要修改視圖中的數據 3、開發人員儘可能不要使用視圖
2)觸發器linux
1 觸發器 在知足對某張表數據的增、刪、改的狀況下,自動觸發的功能稱之爲觸發器 2 爲什麼要用觸發器? 觸發器專門針對咱們對某一張表數據增insert、刪delete、改update的行爲,這類行爲一旦執行 就會觸發觸發器的執行,即自動運行另一段sql代碼
建立觸發器語法web
# 針對插入 create trigger tri_after_insert_t1 after insert on 表名 for each row begin sql代碼。。。 end create trigger tri_after_insert_t2 before insert on 表名 for each row begin sql代碼。。。 end # 針對刪除 create trigger tri_after_delete_t1 after delete on 表名 for each row begin sql代碼。。。 end create trigger tri_after_delete_t2 before delete on 表名 for each row begin sql代碼。。。 end # 針對修改 create trigger tri_after_update_t1 after update on 表名 for each row begin sql代碼。。。 end create trigger tri_after_update_t2 before update on 表名 for each row begin sql代碼。。。 end
觸發器案例算法
# 建立被檢查的表 CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR (32), priv CHAR (10), cmd CHAR (64), sub_time datetime, #提交時間 success enum ('yes', 'no') #0表明執行失敗 ); # 建立儲存表 CREATE TABLE errlog ( id INT PRIMARY KEY auto_increment, err_cmd CHAR (64), err_time datetime ); # 建立觸發器,檢查被檢查的表,達到條件,儲存到另外一個表 delimiter $$ create trigger tri_after_insert_cmd after insert on cmd for each row begin if NEW.success = 'no' then insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time); end if; end $$ delimiter ; 刪除觸發器:drop trigger tri_after_insert_cmd;
特別強調sql
修改告終尾符,必需要修改回來
delimiter $$
delimiter ;
3)事務,經常使用於轉帳數據庫
開啓一個事務能夠包含一些sql語句,這些sql語句要麼同時成功
要麼一個都別想成功,稱之爲事務的原子性
經常使用用於轉帳操做
示例安全
create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); #原子操做 start transaction; # 開啓事務 update user set balance=900 where name='wsb'; #買支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #賣家拿到90元 rollback; # 回滾,歡迎原有的數值 commit; # 執行以後,才真正的刷新到了硬盤上
python僞代碼實現框架
create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); try: update user set balance=900 where name='wsb'; #買支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #賣家拿到90元 except 異常: rollback; else: commit;
2、mysql的存儲過程
1)什麼是存儲過程
存儲過程包含了一系列可執行的sql語句,存儲過程存放於MySQL中,經過調用它的名字能夠執行其內部的一堆sql
2)三種開發模式
1、 應用程序:只須要開發應用程序的邏輯 mysql:編寫好存儲過程,以供應用程序調用 優勢:開發效率,執行效率都高 缺點:考慮到人爲因素、跨部門溝通等問題,會致使擴展性差 2、 應用程序:除了開發應用程序的邏輯,還須要編寫原生sql mysql: 優勢:比方式1,擴展性高(非技術性的) 缺點: 1、開發效率,執行效率都不如方式1 2、編寫原生sql太過於複雜,並且須要考慮到sql語句的優化問題 3、 應用程序:開發應用程序的邏輯,不須要編寫原生sql,基於別人編寫好的框架來處理數據,ORM mysql: 優勢:不用再編寫純生sql,這意味着開發效率比方式2高,同時兼容方式2擴展性高的好處 缺點:執行效率連方式2都比不過
3)在mysql中建立,調用存儲過程
1.建立存儲過程 delimiter $$ # in 只能用於接收值 # out 只能用於返回值 # inout 既能當接收值,又能當返回值 create procedure p1( in m int, in n int, out res int ) begin select tname from teacher where tid > m and tid < n; set res=0; end $$ delimiter ; 2.調用存儲過程 set @res=10 call p1(2,4,10); #查看結果 select @res; # 若是res的值被改了,則數據被執行成功了
4)在python中調用存儲過程
import pymysql conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', charset='utf8', database='db1' ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.callproc('p1',(2,4,10)) # @_p1_0=2,@_p1_1=4,@_p1_2=10 print(cursor.fetchall()) # 執行 p1 裏面的sql 語句 cursor.execute('select @_p1_2;') # 執行該sql 語句,目的是爲了 查看 @_p1_2 的值 print(cursor.fetchone()) # 查詢 @_p1_2 的值,若是爲 0 , 則 存儲執行成功 cursor.close() conn.close()
存儲過程的案例(與事務結合)
5)建立案例表
create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000);
mysql事務存儲過程,存儲失敗案例,回滾
delimiter // create PROCEDURE p5( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception BEGIN -- ERROR set p_return_code = 1; rollback; END; DECLARE exit handler for sqlwarning BEGIN -- WARNING set p_return_code = 2; rollback; END; START TRANSACTION; update user set balance=900 where id =1; update user123 set balance=1010 where id = 2; update user set balance=1090 where id =3; COMMIT; -- SUCCESS set p_return_code = 0; #0表明執行成功 END // delimiter ; # user123表 不存在,必然會報錯
python事務存儲過程,存儲失敗案例,回滾,基於上面內容
import pymysql # user表,在db2 庫下 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', charset='utf8', database='db2' ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.callproc('p5',(100,)) # @_p5_0 = 100 cursor.execute('select @_p5_0') print(cursor.fetchone()) # {'@_p5_0':0} cursor.close() conn.close()
正確存儲案例測試,下面語法正確便可
START TRANSACTION; update user set balance=900 where id =1; update user set balance=1010 where id = 2; update user set balance=1090 where id =3; COMMIT;
3、內置函數概括
1)數字函數
ROUND(x,y)
返回參數x的四捨五入的有y位小數的值
RAND()
返回0到1內的隨機值,能夠經過提供一個參數(種子)使RAND()隨機數生成器生成一個指定的值
2)聚合函數(經常使用於GROUP BY從句的SELECT查詢中)
AVG(col) 返回指定列的平均值
COUNT(col) 返回指定列中非NULL值的個數
MIN(col) 返回指定列的最小值
MAX(col) 返回指定列的最大值
SUM(col) 返回指定列的全部值之和
GROUP_CONCAT(col) 返回由屬於一組的列值鏈接組合而成的結果
3)字符串函數
CHAR_LENGTH(str) 返回值爲字符串str 的長度,長度的單位爲字符。一個多字節字符算做一個單字符。 CONCAT(str1,str2,...) 字符串拼接 若有任何一個參數爲NULL ,則返回值爲 NULL。 CONCAT_WS(separator,str1,str2,...) 字符串拼接(自定義鏈接符) CONCAT_WS()不會忽略任何空字符串。 (然而會忽略全部的 NULL)。 CONV(N,from_base,to_base) 進制轉換 例如: SELECT CONV('a',16,2); 表示將 a 由16進制轉換爲2進制字符串表示 FORMAT(X,D) 將數字X 的格式寫爲'#,###,###.##',以四捨五入的方式保留小數點後 D 位, 並將結果以字符串的形式返回。若 D 爲 0, 則返回結果不帶有小數點,或不含小數部分。
方法概括
INSERT(str,pos,len,newstr)
在str的指定位置插入字符串
pos:要替換位置其實位置
len:替換的長度
newstr:新字符串
特別的:
若是pos超過原字符串長度,則返回原字符串
若是len超過原字符串長度,則由新字符串徹底替換
INSTR(str,substr)
返回字符串 str 中子字符串的第一個出現位置。
LEFT(str,len)
返回字符串str 從開始的len位置的子序列字符。
LOWER(str)
變小寫
UPPER(str)
變大寫
REVERSE(str)
返回字符串 str ,順序和字符順序相反。
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
特別說明
不帶有len 參數的格式從字符串str返回一個子字符串,起始於位置 pos。
帶有len參數的格式從字符串str返回一個長度同len字符相同的子字符串,起始於位置 pos。
使用 FROM的格式爲標準 SQL 語法。也可能對pos使用一個負值。
倘若這樣,則子字符串的位置起始於字符串結尾的pos 字符,而不是字符串的開頭位置。在如下格式的函數中能夠對pos 使用一個負值。
使用案例
mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3); -> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3); -> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2); -> 'ki'
4)日期和時間函數
CURDATE()或CURRENT_DATE() 返回當前的日期 CURTIME()或CURRENT_TIME() 返回當前的時間 DAYOFWEEK(date) 返回date所表明的一星期中的第幾天(1~7) DAYOFMONTH(date) 返回date是一個月的第幾天(1~31) DAYOFYEAR(date) 返回date是一年的第幾天(1~366) DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE); FROM_UNIXTIME(ts,fmt) 根據指定的fmt格式,格式化UNIX時間戳ts HOUR(time) 返回time的小時值(0~23) MINUTE(time) 返回time的分鐘值(0~59) MONTH(date) 返回date的月份值(1~12) MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE); NOW() 返回當前的日期和時間 QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE); WEEK(date) 返回日期date爲一年中第幾周(0~53) YEAR(date) 返回日期date的年份(1000~9999)
重點:format字符串格式
DATE_FORMAT(date,format) 根據format字符串格式化date值 mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -> 'Sunday October 2009' mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', -> '%D %y %a %d %m %b %j'); -> '4th 00 Thu 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', -> '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52' mysql> SELECT DATE_FORMAT('2006-06-00', '%d'); -> '00'
5)加密函數
MD5()
計算字符串str的MD5校驗和
PASSWORD(str)
返回字符串str的加密版本,這個加密過程是不可逆轉的,和UNIX密碼加密過程使用不一樣的算法
6)控制流函數
CASE WHEN[test1] THEN [result1]...ELSE [default] END 若是testN是真,則返回resultN,不然返回default CASE [test] WHEN[val1] THEN [result]...ELSE [default]END 若是test和valN相等,則返回resultN,不然返回default IF(test,t,f) 若是test是真,返回t;不然返回f IFNULL(arg1,arg2) 若是arg1不是空,返回arg1,不然返回arg2 NULLIF(arg1,arg2) 若是arg1=arg2返回NULL;不然返回arg1
7)控制函數小練習
#7.1、準備表 /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50720 Source Host : localhost:3306 Source Database : student Target Server Type : MYSQL Target Server Version : 50720 File Encoding : 65001 Date: 2018-01-02 12:05:30 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for course -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `c_id` int(11) NOT NULL, `c_name` varchar(255) DEFAULT NULL, `t_id` int(11) DEFAULT NULL, PRIMARY KEY (`c_id`), KEY `t_id` (`t_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES ('1', 'python', '1'); INSERT INTO `course` VALUES ('2', 'java', '2'); INSERT INTO `course` VALUES ('3', 'linux', '3'); INSERT INTO `course` VALUES ('4', 'web', '2'); -- ---------------------------- -- Table structure for score -- ---------------------------- DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `s_id` int(10) DEFAULT NULL, `c_id` int(11) DEFAULT NULL, `num` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of score -- ---------------------------- INSERT INTO `score` VALUES ('1', '1', '1', '79'); INSERT INTO `score` VALUES ('2', '1', '2', '78'); INSERT INTO `score` VALUES ('3', '1', '3', '35'); INSERT INTO `score` VALUES ('4', '2', '2', '32'); INSERT INTO `score` VALUES ('5', '3', '1', '66'); INSERT INTO `score` VALUES ('6', '4', '2', '77'); INSERT INTO `score` VALUES ('7', '4', '1', '68'); INSERT INTO `score` VALUES ('8', '5', '1', '66'); INSERT INTO `score` VALUES ('9', '2', '1', '69'); INSERT INTO `score` VALUES ('10', '4', '4', '75'); INSERT INTO `score` VALUES ('11', '5', '4', '66.7'); -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `s_id` varchar(20) NOT NULL, `s_name` varchar(255) DEFAULT NULL, `s_age` int(10) DEFAULT NULL, `s_sex` char(1) DEFAULT NULL, PRIMARY KEY (`s_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('1', '魯班', '12', '男'); INSERT INTO `student` VALUES ('2', '貂蟬', '20', '女'); INSERT INTO `student` VALUES ('3', '劉備', '35', '男'); INSERT INTO `student` VALUES ('4', '關羽', '34', '男'); INSERT INTO `student` VALUES ('5', '張飛', '33', '女'); -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `t_id` int(10) NOT NULL, `t_name` varchar(50) DEFAULT NULL, PRIMARY KEY (`t_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES ('1', '大王'); INSERT INTO `teacher` VALUES ('2', 'alex'); INSERT INTO `teacher` VALUES ('3', 'egon'); INSERT INTO `teacher` VALUES ('4', 'peiqi'); #7.2、統計各科各分數段人數.顯示格式:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60] select score.c_id, course.c_name, sum(CASE WHEN num BETWEEN 85 and 100 THEN 1 ELSE 0 END) as '[100-85]', sum(CASE WHEN num BETWEEN 70 and 85 THEN 1 ELSE 0 END) as '[85-70]', sum(CASE WHEN num BETWEEN 60 and 70 THEN 1 ELSE 0 END) as '[70-60]', sum(CASE WHEN num < 60 THEN 1 ELSE 0 END) as '[ <60]' from score,course where score.c_id=course.c_id GROUP BY score.c_id;
8)須要掌握的操做 date_format ,可根據年,月,日 分組統計
基本使用方法
mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -> 'Sunday October 2009' mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', -> '%D %y %a %d %m %b %j'); -> '4th 00 Thu 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', -> '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52' mysql> SELECT DATE_FORMAT('2006-06-00', '%d'); -> '00'
使用案例
#2 準備表和記錄 CREATE TABLE blog ( id INT PRIMARY KEY auto_increment, NAME CHAR (32), sub_time datetime ); INSERT INTO blog (NAME, sub_time) VALUES ('第1篇','2015-03-01 11:31:21'), ('第2篇','2015-03-11 16:31:21'), ('第3篇','2016-07-01 10:21:31'), ('第4篇','2016-07-22 09:23:21'), ('第5篇','2016-07-23 10:11:11'), ('第6篇','2016-07-25 11:21:31'), ('第7篇','2017-03-01 15:33:21'), ('第8篇','2017-03-01 17:32:21'), ('第9篇','2017-03-01 18:31:21'); #3. 提取sub_time字段的值,按照格式後的結果即"年月"來分組 SELECT DATE_FORMAT(sub_time,'%Y-%m'),COUNT(1) FROM blog GROUP BY DATE_FORMAT(sub_time,'%Y-%m'); #結果 +-------------------------------+----------+ | DATE_FORMAT(sub_time,'%Y-%m') | COUNT(1) | +-------------------------------+----------+ | 2015-03 | 2 | | 2016-07 | 4 | | 2017-03 | 3 | +-------------------------------+----------+ 3 rows in set (0.00 sec)
4、python執行mysql語句(增刪改查)
pip install pymysql
pymysql的執行的mysql語句
import pymysql conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db42', charset='utf8' ) cursor=conn.cursor(pymysql.cursors.DictCursor) sql="insert into user(username,password) value(%s,%s)" # 插入數據 rows=cursor.execute(sql,('wxx',123)) print(rows) print(cursor.lastrowid) # 查詢當前記錄到了多少條了。即查取 id 是幾 rows=cursor.execute('update user set username="alexSB" where id=2') # 修改數據 print(rows) # 一次插入多行記錄 sql='insert into user(username,password) values(%s,%s)' rows=cursor.executemany(sql,[('lwz','123'),('evia','455'),('lsd','333')]) print(rows) print(cursor.lastrowid) conn.commit() # 只有commit提交纔會完成真正的修改 cursor.close() conn.close()
1)插入數據
import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='db1',charset='utf8') # db是數據庫 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 爲後面獲取的mysql數據字典話 # sql_content = "insert into tb2 (user,password) values ('huang','agegg')" # 進入db1數據庫的tb2表中插入數據。 容易被sql語句注入,不安全
effect_row = cursor.execute("insert into tb2 (user,password) values ('huang','agegg')") 用 cursor.execute() 來操做sql語句更安全
# cursor.execute(sql_content)
conn.commit()
print(cursor.lastrowid) # 由於是自增ID,能夠用這個方法查看插上數據的ID cursor.close() conn.close()
字符串格式及加密插入數據
import pymysql import hashlib conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='db1',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) user = input("請輸入用戶名:") pwd = input("請輸入密碼:") has = hashlib.md5(bytes('123afggegag',encoding='utf-8')) has.update(bytes(pwd, encoding='utf-8')) d = has.hexdigest() sql_content = "insert into tb2(user,password) values ('%s', '%s')" %(user,d) cursor.execute(sql_content) conn.commit() cursor.close() conn.close()
2)查看數據
查詢數據一
import pymysql conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123456', database='db1', charset='utf8' ) # cursor = conn.cursor() # 執行這個返回元組形式 cursor=conn.cursor(pymysql.cursors.DictCursor) # 返回字典形式 rows=cursor.execute('select * from class;') # 查詢結果,是影響到的行數 print(rows) # 4 輸入影響的行數 print(cursor.fetchone()) # {'cid': 1, 'caption': '三年二班'} 返回字典的形式 print(cursor.fetchone()) print(cursor.fetchmany(2)) print(cursor.fetchone()) # None 由於只有4 條記錄,再查詢就爲 None # fetchone() 一條一條的取 # fetchmany(2) 聯繫取2條 # fetchall() 取出剩下的全部 cursor.close() conn.close()
遊標移動的,絕對移動,和相對移動
import pymysql conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123456', database='db1', charset='utf8' ) cursor=conn.cursor(pymysql.cursors.DictCursor) rows=cursor.execute('select * from class;') print(cursor.fetchall()) cursor.scroll(1,'absolute') # 設置遊標,絕對移動 print(cursor.fetchone()) cursor.scroll(1,'relative') # 設置遊標,相對移動 print(cursor.fetchone()) cursor.close() conn.close()
3)利用數據庫測試登陸案例,會有sql注入問題
import pymysql conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db42', charset='utf8' ) cursor=conn.cursor(pymysql.cursors.DictCursor) inp_user=input('用戶名>>:').strip() inp_pwd=input('密碼>>:').strip() sql="select * from user where username='%s' and password='%s'" %(inp_user,inp_pwd) print(sql) rows=cursor.execute(sql) if rows: # 查詢到語句,則返回1,爲真 print('登陸成功') else: # 沒有查詢到語句,則返回0,爲假 print('登陸失敗') cursor.close() conn.close()
sql 語法的漏洞
4)解決sql注入問題。rows=cursor.execute(sql,(inp_user,inp_pwd))
import pymysql conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db42', charset='utf8' ) cursor=conn.cursor(pymysql.cursors.DictCursor) inp_user=input('用戶名>>:').strip() inp_pwd=input('密碼>>:').strip() sql="select * from user where username=%s and password=%s" print(sql) rows=cursor.execute(sql,(inp_user,inp_pwd)) if rows: print('登陸成功') else: print('登陸失敗') cursor.close() conn.close()
查詢數據二
import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='db1',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql_content = "select * from tb2" cursor.execute(sql_content) d = cursor.fetchall() # 獲取全部的數據 fetchone 獲取一個 fetchmany 獲取多個 print(d) for item in d: print(item) if item['user'] == 'zhan': print("hello") break conn.commit() cursor.close() conn.close()