什么是關系型數據庫?


關系型數據庫又稱為關系型數據庫管理系統(RDBMS),它是利用數據概念實現對數據處理的算法,達到對數據及其快速的增刪改查操作。

既然被稱為關系型數據庫,那么它的關系在哪里體現呢?

舉一個例子吧。

比如我現在有表單A 和 表單B

其中:

表單A 中有一個名為user_id的字段

表單B 中也有一個名為user_id的字段

現在我把他們建立一種聯系,當我去修改表單A的user_id的值時,表單B 中的user_id的值也會自動進行修改,因為他們建立的一種關系,因為這種關系,使得數據具有一致性。 千萬數據中,獲取有數條直接,在運維或者開發哥哥的神操作下,他們冥冥中被安排的明明白白。

 

非關系型數據庫 正如它的名字,每條數據間都是獨立存在的,沒撒子關系哩。

RDBMS 術語

在上一篇文章 第四發 數據庫入門 中,我提到的數據表單都是RDBMS中的一些術語。現在我繼續補充一些。

冗余: 不考慮數據大小,去提高查詢數據的速度。舉一個例子,比如我現在有兩個表單,一個叫A,一個叫B,而在AB中,有好幾個字段是相關聯的,如果這時候我們數據量很大,還的要進行極其頻繁的數據查詢,數據庫查詢的速度一定會慢下來。在極其頻繁的查詢中,因為很多字段都是相關聯的,每次都要進行很多次跨表查詢,所以速度會慢下來。如果我們這時候取消幾個字段關系,把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代碼。

其中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來安裝一下。

在上邊的內容里邊,我們已經建立了一個針對數據庫 test的用戶,現在這個用戶就要派上用場了。

 

現在,我如果要用Python獲取數據庫test下的 User 的所有數據。

廢話不多說,直接上代碼。

第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了,今天就說到這里。下節我們細說。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM