[討論] 東區幻境MariaDB系列教學03-基本概念後篇 - 討論區

[討論] 東區幻境MariaDB系列教學03-基本概念後篇

文章瀏覽次數 864 文章回覆數 8

Dack

Dack圖像(預設)

2021-09-04 18:26:18

From:219.70.166.106

在上一篇教學中,我們學完了基本概念裡最煩人最堅澀的資料型別。接下來的「資料庫架構」、「欄位屬性」跟「基本指令」是比較好懂、有趣的,如果從學習資料型別的恐懼中回神了就跟小弟一起看下去吧!

MariaDB架構

我們首先來說說MariaDB的架構,由大到小從上到下分別有:

  • 程式實體
  • 資料庫
  • 資料表
  • 欄位
  • 資料

到這邊也許有高手開始OS:我們明明在講資料庫,怎麼弄得好像Excel?還表欄位咧!
小弟不得不回應一下。是的!MariaDB乃至Microsoft SQL、PGSQL、Oracle等以SQL操作的常見關聯式資料庫確實如此,它們根本就是嚴謹可分權限接受高強度併發的超級Excel。這也就是為什麼學習資料庫系統時,關聯式資料庫的學習門檻比非關聯式資料庫還低的原因。
迷之音:小弟知道板上有高手是學NO-SQL起家的,沒有要戰請別暴走。

程式實體

程式實體或稱程式實例,指的就是我們裝在電腦上的這支MariaDB程式。聽起來好像在講廢話,不過各位千萬別小看這個概念。
為了應付不同的需求,一部機器上其實可部署好多個MariaDB實體。甚至我們開發的程式、網站會有極強的併發需要,MariaDB也允許我們在好多部機器上部署實體以形成資料庫中心(或有人說叢集)。

資料庫

在MariaDB程式實體下,我們可依自己的需求建立若干資料庫。就跟我們整理家裡的時候,會把清潔用品、依服、書本等分類收好的概念是一樣的。

資料表

在資料庫底下,我們通常會再依資料的性質建立若干個資料表。資料實際存放的位置,正是在資料表中。
剛剛我們說過,關聯式資料庫系統跟我們熟悉的辦公軟體Excel非常像。各位可以用下面這張Excel的工作表來理解資料表的概念。

姓名 性別 年齡
小明 170
小花 566

還有件事要特別強調。在使用Excel的時候為了方便,我們常會給工作表取名字。在MariaDB裡,每張資料表在建立的那刻一律強制取名。

欄位

接下來的部分就跟Excel有點不一樣了,畢竟資料庫系統更加的嚴謹有要求。像這邊要說的欄位(各位上網找資料時常會看到對岸的網站寫字段),指的是我們用Excel時A欄、B欄、C欄,一行一行橫向排過去的橫欄。
在建表的那刻除了要強制設定個表名,系統同時會要求我們規定每欄的標題及資料型別。需要的話,我們也同時能加上索引、約束等欄位屬性。
這造就一欄位裡的資料,資料型別統一、約束統一、索引統一、欄標題統一的現象。這是關聯式資料庫非常大的特徵,也就是很多事情都先說好了,資料處理的儘量高效就實現了。

資料

MariaDB裡的資料,是一列一列往下加進去的。我們在儲存資料時,要把想存的資料基於表欄位來放置。
這樣講太玄太空,我們用上面的那張表來舉例。當我們要紀錄一群人的資料時,我們想說可能要紀錄姓名、性別、年齡等,我們在創表時就定義好這三個欄位。手邊有人的資料要存資料庫時,我們得把這個人的姓名、性別、年齡分別放進對應的欄位中才算儲存完畢。往後繼續有小李、小張、小雯等的資料,我們也是繼續用這樣的方式來存。

MariaDB中所謂的值,接近我們在Excel裡說的A1、C9、F20。只不過在資料庫系統上,我們的描述會更嚴謹。同樣以上面的表為例,我們會說在姓名為小明的這筆資料中,欄位姓名的值為小明、欄位年齡的值為170。

欄位屬性

