MySQL 教學 : 你應該知道的資料庫知識


什麼是MySQL?

MySQL是一種關聯式資料庫管理系統(RDBMS),它使用了SQL(Structured Query Language, 結構化查詢語言)作為其主要的數據操作語言。MySQL是一種開源的關聯式資料庫管理系統,所以任何人都可以免費使用,是Web開發中最常用的資料庫之一。

MySQL的開發始於1995年,由瑞典的MySQL AB公司進行開發,最初的目標是提供一款快速、穩定且易於使用的資料庫系統。 2008年,MySQL AB公司被Sun Microsystems以約十億美元收購。然後在2010年,Sun Microsystems公司又被Oracle公司收購,因此MySQL現在是Oracle公司的產品。

至於什麼是關聯式資料庫管理系統(RDBMS,Relational DataBase Management System)? 他是一種組織資料的方式,其中資料被存儲在稱為表格(tables)的結構中。每個表格由行(rows)和列(columns)組成,其中每行表示一個數據記錄,每列代表一種數據類型。並且使用關聯鍵來建立資料表之間的關聯,關聯鍵是一個或多個欄位的組合,用於建立表與表之間的關聯。通常關聯鍵有兩種常見的類型:主鍵(Primary Key)和外鍵(Foreign Key)。

關聯模式的五大鍵 Super key、Candidate Key、Primary Key、Alternate Key、Foreign Key : https://www.mysql.tw/2015/04/super-keycandidate-keyprimary.html

例如A表格中的某個[外鍵]欄位關連到B表格中的某個[主鍵]欄位,這樣就會形成關聯式資料庫所稱的關聯。以課程資料表格為例,某課程資料表中會有一個開課科系代號的欄位(在此資料表扮演外鍵的角色),會關聯到科系資料表的科系代號的欄位(在此資料表扮演主鍵的角色),如此課程資料表中的課程就可以知道是哪個科系開課 (如下圖)。


關聯的種類有以下幾種 : 

多對1 : 如上面例子,多個課程可以關聯到一個科系,或是多個學生可以關聯到一個科系。
1對1 : 每一個人只能關聯到一個身分證字號、每一個身分證字號只能關聯到一個人。
1對多 : 每一個人可以關聯到多個行動電話號碼,或是每一個科系可以關聯到多個學生。
多對多 : 兼任教師可以關聯到多個科系,科系也是可以關聯到多個兼任教師。

如果是專任教師就只能關聯到一個科系,但是科系可以關聯到多個專任教師,所以專任教師與所屬科系的關聯就是多對1。但是如果你是定義專任教師與授課科系,其關聯就可以是多對多關係,因為一個專任教師(多)可能會在多個科系(多)中教授課程,同時,一個科系也可能有多個專任教師。

那麼夫妻關係是1對1嗎? 因為可能有人是單身,這樣算不算是1對1呢? 如果是單身,頂多夫妻配偶欄空白,所以夫妻關係是1對1的 (以台灣法律來說)。

通常,1對1的關聯就可能是一個資料表單裡面的兩個欄位 (例如身分證字號與健保卡號),或是兩個資料表單以[外鍵和主鍵]形成關聯 (例如兩人的夫妻關係);多對1或是1對多就會是兩個資料表單以[外鍵和主鍵]或是以[主鍵和外鍵]形成關聯;多對多就會在兩個資料表單之外,另外產生一個中間的資料表單來形成關聯,也就是由三個表單形成多對多的關聯。

練習 : 請設計課程與科系的資料表單。(多對1)
練習 : 請設計兼任教師與科系的資料表單。(多對多)
練習 : 請設計夫妻關係的資料表單。(1對1)
練習 : 請設計科系與學生的資料表單。(1對多)

既然有「關聯式資料庫」,那麼有沒有「非關聯式資料庫」呢? 

非關聯式資料庫 (或 NoSQL 資料庫) 會使用各種資料模型來存取和管理資料。這些資料庫會透過放寬傳統關聯式資料庫的一些資料一致性限制,特別針對需要大量資料、低延遲和彈性資料模型的應用程式進行優化。

非關聯式資料庫類型有 : 鍵值資料庫、文件資料庫、圖形資料庫等。

關於鍵值資料庫(Key–value database),可以參考 : 快速認識4類主流NoSQL資料庫 https://www.ithome.com.tw/news/92507

