關系型數據庫
又稱為關系型數據庫管理系統
(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了,今天就說到這里。下節我們細說。