在剛剛的小節中,我們有特別講解過欄位的概念。往後我們操作資料庫系統,編寫的指令幾乎都會有欄位的片段。而除了資料型別及名稱,我們得再多瞧瞧幾個欄位相關知識。如果到專業的開發團隊裡搞資料庫,我們常會聽到別人討論以下專有名詞。

約束

我們建好資料庫跟資料表了,別人隨時可以來創建新資料、刪除資料、更新資料及看資料。資料庫的世界裡把以上典型動作稱增刪改查(crud)。問題來了,別人增、刪、改資料時如果把資料弄亂了怎麼辦?
曾在工作中實際應用Excel過的朋友一定知道小弟在說什麼,這個時候可就完了。我們得找人或我們自己上,幾個晝夜下來不停的調整排版比對資料,邊做邊問候一圈那個把表弄爛同事的爸媽祖先。
為了完全避免這種恐怖的事,關聯式資料庫普遍有約束的功能。所謂的約束,指的就是一欄位中資料應符合的條件。一旦系統發現有人誤操作把資料弄得不合約束就會報錯回滾並停止執行。
怎麼樣!這個功能厲害吧?不然資料庫中隨隨便便就幾千萬幾億筆資料在存,沒這個功能又有人把資料弄壞時大家還不打爆他(汗)。常見的約束有:

  • 主鍵約束:任何一張表在建立時絕對要指定一個主鍵約束的欄位,系統會自動依欄位中的值來對資料排序或方便我們執行跨表查詢。
  • 非空約束:該欄位中一定要存資料
  • 預設值約束:使用者儲存資料時若未指定值,系統會自動把預設值填入。
  • 唯一約束:本欄位中的所有資料都不可重複。
  • 外鍵約束:本欄位的值跟其他表的某欄位互有參照且為某表中的主鍵約束值,不許任意更動。這個講起來舌頭都快纏住了,所以各位其實可以儘量不要用他。實際上,使用外鍵約束也同時會拖慢資料庫系統的運作速度。

索引

這個地方各位可先想想,我們日常生活中何時會出現跟索引有關的情形?大概就看書翻資料時,書本資料的頁數吧!又或者是我們瀏覽網頁時,會用NVDA的單鍵導覽對吧?這些東西為什麼會存在呢?其實也就是讓我們能更快速的掌握資料,儘快清楚我們手上資料的內容。
MariaDB的索引也是這樣的功能。當系統執行撈取資料的指令時,搜尋有建索引的資料會快於沒有索引的資料。好比有人看資料時從頭到尾硬啃,比起照頁數依標題找資料的速度般。常見的索引有:

  • 一般索引index
  • 唯一索引unique

基本指令

廢話了這麼大一段,終於來到最有趣、能動手玩玩的地方了。我們在這邊要來試試:

  • 登入
  • 登出
  • 狀態檢視
  • 執行SQL腳本
  • 結果輸出

登入

這個部分的內容在前面我們測試安裝的時候已經有點偷跑了,就是「mysql -uroot」。

C:\>mysql -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.12-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

當然了!既然叫作登入,我們應該可以用帳號密碼進到資料庫才對。各位先別急,基本的資料庫權限設定後面會專門開一篇教學詳述。我們只要先知道,全新安裝的MariaDB預設有個最高權限的帳號叫root且沒有密碼就行了。

登出

這個地方我們前面也有偷跑,指令為「exit」或「\q」。

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.12-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> exit
Bye
C:\>

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.12-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> \q
Bye
C:\>

狀態檢視

不管是什麼系統軟體,或多或少都會有個介面告訴我們目前的執行狀態、版本等的基本資訊。MariaDB也有且相當好用,也跟各位分享分享。指令為「\s」!

MariaDB [(none)]> \s
--------------

Connection id:		8
Current database:	
Current user:		root@localhost
SSL:			Not in use
Using delimiter:	;
Server:			MariaDB
Server version:		10.4.12-MariaDB mariadb.org binary distribution
Protocol version:	10
Connection:		localhost via TCP/IP
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
TCP port:		3306
Uptime:			1 min 7 sec

Threads: 7  Questions: 4  Slow queries: 0  Opens: 16  Flush tables: 1  Open tables: 10  Queries per second avg: 0.059
--------------

MariaDB [(none)]>

執行SQL腳本