資料庫有多少種? 為何要學習MySQL?

著名的關聯式資料庫如下 : 

Oracle : 甲骨文公司主要產品為資料庫伺服器,目前的穩定版本為Oracle Database 19c。 

MySQL : 目前也是甲骨文公司的產品,區分為商業版本及社群版本,社群版本維持免費。

MariaDB : 與MySQL高度相容,由MySQL的原始開發者Michael  Widenius主導開發,由於開源並免費,因此許多組織都從MySQL移植到MariaDB,例如維基媒體基金會的伺服器同樣也於2013年使用MariaDB取代了MySQL。

PostgreSQL : 雖然是關聯式資料庫,但是具有物件導向的繼承功能,因此也被許多商業應用軟體採用。

Microsoft SQL Server : 是由美國微軟公司所推出的關聯式資料庫解決方案,目前最新版本為SQL Server 2022

IBM DB2 : 是美國IBM公司發展的一套關聯式資料庫管理系統,號稱是雲端原生資料庫。

SQLite : 雖然也是關聯式資料庫,但不是一個客戶端/伺服器結構的資料庫引擎,而是被整合在使用者程式中,較適合使用在嵌入式設備及物聯網。

Amazon Redshift : 由PostgreSQL而來,是一款網際網路代管服務和資料倉儲產品,是大型雲端運算平台亞馬遜雲端運算服務的一部分。

著名的非關聯式資料庫如下 : 

MongoDB : 是一種文件導向的資料庫管理系統,是一種靈活、易於擴展、高效能的NoSQL資料庫,提供了可以跟SQL相比的Query Language(查詢語言),同時也是Open Source的NoSQL DB,在許多場景下可用於替代傳統的關聯式資料庫儲存方式。

Apache Cassandra : 是一套開源分散式NoSQL資料庫系統,最初由Facebook開發,用於改善電子郵件系統的搜尋效能的簡單格式資料,集Google BigTable的資料模型與Amazon Dynamo的完全分散式架構於一身。

Redis : 是一個使用ANSI C編寫的開源、支援網路、基於記憶體、分散式、可選永續性的鍵值對儲存資料庫。根據月度排行網站DB-Engines.com的資料,Redis是最流行的鍵值對儲存資料庫。

這麼多種資料庫,為何我們需要學習MySQL/MariaDB呢? 主要是因為開源、穩定,並且許多開源的應用軟體都使用MySQL/MariaDB。

MySQL的主要功能和特點包括: 

(1)開源 : MySQL是開源的,這意味著任何人都可以免費使用和修改其源代碼。

(2)高性能 : MySQL有優秀的數據庫引擎,可以提供高效能的資料庫搜尋和存取能力。

(3)可擴展性 : MySQL可以處理包含極大量數據的大型資料庫,理論上可支援無限制的數據量。

(4)支援大量的數據類型 :  MySQL支援多種數據類型,包括數值、日期和時間、字符串等。

(5)安全性 : MySQL提供了多種安全功能,包括密碼保護,IP地址限制,和SSL加密。提供了一套安全保護機制,用戶可以設定對不同的資料庫、表、數據列的權限。

(6)支援多種作業系統 : MySQL可以在許多不同的平台上運行,包括Windows,Linux和Mac OS。

(7)語言支援:MySQL支援多種程式語言,如C,C++,Python,Java,Perl,PHP等。

(8)靈活的數據庫引擎選擇: MySQL支援多種數據庫引擎,包括InnoDB(提供交易安全性)和MyISAM(提供高速讀取和全文搜尋)等。

(9)易於管理: MySQL提供了多種管理工具,包括命令行工具和GUI工具(如MySQL Workbench)。 

(10)廣泛的應用: MySQL被用於許多不同的應用中,從嵌入式應用到網路應用,從個人網站到大型企業應用。

MySQL免費版本參考網址 : MySQL Community Edition


關聯式與非關聯式資料庫主要差異是什麼?

關聯式和非關聯式資料庫存放和管理資料的方式完全不同 : 

結構 : 關聯式資料庫以表格格式存放資料,並遵循有關資料變化和資料表關係的嚴格規則。關聯式資料庫可讓你處理結構化資料的複雜查詢,同時維護資料完整性和一致性。對於需求不斷變化的資料,非關聯式資料庫更具彈性和實用性~可以使用其來存放影像、影片、文件和其他半結構化和非結構化內容。

