關系型數據庫又稱為關系型數據庫管理系統(RDBMS),它是利用數據概念實現對數據處理的算法,達到對數據及其快速的增刪改查操作。
既然被稱為關系型數據庫,那么它的關系在哪里體現呢?
舉一個例子吧。
比如我現在有表單A 和 表單B
其中:
表單A 中有一個名為user_id的字段
表單B 中也有一個名為user_id的字段
現在我把他們建立一種聯系,當我去修改表單A的user_id的值時,表單B 中的user_id的值也會自動進行修改,因為他們建立的一種關系,因為這種關系,使得數據具有一致性。 千萬數據中,獲取有數條直接,在運維或者開發哥哥的神操作下,他們冥冥中被安排的明明白白。
非關系型數據庫 正如它的名字,每條數據間都是獨立存在的,沒撒子關系哩。
RDBMS 術語
在上一篇文章 第四發 數據庫入門 中,我提到的數據庫,表單,行,列都是RDBMS中的一些術語。現在我繼續補充一些。
冗余: 不考慮數據大小,去提高查詢數據的速度。舉一個例子,比如我現在有兩個表單,一個叫A,一個叫B,而在A和B中,有好幾個字段是相關聯的,如果這時候我們數據量很大,還的要進行極其頻繁的數據查詢,數據庫查詢的速度一定會慢下來。在極其頻繁的查詢中,因為很多字段都是相關聯的,每次都要進行很多次跨表查詢,所以速度會慢下來。如果我們這時候取消幾個字段關系,把B中的字段寫到A里邊,把A里邊的寫到B里邊。這樣雖然取消了關系,但是兩個表中數據重復了,所以數據庫大小就會變大,但是這時候就會減少跨表查詢,數據庫查詢速度就很上來。所以,在數據庫中,有時候查詢慢的原因未必是數據量太大,而是擁有極其復雜的字段關系。
主鍵: 你可以理解為主要關鍵字.主鍵在當前表單的當前字段是唯一的 比如數據庫通常都是在第一個字段是 ID,這個通常就是一個主鍵,它默認會自增長。它在名為ID的字段下是不會重復的,每行的值與其他行的值不會重復。
外鍵: 主要用於兩個表直接的關聯. 強行舉例,比如我現在有一個名為A 和 B 的表單,在A 中有一個名為 username的字段,在B中有一個名為user_email的字段,這時username去關聯user_email的字段,這時的username字段就叫做外鍵.
索引: 利用一定的算法方法,對專門的字段進行優化,使其加快查詢速率。
接下來,來看Mysql的使用。
為了后期我們方便使用,我先在這里教大家創建一個mysql賬戶。

我們使用默認的root 超級管理員用戶登錄后,是這樣的。
這時,我們要創建一個專門針對一個名為test的庫創建一個用戶,讓這個用戶只對test庫有增刪改查的權限。
我決定這個用戶的用戶名和密碼都設置為 xeanyu

我們來解析一下 grant all on test.* to 'xeanyu'@'localhost' identified by "xeanyu";
其中
grant是Mysql一個專門控制權限的命令
all 指的是所有權限
test.* test是數據庫名字,然后后邊的 .*是指當前所有表
'xeanyu'@'localhost' 其中前面的xeanyu指的是用戶名,而localhost指的是這個用戶名能在哪里進行登錄,這里的localhost是本地。
identified by "xeanyu" 指的是設置密碼為xeanyu
請根據自己的情況做決定,記得命令后邊有一個分號!!
然后我們退出數據庫,使用xeanyu的數據庫賬戶登錄一下。

可以看到,我們使用新創建的用戶名成功登錄了。
這是勝利的第一步!
Mysql數據庫簡單的一些命令
- show databases; 顯示當前用戶下能操作的所有數據庫。
- use [數據庫名稱]; 切換數據庫
- show tables; 顯示當前數據庫下的所有表單
- create database [數據庫名稱] charset utf8mb4; 創建一個名為[數據庫名稱]的數據庫,且編碼為utf8.如果不指定編碼,可能只能支持拉丁文。
- drop database [數據庫名稱]; 刪除數據庫[名稱]
- truncate table [表名]; 清空表單所有數據
- delete table [表名]; 刪除表單
- desc [表名]; 查看表結構
- select [字段名或者用*代替所有] from [表單名]; 查看[表單名]中的[字段名或者用*代替所有]的數據。
Mysql 創建一個表單
我們先來手擼一個表結構(以后就不用了,放❤)

可以看到,重點在於最后的創建表結構。
我們分析一下那個Sql代碼。
|
1
2
3
4
5
6
|
create table User(
id
int auto_increment,
user_name
char(32) not null,
user_pass
char(64) not null,
user_age
int null,
primary key(id));
|
其中id user_name user_pass user_age 字段,其中在代碼的最后一行,指明了字段id 是主鍵,在代碼第二行,從auto_increment看出指明了字段id 自增長。而其中多次出現 not null,它的意思是不容許空,而null的意思是容許為空。
通常字段格式就是: 字段名 字段類型 字段屬性

我們使用 desc User 看出User表單中的表單結構.
向User表單插入第一條數據