先預告一下,關聯式資料庫有個被人罵得很凶的缺點:指令又臭又長不好下。等學到後面各位立馬就有感覺了,到時候必定會起笑並希望能不能像寫劇本那樣先把要下的指令全弄進一個檔案裡。確定檔案中的指令沒問題後,再一口氣丟給資料庫執行就好了呢?
開發MariaDB的大牛們也有幫我們想到這個問題,特別準備了「.」這個指令。假設我們準備了個純文字檔「C:\command.sql」並在其中編寫好了指令,如果要執行就像下面這樣下指令就可以了。

MariaDB [(none)]> \. C:\command.sql

結果輸出

在上面檢視狀態的地方不知有沒有人發現個bug?狀態資訊太多了,NVDA沒有辦法在命令列上完全讀清楚。有沒有什麼好辦法能把資料庫系統的運作過程輸出到一個檔案裡,我們直接跑進那個檔案瞧執行結果就ok了?
真不巧,這個問題那群大牛也有想到。資訊人活著實在是太有價值了,各種想辦法解決問題順便設法偷懶XDDDD。各位可試試指令「\T」,假設我們希望檔案存在「C:\out.txt」。

MariaDB [(none)]> \T C:\out.txt
Logging to file 'C:\out.txt'

費了九牛二虎之力,至此我們終於把資料庫裝好、基本觀念掌握好了。如果讀者您對資料庫的管理確實是有興趣的,看完之後千萬要多練習。尤其是這種進階技術,就更得如此了。
記得有個神部落格《鳥哥的Linux私房菜》裡的文章有句話:要看多少遍才會?對曰:永遠都看不會。得實作、實作、實作。
從下一篇教學起,我們可就要正式進入以SQL語言操作資料庫的部分了。敬請期待!

※最後更新時間:2021-09-04 18:45:00 From:219.70.166.106 By:Dack
※最後更新時間:2021-09-04 18:47:34 From:219.70.166.106 By:Dack
※最後更新時間:2021-09-04 22:56:11 From:219.70.166.106 By:Dack
※最後更新時間:2021-09-12 07:44:30 From:219.70.166.106 By:Dack

留言

#1

此篇留言已被刪除。

#2

阿慶

阿慶圖像

2021-09-04 19:03:39

From:219.91.55.9

有些語法應該是不小心被 markdown 吃掉了。
比如 \. 的反斜線就不見了。
另外,這個執行檔案的原本指令式 source,比如 source C:\command.sql;
還有,把訊息紀錄到檔案的 \T 原本指令式 tee,比如 tee C:\out.txt;
要停止紀錄,可輸入 \t 或者 notee;
最後,顯示狀態的 \s 緣有指令叫做 status;
補充:如果要顯示指令、程式碼,或是畫面的完整輸出,而避免被 markdown 轉譯,可以用反單引號 (`) 包起來,
如果是區塊文字,就用三個反單引號 (```) 包起來,前後要空行。
詳細語法可見至頂文章的本站 markdown 說明。

#3

Dack

Dack圖像(預設)

2021-09-04 22:57:07

From:219.70.166.106

感謝補充,已試著修正錯誤

#4

特種兵

特種兵圖像(預設)

2021-09-06 09:49:55

From:211.23.21.202

這兩句好像少了什麼?
好比有人看資料時從頭到尾硬啃,比起照頁數依標題找資料的速度般。
另外,感覺怎麼這篇突然就結束了。

#5

Dack

Dack圖像(預設)

2021-09-08 05:16:25

From:219.70.166.106

晚輩詞窮,實在想不到有什麼更貼切的說法來表達有索引比沒索引快。然後也不能用過頭,不然會壞掉

#6

Dack

Dack圖像(預設)

2021-09-08 05:16:46

From:219.70.166.106

另外郭老師說的是,好像確實有點這樣的feeling。晚輩來想想點結語,沒想到您也喜好閱讀有溫度的文章。讚

#7

特種兵

特種兵圖像(預設)

2021-09-09 10:00:37

From:211.23.21.202

我是都可以,只是按照你的行文風格,好像少了點什麼而已

#8

Dack

Dack圖像(預設)

2021-09-10 22:36:31

From:219.70.166.106

XD