資料完整性機制 : 關聯式資料庫模型遵循嚴格的 ACID 屬性,非關聯式資料庫可保證可用性,但不保證立即一致性。資料庫狀態可能會隨著時間而變更,並最終實現一致性。某些非關聯式資料庫可能會提供效能或其他權衡取捨方面的 ACID 合規性。

效能 : 關聯式資料庫的效能取決於其磁碟子系統。若要提升資料庫效能,您可以使用 SSD,並使用獨立磁碟備援陣列 (RAID) 來最佳化磁碟。若要取得最佳效能,您還必須最佳化索引、資料表結構和查詢。NoSQL 資料庫的效能視網路延遲、硬體叢集大小和呼叫應用程式而定。

擴展 : 關聯式資料庫系統的擴展性不如NoSQL 資料庫,您可以更輕鬆地將其工作負載分配到多個節點上。這些資料庫處理大量資料的方式是,將其分區為較小的集合並跨多個節點分配集合。

參考資料 : https://aws.amazon.com/tw/compare/the-difference-between-relational-and-non-relational-databases/


什麼是MariaDB?

MariaDB是一種開源的關聯式資料庫管理系統(RDBMS),由MySQL的原始開發者Michael  Widenius主導開發,並以他的女兒Maria的名字命名。 MariaDB的開發始於2009年,當時Oracle公司收購了Sun Microsystems公司(當時的MySQL所有者)。由於擔心Oracle可能會停止MySQL的開源開發,一部分MySQL的原始開發者和社區成員決定創建這個新的分支。他們的目標是保證這種新的資料庫系統完全開源,並且和MySQL完全兼容,包括API和命令行,使得從MySQL遷移到MariaDB變得相對容易。

MariaDB參考網址 : https://mariadb.org/download/


MySQL與MariaDB的差異是什麼?

(1)開發和所有權:MySQL現在由Oracle公司擁有和維護,而MariaDB是由原始MySQL開發者的MariaDB基金會維護。 

(2)開源性質:兩者都是開源的,但MariaDB更強調其開源的本質。MariaDB基金會承諾MariaDB永遠保持開源,而MySQL則有免費的社區版和付費的企業版。 

(3)相容性:MariaDB旨在保持與MySQL的相容性。理論上,你可以將MySQL服務器無縫替換為MariaDB服務器。 

(4)功能和擴展性:MariaDB包含一些MySQL沒有的功能和擴展,比如更多的存儲引擎(如Aria, ColumnStore, Sphinx等)和功能(如進階的聯合索引)。 

(5)版本發布:MariaDB的發布節奏通常比MySQL快,它經常提供新的功能和優化。 

(6)性能:雖然兩者在許多情況下的性能相當接近,但在某些特定的工作負載下,一個可能會比另一個表現得更好。具體的性能可能會根據你的具體應用和硬體配置而變化。 

(7)JSON 資料處理 : 兩者均支援 JSON 資料的擷取和存放,但是 MariaDB 將 JSON 報告存放在字串中 (Longtext),而 MySQL 則將其以二進位物件存放。這樣的差別是,MySQL在處理JSON 資料的效能會比較好一些。

MariaDB/MySQL JSON參考資料 : https://mariadb.com/kb/en/json-data-type/

(8)使用者身份驗證 : MySQL 具有 validate_password 元件來進行身份驗證,而MariaDB則提供三個驗證程式外掛程式來為保護密碼。

(9)執行緒集區 : MariaDB 能夠一次管理超過 200,000 個連線,MySQL 在企業版本中提供了一個執行緒集區外掛程式。但是它無法像 MariaDB 一樣處理那麼多的連線。

(10)加密 : 兩者都提供靜態資料加密和傳輸中資料加密。MySQL使用InnoDB和AES加密靜態資料,MariaDB支援temporary log encryption 以及 binary log encryption。不過以上加密差異說明並不是太清楚,這部分的實際差異是什麼,我還需要實作才能說明這兩者再加密的真正意思。

參考資料 : https://aws.amazon.com/tw/compare/the-difference-between-mariadb-vs-mysql/


我應該使用MySQL還是MariaDB?

由於MySQL與MariaDB支援的存儲引擎(storage engines)有差異,如果你對存儲引擎有特殊需求,需要特別注意。

