Python | Python學習之mysql互動詳解
前言
最近在學習scrapy redis,在複習redis的同時打算把mysql和mongodb也複習一下,本篇為mysql篇,例項比較簡單,學習sql還是要動手實操記的比較牢。
安裝與啟動
安裝:sudo apt-get install mysql-server
檢視服務:ps ajx | grep mysql
停止服務:sudo service mysql stop
開啟服務:sudo service mysql start
重啟服務:sudo service mysql restart
連結資料庫:mysql -uroot -p後輸入密碼
檢視版本:select version();
常見資料庫語句
檢視資料庫:show database;
建立資料庫:create database 庫名 [charset = UTF8];
檢視建庫語句:show create database 庫名;
使用資料庫:use 庫名;
刪除資料庫:drop 庫名;
常見資料表語句
查看錶:show table;
查看錶結構:desc 表名;
建立表:
CREATE TABLE table_name( column1 datatype contrai, column2 datatype, column3 datatype, ..... columnN datatype, PRIMARY KEY(one or more columns) );
建立表常用屬性欄位:
-- auto_inorement 表示自動增長
-- not null 表示不為空
-- primary key 表示為主鍵
-- defaul 表示預設值
刪除表:drop table;
修改表結構:
新增欄位:alter table 表名 add 列名 型別;
修改欄位(重新命名):alter table 表名 change 原名 新名 型別及約束;
修改欄位(不重新命名):alter table 表名 modify 列名 型別及約束;
刪除欄位:alter table 表名 drop 列名;
常用增刪改查
基本查詢
檢視所有列:select * from 表名;
新增
全列插入:insert into 表名 values(...); --需要給主鍵留下佔位符,用0或null皆可。
部分列插入:insert into 表名(列1,...) values(值1,...);
插入多行全列資料:insert into 表名 values(...),(...)...;
插入多行部分列資料:insert into 表名(列1,...) values(值1,...),(值1,...)...;
更新
更新操作:update 表名 set 列1=值1,列2=值2... where 條件;
刪除
刪除操作(不推薦):delete from 表名 where 條件;
邏輯刪除(推薦):update 欄位名 set isvalid=0 where id=1; --設定刪除欄位,執行刪除欄位的操作即對該欄位更新。
mysql查詢詳解
查詢消除重複行:select distinct 列1,... from 表名;
條件查詢
where條件查詢:select * from 表名 where 條件;
where可以與比較運算子、邏輯運算子、模糊查詢、範圍查詢、空判斷搭配使用
比較運算子
等於: =
大於: >
大於等於: >=
小於: <
小於等於: <=
不等於: != 或 <>
舉個栗子:
select * from students where id > 1;
select * from students where id <= 2;
select * from students where name != '鹹魚';
select * from students where is_delete=0;
邏輯運算子
and
or
not
舉個栗子:
select * from students where id > 3 and gender=0;
select * from students where id < 4 or is_delete=0;
select * from students where id not 4;
模糊查詢
like
% 表示任意多個任意字元
_ 表示一個任意字元
rlike
舉個栗子:
select * from students where name like '鹹%'; --查詢以鹹字開頭的內容
select * from students where name like '鹹_'; --查詢以鹹字開頭且後面只有一個字的內容
select * from students where name like '鹹%' or name like '%魚'; -- 查詢以鹹字開頭或以魚字結尾的內容
範圍查詢
in 表示在一個非連續的範圍內
no in 表示不在一個非連續的範圍內
between ... and ... 表示在一個連續的範圍內
rlike 表示正則查詢,可以使用正則表示式查詢資料
舉個栗子:
select * from students where id in(1,3,8); -- 查詢 id 在 1,3,8 當中的內容
select * from students where id not in(1,3,8); -- 查詢 id 不在 1,3,8 當中的內容
select * from students where id between 3 and 8; -- 查詢 id 在3到8之間的內容
select * from students where name rlike "^鹹"; -- 查詢 name 是以鹹字開頭的內容
空判斷
判斷是否為空 is null
舉個栗子:
select * from students where height is null;
以上幾種預算符優先順序為:
優先順序由高到低的順序為:小括號、not、比較運算子、邏輯運算子。
and比or先運算,如果同時出現並希望先算or,需要結合()使用。
排序
asc 升序
desc 降序
舉個栗子:
select * from students order by age desc,height desc; --顯示所有的學生資訊,先按照年齡從大到小排序,當年齡相同時 按照身高從高到矮排序
聚合函式
count(*)查詢總數
max(列)表示求此列的最大值
min(列)表示求此列的最小值
sum(列)表示求此列的和
avg(列)表示求此列的平均值
舉個栗子:
select count(*) from students;
select max(id) from students where gender=2;
select min(id) from students where is_delete=0;
select sum(age) from students where gender=1;
select sum(age)/count(*) from students where gender=1; --求平均年齡
select avg(id) from students where is_delete=0 and gender=2;
分組
group by 將查詢結果按照1個或多個欄位進行分組,欄位值相同的為一組
group_concat 表示分組之後,根據分組結果,使用group_concat()來放置每一組的某欄位的值的集合
舉個栗子:
select gender from students group by gender; -- 將學生按照性別分組
輸出結果:
+--------+
| gender |
+--------+
| 男 |
| 女 |
| 中性 |
| 保密 |
+--------+
select gender,group_concat(name) from students group by gender;
輸出結果:
+--------+-----------------------------------------------------------+
| gender | group_concat(name) |
+--------+-----------------------------------------------------------+
| 男 | 小彭,小劉,小周,小程,小郭 |
| 女 | 小明,小月,小蓉,小賢,小菲,小香,小杰 |
| 中性 | 小金 |
| 保密 | 小鳳 |
+--------+-----------------------------------------------------------+
分頁
select * from 表名 limit start,count
舉個栗子:
select * from students where gender=1 limit 0,3; --查詢前三行的資料
連線查詢
語法:
select * from 表1 inner/left/right join 表2 on 表1.列 = 表2.列
其中:
inner join(內連線查詢):查詢的結果為兩個表匹配到的資料
right join(右連線查詢):查詢的結果為兩個表匹配到的資料,右表特有的資料,對於左表中不存在的資料使用null填充
left join(左連線查詢):查詢的結果為兩個表匹配到的資料,左表特有的資料,對於右表中不存在的資料使用null填充
舉個栗子:
select from students inner join classes on students.cls_id = classes.id;
select from students as s left join classes as c on s.cls_id = c.id;
select * from students as s right join classes as c on s.cls_id = c.id;
子查詢
在一個 select 語句中,嵌入了另外一個 select 語句, 那麼被嵌入的 select 語句稱之為子查詢語句。
子查詢可以和 in 搭配使用
主查詢 where 條件 in (子查詢)
資料庫的備份與恢復
資料庫備份
mysqldump –uroot –p 資料庫名 > 備份檔名.sql;
資料庫恢復
mysql -uroot –p 新資料庫名 < 備份檔名.sql
Python與mysql互動
Python與mysql互動流程
安裝與匯入
安裝相關庫:pip install pymysql
匯入:from pymysql import *
建立connection物件
connection = connect(host, port, database, user, password, charset)
其中引數如下:
host:連線的mysql主機,如果本機是'localhost'
port:連線的mysql主機的埠,預設是3306
database:資料庫的名稱
user:連線的使用者名稱
password:連線的密碼
charset:通訊採用的編碼方式,推薦使用utf8
connection物件方法如下:
close()關閉連線
commit()提交
cursor()返回Cursor物件,用於執行sql語句並獲得結果
獲取cursor
cursor=connection.cursor()
其中常用方法:
close():關閉cursor
execute(operation [, parameters ]):執行語句,返回受影響的行數,主要用於執行insert、update、delete語句,也可以執行create、alter、drop等語句。
fetchone():執行查詢語句時,獲取查詢結果集的第一個行資料,返回一個元組
fetchall():執行查詢時,獲取結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回
舉個栗子:
from pymysql import *
def main():
conn = connect(host='localhost',port=3306,database='xianyuplus',user='root',password='mysql',charset='utf8')
cs1 = conn.cursor()
count = cs1.execute('insert into xianyufans(name) values("666")')
conn.commit()
cs1.close()
conn.close()
if __name__ == '__main__':
main()
mysql檢視
什麼是檢視?
檢視是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不儲存具體的資料。
檢視語句
建立檢視:create view 檢視名稱 as select語句; --建議檢視以v_開頭
檢視檢視:show tables;
使用檢視:select * from 檢視名稱;
刪除檢視:drop view 檢視名稱;
檢視作用
-
提高了重用性,就像一個函式
-
對資料庫重構,卻不影響程式的執行
-
提高了安全效能,可以對不同的使用者
- 讓資料更加清晰
mysql事務
什麼是事務?
事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。
事務有什麼特點?
-
原子性,一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性。
-
一致性,資料庫總是從一個一致性的狀態轉換到另一個一致性的狀態。
-
隔離性,一個事務所做的修改在最終提交以前,對其他事務是不可見的。
- 永續性,一旦事務提交,則其所做的修改會永久儲存到資料庫。
事務相關命令
開啟事務:start transaction; 或者 begin;
提交事務:commit;
回滾事務:rollback;
mysql索引
什麼是索引?
資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度
索引相關命令
建立索引:create index 索引名稱 on 表名(欄位名稱(長度)) --當指定索引的欄位型別為字串時,應填寫長度
檢視索引:show index from 表名;
刪除索引:drop index 索引名稱 on 表名;
注意事項
-
建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引檔案。對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。
- 建立索引會佔用磁碟空間。
尾言
以上就是關於mysql的一些用法,其實是比較基礎的,重點部分是關於mysql的查詢部分,畢竟在業務應用中主要還是查詢為主。