我們來分析一下插入語句。
insert into User (user_name,user_pass,user_age) values("XeanYu","XeanYu",18);
我們分看下
其中insert 和 into 就不用說了,固定的。
其中User 是表單名,(user_name,user_pass,user_age) 其中是三個對應User中的三個字段,有人問,為什么不給id字段賦值?因為id 字段是自增長的主鍵。
然后values("XeanYu","XeanYu",18) 其中三個值對應三個user_name,user_pass,user_age三個字段。
這時候有人估計看咸魚不爽了,想要找事。如果我把id 字段的值強行寫進去呢,比如我就寫個1,重復的話,數據庫能拿我怎么樣呢?咸魚我准備實施反擊計划。

看到了吧。Mysql都看你不爽了,人家主鍵在對應字段下面是數據唯一的!
有人可能還要問啦,如果我把id改成其他數字行嗎?我要回答,當然可以,只要主鍵的值不重復,一切都好說。

可以看到,其實主鍵的值就是在上一行主鍵的值 +1
Mysql簡單數據查詢

我們已經了解了簡單的語句查詢。
我們稍微生個級別。
比如我要user_age 為18的幾行數據怎么辦?也就是說年齡18的用戶怎么篩選出來?

可以看到,我們用where user_age = 18 過濾出了我們需要的數據。
繼續升級,如果我不要看到id 這個字段的內容咋辦?

我們可以去更改select 所選擇的字段進行輸出。
由於有三個完全相同資料的用戶,我想直接跳過前兩個進行輸出怎么搞?
這個時候我們就要清楚偏移量大哥了.

可以看到,我們多了兩個東西limit offset 這兩個東西
limit: 顯示條數
offset: 跳過幾條開始查詢
Mysql簡單的數據修改更新
假如我想修改麻花藤的user_pass字段的值怎么辦呢?

直接上圖
update [表名] set [字段修改語句] where 條件;
Mysql 簡單的降序升序
比如我現在有一堆新日志,但是現在數據庫的從小到大的排列方法,我想把順序倒轉過來,我該怎么搞呢?

好了,Mysql的基本知識就寫到這里,等咸魚哪天突然發瘋給大家瘋狂講Mysql吧。
接下來就講Python和Mysql直接的操作。
Python操作Mysql
有一個這樣的庫,專門針對關系型數據庫而有的模塊。
他就是Sqlalchemy 它是一個ORM框架,是由Mako的作者創建的。
我們先使用pip3來安裝一下。
|
1
2
3
4
|
pip3 install Sqlalchemy --index http://pypi.douban.com/simple --trusted-host pypi.douban.com # 我們需要的主要模塊
pip3 install pymysql --index http://pypi.douban.com/simple --trusted-host pypi.douban.com # 用於Sqlalchemy與mysql直接的驅動問題
# 考慮到Python官方的PYPI倉庫安裝很慢,所以我們使用豆瓣的PYPI倉庫。當然,如果你有梯子,可以直接pip,不用帶參數。
# 其實這里的pymysql也可以進行Python操作Mysql,但是后邊我們要用Sqlalchemy做大事情!
|
在上邊的內容里邊,我們已經建立了一個針對數據庫 test的用戶,現在這個用戶就要派上用場了。
現在,我如果要用Python獲取數據庫test下的 User 的所有數據。
廢話不多說,直接上代碼。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
__author__ = 'XeanYu'
from sqlalchemy import create_engine
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
engine = create_engine("mysql://xeanyu:xeanyu@127.0.0.1/test")
con = engine.connect() # 去連接數據庫,返回一個連接后的實例
raw = con.execute("select * from User") # 注意,使用Python去操作數據庫,寫Sql命令時可以不帶分號。
for i in raw: # 這里會返回一個raw,raw中每個元素是每行值所組成的的元組(tuple)
print(i)
|
第2~4行:其中create_engine 是用於連接數據庫的,它會返回一個實例,但是這個時候並未連接。而第二行中的install_as_MySQLdb是一個處理包的函數,原本Mysqldb是不支持Python3的,后來有了Pymysql,但是還有很多模塊需要Mysqldb,所以就在這里進行了包上的處理,第三行所執行的函數,就是可以讓那些需要Mysqldb的模塊可以獲取到Mysqldb包。
第6行: 這里需要重點講下,這里的create_engine 連接數據庫的格式是
dialect+driver://username:password@host:port/database_name
其中 dialect 指的是數據庫程序,比如我用mysql,或者其他數據庫名稱,比如sqllite,postgersql等等。
其中driver 是數據庫程序的驅動,如果不指定,Sqlalchemy默認會是Mysqldb,這也是我為什么要用 install_as_MySQLdb 的原因。
其中username 是數據庫用戶名,比如我們創建的 xeanyu 這個用戶,xeanyu就是用戶名
其中 password 是用戶密碼
其中host 和 port 是數據庫地址和端口,其中port不指定則默認根據dialect 去默認。
其中database_name 是數據庫名稱
所以我們根據以上格式,我們去連接數據庫。
第8行: 我們根據create_engine給我們返回給我們的實例去連接數據庫,進行connect()
第9行: 我們又根據connect() 返回給我們的連接實例,去進行數據庫的操作, select * from User 其中不必帶上分號,它會返回一個迭代器,我們把這個迭代器賦值給raw
第11~12行: 我們輸出我們查詢的東西。
OK了,今天就說到這里。下節我們細說。