NDB (MySQL Cluster) 只用在MySQL,MariaDB並不支援 : 
https://mariadb.com/kb/en/ndb-in-mariadb/
MariaDB存儲引擎參考資料 :
https://mariadb.com/kb/en/storage-engines/


如何開始使用MySQL/MariaDB?

(1)使用MySQL

步驟一 : 下載 MySQL並依照指示安裝 https://dev.mysql.com/downloads/mysql/

下載安裝參考網址 : https://ithelp.ithome.com.tw/articles/10259766

步驟二 : 開啟 MySQL Workbench以介面模式開始使用,或是進入DOS指令模式使用。

MySQL Workbench參考網址 : https://ithelp.ithome.com.tw/articles/10215161

MySQL DOS指令模式參考網址 : https://dev.mysql.com/doc/refman/8.0/en/mysql.html

(2)使用MariaDB

步驟一 : 下載 MariaDB並依照指示安裝 https://mariadb.org/download/

下載安裝參考網址 : https://ithelp.ithome.com.tw/articles/10194334

步驟二 : 使用HediSQL/Xampp以介面模式開始使用,或是進入DOS指令模式使用。

HediSQL參考網址 : https://ithelp.ithome.com.tw/articles/10193251

XAMPP參考網址 : https://www.mysql.tw/2023/03/xampp-mysql-mariadb.html


如何學習MySQL語法?

要練習MySQL語法,有哪些方式可以練習? 大致有以下幾種方式 :

(1) 使用線上免費的MySQL編譯平台。

例如
https://onecompiler.com/mysql
https://paiza.io/en/languages/mysql

(2) 如前面所說的去安裝MySQL/MariaDB在自己電腦上。

https://www.mysql.com/
https://mariadb.org/

(3) 使用XAMPP之類的整合平台,安裝在自己電腦上。

例如
https://www.apachefriends.org/zh_tw/download.html
https://www.easyphp.org/

(4) 使用線上免費的MySQL資料庫代管。

例如
https://freedb.tech/
https://www.db4free.net/
https://www.freemysqlhosting.net/

(5) 使用附帶MySQL資料庫的免費網站代管。

例如
https://infinityFree.net
https://www.000webhost.com
https://byet.host/free-hosting/news

有了語法的執行平台之後,再來就是不斷的練習各種情況的語法囉。

參考網址 :
如何學習SQL語法? 該學習MySQL或是MS SQL? 
SQL的四種類型DDL/DML/DCL/TCL
SQL commands of DML
SQL commands of DDL
SQL 指令大全
SELECT SQL語法總整理
SQL SELECT語法整理
SELECT : 從資料表中擷取資料
資料表單的運算
資料表的運算 (續)
關聯式代數(Relational Algebra) ~ 實作


學習MySQL要做什麼?

資料庫是應用系統很重要的部分,因為每個應用系統都會有資料需要儲存。而資料庫不會憑空出現,必須了解應用系統需要儲存什麼資料,然後根據需求來設計「資料庫的結構」,然後才能使用MySQL語法來處理資料庫的資料。

參考網址 :
Database Design
什麼是DFD (Data Flow Diagram 資料流程圖) ?
實體關係模型(Entity-relationship model)
如何將ERD轉換為邏輯資料?
資料庫正規化 Database normalization
資料庫正規化 (normalization)
Data Modeling (資料塑模) : 概念塑模、邏輯塑模、實體塑模

最後就是不斷的實作 !!

實作 : 練習SELECT、INSERT INTO、UPDATE、DELETE FROM以及Trigger的使用
實作練習 (續) SQL command的SELECT用法
實作測驗 ~ 正規化 + SELECT
實作 : 練習使用Stored Procedure以及Stored Function
從ER Model到資料庫的實作練習
資料庫正規化實作練習
UML的使用案例圖、活動圖、類別圖練習 ~ 以網路選課為例
實作練習~ SELECT
實作 ~ 選課系統
實作練習 ~ 建立資料表及PHP連線
實作練習 (再續) ~ 建立資料表及語法操作
實作測驗#2 ~ 正規化 + SELECT
實作練習~公司員工訂餐系統
Data Flow Diagram (DFD) 與 Entity Relationship Diagram (ERD) 實作練習
實作 : 網路選課系統如何判斷衝堂
實作 : 工讀生薪資管理系統

張貼留言

0 留言