本文目錄一覽:
掌握Python 操作 MySQL 資料庫
本文Python 操作 MySQL 資料庫需要是使用到 PyMySQL 驅動
Python 操作 MySQL 前提是要安裝好 MySQL 資料庫並能正常連接使用,安裝步驟詳見下文。
注意: 安裝過程我們需要通過開啟管理員許可權來安裝,否則會由於許可權不足導致無法安裝。
首先需要先下載 MySQL 安裝包, 官網下載地址 下載對應版本即可,或直接在網上拉取並安裝:
許可權設置:
初始化 MySQL:
啟動 MySQL:
查看 MySQL 運行狀態:
Mysql安裝成功後,默認的root用戶密碼為空,你可以使用以下命令來創建root用戶的密碼:
登陸:
創建資料庫:
查看資料庫:
PyMySQL 模塊使用 pip命令進行安裝:
假如系統不支持 pip 命令,可以使用以下方式安裝:
pymysql .connect 函數:連接上資料庫
輸出結果顯示如下:表面資料庫連接成功
使用 pymysql 的 connect() 方法連接資料庫,connect 參數解釋如下:
conn.cursor():獲取游標
如果要操作資料庫,光連接數據是不夠的,咱們必須拿到操作資料庫的游標,才能進行後續的操作,游標的主要作用是用來接收資料庫操作後的返回結果,比如讀取數據、添加數據。通過獲取到的資料庫連接實例 conn 下的 cursor() 方法來創建游標,實例如下:
輸出結果為:
cursor 返回一個游標實例對象,其中包含了很多操作數據的方法,如執行sql語句,sql 執行命令: execute() 和 executemany()
execute(query,args=None):
executemany(query,args=None):
其他游標對象如下表:
完整資料庫連接操作實例如下:
以上結果輸出為:
創建表代碼如下:
如下所示資料庫表創建成功:
插入數據實現代碼:
插入數據結果:
Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。
查詢數據代碼如下:
輸出結果:
DB API中定義了一些資料庫操作的錯誤及異常,下表列出了這些錯誤和異常:
本文給大家介紹 Python 如何連接 Mysql 進行數據的增刪改查操作,文章通過簡潔的代碼方式進行示例演示,給使用 Python 操作 Mysql 的工程師提供支撐。
MySQL(DML數據操作語言,添加/刪除/修改資料庫數據)
插入數據
insert into 表名(欄位) values(『數據』);
insert into 表名1(name,age) select name,age from 表2; #表2 數據信息複製到表1
修改數據
update 表名 set ‘欄位’=’數據’; #修改數據
delect from 表名 where 欄位=值; #刪除數據
truncate table 表名; #清空所有數據 且無法恢復
DQL (數據查詢語言,用來查詢數據)
select 要查詢欄位 from 表名 [where 滿足條件];
[group by 分組依據]
[order by 排序依據]
[limit 限定輸出結果]
select * from 表名; #查詢 表 所有數據
select 欄位 欄位 from 表名; #查詢指定欄位數據
select st.name,st.age,th.name,th.age from st,th; #查詢一個或多個 表中的數據
SELECT 欄位名 FROM 表名 WHERE 條件1 OR 條件2 […OR 條件n];
例:SELECT * FROM students WHERE age20 OR education!=’大專’; #查詢年齡小於20或 者學歷不等於大專的學生信息
SELECT 欄位名 FROM 表名 WHERE 條件1 AND 條件2 […AND 條件n];
例:SELECT * FROM students WHERE age22 AND education=’大專’; # 查詢年齡大於22 且學歷為大專的學生信息
select 欄位 from 表名 where age in (12,17,23); #數據在指定 數據 裡面
select 欄位 from 表名 where age between 23 and 28; #數據在23-28 之間
select * from 表名 order by 欄位名; #排序,升序
select 欄位 from 表名 order by desc; # 欄位降序
select 欄位1,欄位2…… from 表名 group by 分組依據欄位; #每個欄位只顯示一條
例:SELECT id,sname,age,phone,place,GROUP_CONCAT(age,place) FROM students GROUP BY age,place; #查詢學生信息,根據age,place分組並顯示每一組的記 錄
select distinct 欄位 from 表名; #去除結果重複行
例:SELECT DISTINCT age FROM students; # 查詢學生的年齡段情況
selcet 欄位1,欄位2,group_concat(分組依賴欄位名) from 表名 group by 分組依賴欄位名; #查詢每個組中記錄數量,顯示出來(使用關鍵字GROUP BY與GROUP_CONCAT()函數一起使用,可以將每個組中的記錄數量都顯 示出來)
例:selcet id,sname,age,phone,GROUP_CONCAT(age) FROM students GROUP BY age; # 查詢學生id,姓名,年齡,電話,根據age分組並顯示每一組的記錄
SELECT 欄位名 FROM 表名 [其他條件] LIMIT int,int; 參數1是開始讀取的第一條記錄的 編號,參數2是要查詢記錄的個數
例:SELECT * FROM students ORDER BY age LIMIT 0,5; # 查詢學生信息,根據age 排序從第0位開始顯示,只顯示5條
select 欄位名 from 表名where欄位名 regexp ‘匹配方式’;
(^匹配以特定字元或 字元串開頭的記錄,
$匹配以特定字元或 字元串結尾的記錄
[^字符集 合]匹配除「字符集合」以 外的任意一個字元
S1|S2|S3匹配S1 S2 S3中 的任意一個字元串
字元串{N }匹配字元串出現N次
字元串 {M,N}匹配字元串出現至 少M次,最多N次)
聚合函數查詢
select count(欄位名) from 表名; #對於除”*”以外的任何參數,返回所選擇集合中非NULL值的行的數目;對於參數「*」,返回選擇集 合中所有行的數據,包含NULL值的行
例:SELECT COUNT(*) FROM students;
select sum(欄位名) from 表名; #表中某個欄位取值的總和
select avg(欄位名) from 表名; #表中某個欄位取值的平均值
select max(欄位名) from 表名; #表中某個欄位取值的最大值
select min(欄位名) from 表名; #表中某個欄位取值的最小值
連接查詢
a.內連接:列出數據表中與連接條件相匹配的數據行,組合成新記錄【只有滿足條件的記錄才出現在查詢結 果】 內連接的最常見的例子是相等連接,也就是連接後的表中的某個欄位與每個表中的都相同
select 欄位名1,欄位名2 from 表名1 inner join 表名2 where 連接條件;
例:select s.name,d.dname from staff s inner join department d WHERE s.dpid = d.id; # 連接員工表的dpid欄位和部門表的id欄位,並查詢員工姓名和部門名稱
b.外連接:與內連接不同,外連接是指使用OUTER JOIN關鍵字將兩個表連接起來。外連接生成的結果集不僅 包含符合連接條件的行數據 ,而且還包含左表(左外連接時的表) 右表(右外連接時的表)或 兩邊連接表(全外連接時的表)中所有的數據行。
select 欄位名稱 from 表名1 LEFT|RIGHT join 表名2 on 表名1.欄位名1 = 表名2.欄位名2;
例:select s.name,d.dname FROM staff s LEFT JOIN department d ON s.dpid = d.id; #連接員工表的dpid欄位和部門表的id欄位,並查詢員工姓名和部門名稱,如果右表中沒有對應的 連接數據,會自動添加NULL值
例:SELECT s.name,d.dname FROM staff s RIGHT JOIN department d ON s.dpid = d.id; # 連接員工表的dpid欄位和部門表的id欄位,並查詢員工姓名和部門名稱,如果左表中沒有對應 的連接數據,會自動添加NULL值
例:SELECT 欄位名1,欄位名2 FROM 表名1,表名2 WHERE 連接條件 AND 限制條件; 例:SELECT s.name,d.dname FROM staff s,department d WHERE s.dpid = d.id AND s.dpid1; # 查詢員工姓名和部門名稱,條件是員工表的dpid欄位與部門表中的id欄位相等,並且dpid大於1
合併查詢結果
select 欄位名 from 表名 UNION select 欄位名 from 表名; #關鍵字UNION是將所 有的查詢結果合併到一起,並且去除相同記錄
例:SELECT dpid FROM staff UNION SELECT id FROM department; # 查詢員工表dpid與部門表id,如果有重複數據,只顯示一次
select 欄位名 drom 表名 UNION ALL select 欄位名from表名; #關鍵字UNION ALL 則只是簡單地將結果合併到一 起
例:SELECT dpid FROM staff UNION ALL SELECT id FROM department; # 查詢員工表dpid與部門表id,全部顯示
MYSQL使用基礎、進階分享
MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB公司開發,屬於Oracle旗下產品,是最流行的關係型資料庫管理系統之一。
埠是3306。
表很多時,使用linux腳本,需要根據需要修改一下:
和創建一樣,可以加上 if exists
可兩篇文章:
如:
用於在已有的表中添加、刪除或修改列。
添加 ADD
或
默認是添加到最後,但可以指定位置。 FIRST :添加最前
AFTER 欄位名 :添加指定欄位之後
例子:
刪除 DROP
修改 MODIFY 主要修改原列的類型或約束條件 同樣可以用 FIRST 和 AFTER 欄位名 ,代表的是修改到哪裡。
修改欄位名 CHANGE
可以把表2的數據複製到表1中,但 不能複製約束性條件 。
單行
多行,注意 只有一個VALUES :
不寫 (行1, 行2…) 這一部分的話,默認一一對應
除了以上方法外,還可以用SET為每一行附上相應的值。
假如沒有篩選的話,就給全部都修改了。可以用 WHERE 篩選。
假如 沒有篩選的話,就給全部刪除了 。相當於清空。
清空
先把表刪除,然後再建一個。與 DELETE FROM 相比, TRUNCATE 的效率更快,因為 DELETE FROM 是把記錄逐條刪除的。
查詢執行的順序
FROM — WHERE — SELECT — GROUP BY — HAVING — ORDER BY — LIMIT
注意
當數據很大,上百萬的時候,使用LIMIT … OFFSET ..的方式進行分頁十分浪費資源且耗時長。最好是結合WHERE使用,如:
REGEXP 使用正則表達進行匹配。 查詢時,需要搭配WHERE或HAVING使用 。
兩個表之間有交集且要用到兩個表的數據時,可以使用內連接查詢。
LEFT JOIN 關鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
用法:
RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。 把LEFT JOIN的表1、表2調換順序,就是REGHT JOIN 。
FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行. 相當於結合了 LEFT JOIN 和 RIGHT JOIN 的結果。
但 MySQL中不支持 FULL OUTER JOIN 。
即SELECT嵌套。
IN 一個查詢結果作為另一個查詢的條件。 如:
EXISTS 用於判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時執行。 如:
索引的本質是一種排好序的數據結構。利用索引可以提高查詢速度。
常見的索引有:
MySQL通過外鍵約束來保證表與表之間的數據的完整性和準確性。 外鍵的使用條件:
外鍵的好處:可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作。
對已有的兩個表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b
為子表添加一個欄位,當做外鍵
為子表添加外鍵約束條件
假如刪除記錄報錯: [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (…)
這是因為MySQL中設置了foreign key關聯,造成無法更新或刪除數據。可以通過設置 FOREIGN_KEY_CHECKS 變數來避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數據 第三步:啟動外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;
使用 UNION 來組合兩個查詢,如果第一個查詢返回 M 行,第二個查詢返回 N 行,那麼組合查詢的結果一般為 M+N 行。
每個查詢必須包含相同的列、表達式和聚集函數。
默認會去除相同行,如果需要 保留 相同行,使用 UNION ALL 。
只能包含一個 ORDER BY 子句,並且必須位於語句的最後 。
內置函數很多, 見: MySQL 函數
我們一般使用 START TRANSACTION 或 BEGIN 開啟事務, COMMIT 提交事務中的命令, SAVEPOINT : 相當於設置一個還原點, ROLLBACK TO : 回滾到某個還原點下
一般的使用格式如下:
開啟事務時, 默認加鎖
根據類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。
根據粒度劃分又分表鎖和行鎖。表鎖由資料庫伺服器實現,行鎖由存儲引擎實現。
除此之外,我們可以顯示加鎖
加鎖時, 如果沒有索引,會鎖表,如果加了索引,就會鎖行
InnoDB默認支持行鎖,獲取鎖是分步的,並不是一次性獲取所有的鎖,因此在鎖競爭的時候就會出現死鎖的情況
解決方法:
即ACID特性:
由於並發事務會引發上面這些問題, 我們可以設置事務的隔離級別解決上面的問題.
MySQL的默認隔離級別(可重複讀)
查看當前會話隔離級別
方式1
方式2
設置隔離級別
主從集群的示意圖如下:
主要涉及三個線程: binlog 線程、 I/O 線程和 SQL 線程。
同步流程:
由於MySQL主從集群只會從主節點同步到從節點, 不會反過來同步, 所以需要讀寫分離
讀寫分離需要在業務層面實現 , 寫數據只能在主節點上完成, 而讀數據可以在主節點或從節點上完成
索引是幫助MySQL高效獲取數據的排好序的數據結構
MySQL的索引有
推薦兩個在線工具:
簡單來說, B樹是在紅黑樹(一個平衡二叉樹)的基礎上將一個節點存放多個值, 實現的, 降低了樹的高度, 每個節點都存放索引及對應數據指針, 同一層的節點是遞增的
而B+樹在B樹的基礎上進行優化, 非葉子節點存放 子節點的開始的索引, 葉子節點存放索引和數據的指針, 且葉子節點之間有雙向的指針
如下示意圖:
不同的引擎, 主鍵索引存放的數據也不一樣, 比如常見的 MyISAM 和 InnoDB
MyISAM 的B+樹葉子節點存放表數據的指針, InnoDB 的B+樹葉子節點存放處主鍵外的數據
其他的:
即多個列組成一個索引, 語法:
由於聯合索引的B+樹的結構, 根據列建立, 所以我們的查找條件也要根據索引列的順序( where column1=x, column2=y,columnN… ), 否則會全表掃描
如果你對列進行了 (+,-,*,/,!) , 那麼都將不會走索引。
OR 引起的索引失效
OR 導致索引是在特定情況下的,並不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個欄位,那麼索引 不會失效 , 反之索引失效 。
這個我相信大家都明白,模糊搜索如果你前綴也進行模糊搜索,那麼不會走索引。
這兩種用法,也將使索引失效。另 IN 會走索引,但是當IN的取值範圍較大時會導致索引失效,走全表掃描, 見: MySQL中使用IN會不會走索引
不走索引。
走索引。
所以設計表的時候, 建議不可為空, 而是將默認值設置為 “” ( NOT NULL DEFAULT “” )
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/232183.html