1. 程式人生 > 資料庫 >Python | Python學習之mysql互動詳解

Python | Python學習之mysql互動詳解

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 表名;

檢視指定列:select 列1,列2,... 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 | 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的查詢部分,畢竟在業務應用中主要還是查詢為主。