1. 程式人生 > >MySQL資料庫基礎詳解

MySQL資料庫基礎詳解

文章大綱

一、資料庫簡介
二、Mysql資料庫簡介
三、Mysql安裝與服務啟動(Windows版本)
四、Mysql圖形化工具
五、Mysql儲存引擎精講
六、Mysql資料型別介紹
七、Mysql主要專業名稱介紹
八、Mysql常見sql語句
九、Mysql設計與語句優化
十、事務介紹
十一、Mysql資料庫備份與恢復
十二、Mysql分庫分表
十三、Mysql許可權管理
十四、Mysql資料庫之阿里雲
十五、資料下載
十六、參考文章

 

一、資料庫簡介

1. 資料庫是什麼

  資料庫是資料管理的有效技術,是由一批資料構成的有序集合,這些資料被存放在結構化的資料表裡。資料表之間相互關聯,反映客觀事物間的本質聯絡。資料庫能有效地幫助一個組織或企業科學地管理各類資訊資源。

  資料是資料庫中儲存的基本物件,是按一定順序排列組合的物理符號。資料有多種表現形式,可以是數字、文字、影象,甚至是音訊或視訊,它們都可以經過數字化後存入計算機。
  資料庫是資料的集合,具有統一的結構形式並存放於統一的儲存介質內,是多種應用資料的整合,並可被各個應用程式所共享。
  在日常生活中,人們可以直接用中文、英文等自然語言描述客觀事物。在計算機中,則要抽象出對這些事物感興趣的特徵,並組成一個記錄來描述。

2. 資料庫在開發中的作用

  從資料庫系統應用角度來看,資料庫系統常見的執行與應用結構有:客戶端/伺服器結構、瀏覽器/伺服器結構。

  在客戶端/伺服器(Client/Server,C/S)結構中,資料庫的使用者(如 DBA、程式設計者)通過命令列客戶端、圖形化介面管理工具或應用程式等連線到資料庫管理系統,可以通過資料庫管理系統查詢和處理儲存在底層資料庫中的各種資料。
  資料庫使用者與命令列客戶端、圖形化介面管理工具或應用程式等直接互動,而不與資料庫管理系統直接聯絡。
  在這種結構中,命令列客戶端、圖形化介面管理工具或應用程式等稱為“客戶端”或“前臺”,主要完成與資料庫使用者的互動任務;而資料庫管理系統則稱為“伺服器”或“後臺”,主要負責資料管理。這種結構經常被稱為“C/S”結構。
  在客戶端/伺服器模式中,客戶端和伺服器可以同時工作在同一臺計算機上,這種工作方式稱為“單機方式”;也可以“網路方式”執行,即伺服器被安裝和部署在網路中某一臺或多臺主機上。
  對於客戶端應用程式的開發,目前常用的語言工具主要有 Visual C++、Delphi、.NET 框架、Visual Basic、Python 等。
  資料庫能有效儲存資料,讀取資料、查詢資料更是方便,其實那些管理軟體就是通過軟體的介面向內部的資料庫進行資料的增、刪、改、查操作。

3.常見資料庫比較

3.1 MySQL資料庫
定位
開源、多平臺、關係型資料庫
目前使用最廣泛、流行度最高的的開源資料庫。

功能
支援事務,符合關係型資料庫原理,符合ACID,支援多數SQL規範,以二維表方式組織資料,有外掛式儲存引擎,支援多種儲存引擎格式

部署
用編譯安裝的方式,或者二進位制包的方式,按照“安裝軟體-建立例項-庫表使用者初始化”,可以很快完成資料庫部署

使用
使用標準的SQL語句進行資料庫管理,簡單SQL語句的併發和效能較好,對檢視、儲存過程、函式、觸發器等支援的不是太好

監控
在命令列介面有一些常用的命令顯示狀態和效能,在圖形介面方面,有比較多的開源監控工具來監控和記錄資料庫的狀態,比如zabbix,nagios,cacti,lepus等

備份
邏輯備份 mysqldump/mysqldumper ,物理備份 用xtrabackup等工具進行備份;

高可用
MySQL高可用有多種方案,官方有基礎的master-slave主從複製,新版本的innodb cluster,第三方的有MHA等高可用方案;

擴充套件
MySQL水平拆分,可以通過水平拆分proxy中間進行邏輯對映和拆分,擴大MySQL資料庫的併發能力和吞吐量。

適用場景
預設的innodb儲存引擎,支援高併發,簡單的絕大部分OLTP場景;
Tokudb儲存引擎,使用高併發insert的場景;
Inforbright儲存引擎,可以進行列壓縮和OLAP統計查詢場景;

選擇注意
使用MySQL進行OLTP業務時,需要注意資料量級,如果資料量級過大,需要進行水平拆分;
如果有OLAP需求,可以結合其他架構綜合考慮。

3.2 SQL Server資料庫
定位
商業、Windows平臺、關係型資料庫
最早接觸、與微軟體系結合緊密的的商業資料庫,屬於“微軟技術體系”

功能
支援事務,符合關係型資料庫原理,符合ACID,支援多數SQL規範,以二維表方式組織資料

部署
在Windows平臺,用圖形介面進行軟體安裝;

使用
在Windows平臺,使用SQL Server Mangement Studio圖形介面進行安裝;

監控
一般通過Windows資源管理和SQL server圖形工具進行系統和資料庫效能顯示;

備份
通常用第三方備份恢復軟體進行備份恢復;

高可用
通過共享儲存和雙機熱備的方式,可以實現SQL Server資料庫的高可用;

擴充套件
SQL Server資料庫叢集採用共存儲存的方式,通過硬體垂直升級來對資料庫叢集進行擴充套件;

適用場景
大多數OLTP場景(與微軟體系配合)

選擇注意
SQL Server與微軟技術體系結合比較緊密,絕大多數工作,都是通過圖形介面完成,對於習慣使用命令列的DBA可能會有不習慣;
SQL server對雙引號,大小寫,元資訊的管理和處理方式,與其他資料庫很不相同,需要注意;
使用SQL Server滿足OLTP業務,會有比較好的效果,但對於大資料量的OLAP業務,最好還是選用專門的OLAP架構,不要在同一個SQL Server例項上混用OLTP和OLAP業務;
SQL server屬於商業軟體,需要注意版權和licence授權費用;

3.3 Oracle資料庫
定位
商業、多平臺、關係型資料庫
功能最強大、最複雜、市場佔比最高的商業資料庫

功能
支援事務,符合關係型資料庫原理,符合ACID,支援多數SQL規範,以二維表方式組織資料

部署
Oracle單例項資料庫部署相對容易,但Oracle RAC叢集環境,部署的步驟和依賴條件都比較多;

使用
通常使用命令列工具,進行各種資料庫的管理,通常也可以用shell指令碼和python指令碼提高Oracle資料庫管理效率;各種管理功能,都比較強大;

監控
Oracle官方有比較全面的監控工具,常用的第三方監控平臺,如zabbix,cacti,lepus等都有對Oracle資料庫的各項指標的完善監控;

備份
支援冷備份和熱備份,可以用 exp/imp , expdp/impdp等進行邏輯備份和恢復,可以使用強大的RMAN工具進行專業的物理熱備份和恢復;

高可用
Oracle資料庫的高可用架構,可以用第三方雙機熱備軟體,結合Oracle單例項實現;可以使用Oracle Dataguard,實現master和standby的備份;可以使用 Oracle RAC叢集實現例項級別的高可用和負載均衡,使用ASM實現儲存級別的高可用;

擴充套件
由於Oracle叢集採用共享儲存的方式,一般只能通過垂直硬體升級進行升級;

適用場景
絕大多數OLTP場景,部分OLAP

選擇注意
Oracle從架構到運維,可以說是最難的資料庫,學習和使用難度較高。

3.4 Hbase資料庫
定位
開源、Linux平臺、列儲存nosql資料庫
可用於海量資料儲存、與Hadoop生態圈結合、定位於“大”的列儲存nosql資料庫

功能
命令執行速度非常看,讀寫效能可達10萬/秒;資料結構是key-value類似字典的功能,可以鍵過期-快取,釋出訂閱-訊息系統,簡單的事物功能;

部署
相對其他資料庫,hbase的部署比較複雜,依賴Hadoop,zookeeper等元件,Hbase叢集包括一個mater節點,多個regionServer,zookeeper管理所有regionServer,需要依次部署Hadoop、zookeeper之後,再部署HBASE叢集;

使用
用redis-cli客戶端連線,一般用簡單的 set ,get,del 進行資料管理; 在單例項redis的基礎上,進行可以資料持久化,主從複製,高可用和分散式等功能;

監控
在命令列介面有一些常用的命令顯示狀態和效能,在圖形介面方面,有開源監控工具來監控和記錄資料庫的狀態,比如cachecloud;

備份
Hbase一般用作海量資料的倉庫,本身通過多層副本來保證資料安全性,不用進行專門的備份

高可用
HBASE叢集基於Hadoop,需要依次部署Hadoop單機模式、叢集模式、HA模式,通過Hadoop HA實現高可用;

擴充套件
HBASE以叢集形式,依次是單機模式,偽分佈模式,完全分佈模式,底層基於HDFS,zookeeper可以很好地進行擴充套件;

適用場景
兩大用途:
用於簡單資料寫入和海量、結構簡單資料查詢的業務場景;
用於成為其他資料庫備份和下沉的資料庫;

選擇注意
Hbase不適合的場景:對資料分析需求高,需要能夠用sql或者簡單的MapReduce實現分析需求的業務場景,不適合用Hbase;
單表資料量,不超過千萬時,使用Hbase,體現不出Hbase的優勢,而且會比較慢,不適合用Hbase。
通過對上面資料庫“七種”武器的描述,也可以看到目前常用資料庫的使用脈絡和選擇順序,對應一個業務,可以優先選擇最流行的開源資料庫——MySQL;如果出於穩定和商業版考慮,可以選擇Oracle資料庫,或者SQL Server資料庫(與Windows體系結合);如果想用開源,有想要有足夠的功能來應對各種場景,可以使用 postgresql資料庫。這四種資料庫,都是關係型資料庫,可以很好地滿足大多數業務場景,解決通用性問題。
對於一些特殊性問題,尤其是想要在擴充套件性方面有比較高的要求,可以考慮nosql資料庫。Mongodb資料庫,介於關係型資料庫和非關係型資料庫之間,兼具兩者的特點,是非常流行的文件型nosql資料庫;redis定位於記憶體型鍵值nosql資料庫;hbase是海量檔案儲存的列式nosql資料庫。根據合適的業務場景,選擇適合的nosql資料庫,可以對某一類,或某幾類業務問題有很好的解決,可以作為關係型資料庫的一種補充。
換個角度,MySQL,Oracle,SQL Server,Postgresql,mongodb這五種資料庫,也是DB-Engines排行榜上最流行的排名前五的五種資料庫,從使用量和受歡迎程度,也可以看出這些資料庫使用的廣泛性。

4. 資料庫常見功能

 

二、Mysql資料庫簡介

1. MySQL的優勢

  MySQL 使用的 SQL 語言是用於訪問資料庫的最常用的標準化語言。
  由於 MySQL 資料庫體積小、速度快、總體擁有成本低、開放原始碼,其有著廣泛的應用,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。由於其社群版的效能卓越,因此搭配 PHP 和 Apache 伺服器可組成良好的開發環境。
  MySQL 資料庫管理系統具有以下系統特性:
(1) 使用 C 和 C++ 編寫,並使用多種編譯器進行測試,保證原始碼的可移植性。
(2)支援 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows 等多種作業系統。
(3)為多種程式語言提供了 API。這些程式語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
(4)支援多執行緒,充分利用 CPU 資源。
(5)優化的 SQL 查詢演算法,有效地提高查詢速度。
(6)既能夠作為一個單獨的應用程式應用在客戶端伺服器網路環境中,也能夠作為一個庫而嵌入其他的軟體中。
(7)提供多語言支援,常見的編碼如中文的 GB 2312、BIG 5,日文的 Shift_JIS 等都可以用作資料表名和資料列名。
(8)提供 TCP/IP、ODBC 和 JDBC 等多種資料庫連線途徑。
(9)提供用於管理、檢查、優化資料庫操作的管理工具。
(10)支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
(11)支援多種儲存引擎。

2. MySQL的版本以及版本號

針對不同的使用者,MySQL 分為兩個版本:
(1)MySQL Community Server(社群版):該版本完全免費,但是官方不提供技術支援。
(2)MySQL Enterprise Server(企業版):該版本能夠以很高的價效比為企業提供資料倉庫應用,支援 ACID 事物處理,提供完整的提交、回滾、崩潰恢復和行級鎖定功能,但是該版本需要付費使用,官方提供電話技術支援。
溫馨提示:MySQL Cluster 主要用於架設群伺服器,需要在社群服務或企業版的基礎上使用。

MySQL 的命名機制由 3 個數字和 1 個字尾組成,例如 mysql-5.7.20:
第 1 個數字“5”是主版本號,用於描述檔案的格式,所有版本 5 的發行版都有相同的資料夾格式。
第 2 個數字“7”是發行級別,主版本號和發行級別組合在一起便構成了發行序列號。
第 3 個數字“20”是在此發行系列的版本號,隨每次新發行的版本遞增。通常選擇已經發行的最新版本。

在 MySQL 開發過程中,同時存在多個釋出系列,每個釋出系列的成熟度處在不同階段。
MySQL 5.7 是最新開發的穩定(GA)釋出系列,是將執行新功能的系列,目前已經可以正常使用。
MySQL 5.6 是比較穩定的(GA)釋出系列,只針對漏洞修復重新發布,不增加會影響穩定性的新功能。
MySQL 5.1 是一個穩定的(產品質量)釋出系列,只針對嚴重漏洞修復和安全修復重新發布,不增加影響該系列穩定性的重要功能。
對於 MySQL 4.1 等低於 5.0 的老版本,官方將不再提供支援

3. MySQL 5.7的新特性

與 MySQL 5.6 相比,MySQL 5.7 具有以下幾個方面的新功能。
(1)隨機 root 密碼
MySQL 5.7 資料庫初始化完成後,會自動生成一個 root@localhost 使用者,root 使用者的密碼不為空,而是隨機產生一個密碼。
(2)自定義 test 資料庫
MySQL 5.7 預設安裝完成後沒有 test 資料庫。使用者可以自行建立 test 資料庫並對其進行許可權控制。
(3)預設 SSL 加密
MySQL 5.7 採用了更加簡單的 SSL 安全訪問機制,預設連線使用 SSL 的加密方式。
(4)密碼過期策略
MySQL 5.7 支援使用者設定密碼過期策略,要求使用者在一定時間過後必須修改密碼。
(5)使用者鎖
MySQL 5.7 為管理員提供了暫時禁用某個使用者的功能,使被鎖定的使用者無法訪問和使用資料庫。
(6)全面支援JSON
MySQL 5.7在伺服器端提供了一組便於操作 JSON 的函式。儲存的方法是將 JSON 編碼成 BLOB 後再由儲存引擎進行處理。這樣,MySQL 就同時擁有了關係型資料庫和非關係型資料庫的優點,並且可以提供完整的事務支援。
(7)支援兩類生成列(generated column)
生成列是通過資料庫中的其他列計算得到的一列。當為生成列建立索引時,可以便捷地加快查詢速度。MySQL 5.7 支援虛擬生成列和儲存生成列。虛擬生成列僅將資料儲存在表的元資料中,作為預設的生成列型別;儲存生成列則是將資料永久儲存在磁碟上,需要更多的磁碟空間。
(8)引入系統庫(sys schema)
系統庫中包含一系列檢視、函式和儲存過程,通過多執行緒、多程序、組合事務提交和基於行的優化方式將複製功能提高 5 倍以上,使用者向外擴充其跨商品系統的工作負載時,得以大幅提升複製的效能和效率。
與 MySQL 5.6 相比,MySQL 5.7 具有以下幾個方面的新功能。

三、Mysql安裝與服務啟動(Windows版本)

1. 下載

使用者可以根據自身的作業系統型別,從 MySQL 官方下載頁面免費下載相應的伺服器安裝包。本書以 MySQL 5.7.20 為例介紹其在 Windows 10 作業系統下的安裝和配置過程。

使用者下載 Windows 圖形化安裝包的步驟如下。

步驟 1):開啟 MySQL 官方網站(http://www.mysql.com),單擊 DOWNLOAD,進入 MySQL 產品的下載介面,如圖所示。

 

步驟 2):在 MySQL 產品分類中選擇 Community 選單,在下載列表中選擇 MySQL Community Server,如圖所示。

 

步驟3):在下載頁面中,作業系統選擇 Microsoft Windows,下載的安裝檔案為 mysql-installer-community-5.7.20.0.msi,如圖所示。

 

2. 安裝教程

Windows 平臺下提供兩種安裝 MySQL 的方式:

  • MySQL 二進位制分發版(.msi 安裝檔案)。
  • 免安裝版(.zip 壓縮檔案)。

使用者使用圖形化安裝包安裝 MySQL 的步驟如下:

步驟 1):雙擊下載的 MySQL 安裝檔案,進入 MySQL 安裝介面,首先進入“License Agreement(使用者許可證協議)”視窗,選中“I accept the license terms(我接受系統協議)”複選框,單擊“Next(下一步)”按鈕,如圖所示。

  進入MySQL安裝介面並接受系統協議

步驟 2):進入“Choosing a Setup Type(安裝型別選擇)”視窗,根據右側的安裝型別描述檔案選擇適合自己的安裝型別,這裡選擇預設的安裝型別,如圖所示。

  選擇預設的安裝型別

注意:Developer Default:預設安裝型別;Server only:僅作為服務;Client only:僅作為客戶端;Full:完全安裝;Custom:自定義安裝型別。

步驟 3):根據所選擇的安裝型別安裝 Windows 系統框架(framework),單擊 Execute 按鈕,安裝程式會自動完成框架的安裝,如圖所示。

  檢查並生成安裝所需要的框架列表

當彈出安裝程式視窗時,勾選“我同意許可條款和條件”複選框,然後單擊“安裝”按鈕,如圖所示。

  同意安裝框架的許可條件

彈出“設定成功”的介面,表示該框架已經安裝完成,單擊“關閉”按鈕即可。所有的框架安裝均可參考本操作,如圖所示。

  安裝框架成功

步驟 4):所需框架均安裝成功後,單擊 “Next(下一步)”按鈕,如圖所示。

  所有框架安裝完成

步驟 5):進入安裝確認視窗,單擊 “Execute(執行)”按鈕,開始 MySQL 各個元件的安裝,如圖所示。

  準備安裝MySQL各個元件

步驟 6):開始安裝 MySQL 檔案,安裝完成後在 “Status(狀態)”列表下顯示 “Complete(安裝成功)”,如圖所示。

  MySQL各個元件安裝成功

3. 判斷是否安裝成功

3.1 啟動與關閉服務
net start mysql為啟動服務,net stop mysql為關閉命令

 

3.2 登入資料庫
cmd進入資料庫的bin資料夾中

 

輸入mysql -u root -p命令,再輸入登入密碼,出現以下結果代表登入成功

 

3.3 檢視資料庫名稱
登入完成後,輸入show databases

 

四、Mysql圖形化工具

(1)Navicat(重點推薦)

 

Navicat是MySQL和MariaDB資料庫管理與開發理想的解決方案。它可同時在一個應用程式上連線MySQL和MariaDB資料庫。這種相容前端為資料庫提供了一個直觀而強大的圖形介面管理、開發和維護功能,為初級MySQL和MariaDB開發人員和專業開發人員都提供了一組全面的開發工具。

(2)Induction

 

Induction是一款用於理解資料關係的開源管理工具,它可用來探索行/列,執行查詢和資料視覺化等方面。該工具支援多種資料庫,包括PostgreSQL,MySQL,SQLite,Redis以及MongoDB。此外,Induction還可以通過編寫新增其他新的介面卡。

(3)SqlWave

 

SQLWave是一種簡單、快速且易用的MySQL客戶端。使用者可通過該工具輕鬆地連線到遠端主機。SqlWave支援所有MySQL的最新版本,包括它用來管理資料庫結構的所有最新功能,如工作表、檢視、儲存過程、函式、事件、外來鍵和觸發器等。

五、Mysql儲存引擎精講

1. 儲存引擎分類

  資料庫儲存引擎是資料庫底層軟體元件,資料庫管理系統使用資料引擎進行建立、查詢、更新和刪除資料操作。不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎還可以獲得特定的功能。現在許多資料庫管理系統都支援多種不同的儲存引擎。MySQL 的核心就是儲存引擎。
  提示:InnoDB 事務型資料庫的首選引擎,支援事務安全表(ACID),支援行鎖定和外來鍵。MySQL 5.5.5 之後,InnoDB 作為預設儲存引擎。MyISAM 是基於 ISAM 的儲存引擎,並對其進行擴充套件,是在 Web、資料倉儲和其他應用環境下最常使用的儲存引擎之一。MyISAM 擁有較高的插入、查詢速度,但不支援事務。MEMORY 儲存引擎將表中的資料儲存到記憶體中,為查詢和引用其他資料提供快速訪問。

2. MySQL 5.7 支援的儲存引擎

  MySQL 支援多種型別的資料庫引擎,可分別根據各個引擎的功能和特性為不同的資料庫處理任務提供各自不同的適應性和靈活性。在 MySQL 中,可以利用 SHOW ENGINES 語句來顯示可用的資料庫引擎和預設引擎。
  MySQL 提供了多個不同的儲存引擎,包括處理事務安全表的引擎和處理非事務安全表的引擎。在 MySQL 中,不需要在整個伺服器中使用同一種儲存引擎,針對具體的要求,可以對每一個表使用不同的儲存引擎。
  MySQL 5.7 支援的儲存引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。可以使用SHOW ENGINES語句檢視系統所支援的引擎型別,結果如圖所示。

 

3. MySQL 預設儲存引擎

InnoDB 是系統的預設引擎,支援可靠的事務處理。
使用下面的語句可以修改資料庫臨時的預設儲存引擎
SET default_storage_engine=< 儲存引擎名 >
例如,將 MySQL 資料庫的臨時預設儲存引擎修改為 MyISAM,輸入的 SQL 語句和執行結果如圖所示。

 

此時,可以發現 MySQL 的預設儲存引擎已經變成了 MyISAM。但是當再次重啟客戶端時,預設儲存引擎仍然是 InnoDB。

六、Mysql資料型別介紹

1. 基本介紹

在 MySQL 中常見的資料型別如下:

  1. 整數型別
    包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮點數型別 FLOAT 和 DOUBLE,定點數型別 DECIMAL。
  2. 日期/時間型別
    包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
  3. 字串型別
    包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等。
  4. 二進位制型別
    包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

2. 整數型別

  MySQL 提供了多種數值型資料型別,不同的資料型別提供不同的取值範圍,可以儲存的值範圍越大,所需的儲存空間也會越大。
  MySQL 主要提供的整數型別有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其屬性欄位可以新增 AUTO_INCREMENT 自增約束條件。下表中列出了 MySQL 中的數值型別。

 

從上表中可以看到,不同型別的整數儲存所需的位元組數不相同,佔用位元組數最小的是 TINYINT 型別,佔用位元組最大的是 BIGINT 型別,佔用的位元組越多的型別所能表示的數值範圍越大。

根據佔用位元組數可以求出每一種資料型別的取值範圍。例如,TINYINT 需要 1 個位元組(8bit)來儲存,那麼 TINYINT 無符號數的最大值為 28-1,即 255;TINYINT 有符號數的最大值為 27-1,即 127。其他型別的整數的取值範圍計算方法相同,如下表所示。

 

提示:顯示寬度和資料型別的取值範圍是無關的。顯示寬度只是指明 MySQL 最大可能顯示的數字個數,數值的位數小於指定的寬度時會由空格填充。如果插入了大於顯示寬度的值,只要該值不超過該型別整數的取值範圍,數值依然可以插入,而且能夠顯示出來。例如,year 欄位插入 19999,當使用 SELECT 查詢該列值的時候,MySQL 顯示的將是完整的帶有 5 位數字的 19999,而不是 4 位數字的值。

3. 小數型別

  MySQL 中使用浮點數和定點數來表示小數。
  浮點型別有兩種,分別是單精度浮點數(FLOAT)和雙精度浮點數(DOUBLE);定點型別只有一種,就是 DECIMAL。
  浮點型別和定點型別都可以用(M, D)來表示,其中M稱為精度,表示總共的位數;D稱為標度,表示小數的位數。
  浮點數型別的取值範圍為 M(1~255)和 D(1~30,且不能大於 M-2),分別表示顯示寬度和小數位數。M 和 D 在 FLOAT 和DOUBLE 中是可選的,FLOAT 和 DOUBLE 型別將被儲存為硬體所支援的最大精度。DECIMAL 的預設 D 值為 0、M 值為 10。
  下表中列出了 MySQL 中的小數型別和儲存需求。

 

FLOAT 型別的取值範圍如下:
有符號的取值範圍:-3.402823466E+38~-1.175494351E-38。
無符號的取值範圍:0 和 -1.175494351E-38~-3.402823466E+38。

DOUBLE 型別的取值範圍如下:
有符號的取值範圍:-1.7976931348623157E+308~-2.2250738585072014E-308。
無符號的取值範圍:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。
提示:不論是定點還是浮點型別,如果使用者指定的精度超出精度範圍,則會四捨五入進行處理。
FLOAT 和 DOUBLE 在不指定精度時,預設會按照實際的精度(由計算機硬體和作業系統決定),DECIMAL 如果不指定精度,預設為(10,0)。

浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的範圍;缺點是會引起精度問題。

最後再強調一下:在 MySQL 中,定點數以字串形式儲存,在對精度要求比較高的時候(如貨幣、科學資料),使用 DECIMAL 的型別比較好,另外兩個浮點數進行減法和比較運算時也容易出問題,所以在使用浮點數時需要注意,並儘量避免做浮點數比較。

4. 日期和時間型別

  MySQL 中有多處表示日期的資料型別:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。當只記錄年資訊的時候,可以只使用 YEAR 型別。
  每一個型別都有合法的取值範圍,當指定確定不合法的值時,系統將“零”值插入資料庫中。
  下表中列出了 MySQL 中的日期與時間型別。

 

YEAR 型別
YEAR 型別是一個單位元組型別,用於表示年,在儲存時只需要 1 個位元組。可以使用各種格式指定 YEAR,如下所示:
以 4 位字串或者 4 位數字格式表示的 YEAR,範圍為 '1901'~'2155'。輸入格式為 'YYYY' 或者 YYYY,例如,輸入 '2010' 或 2010,插入資料庫的值均為 2010。
以 2 位字串格式表示的 YEAR,範圍為 '00' 到 '99'。'00'~'69' 和 '70'~'99' 範圍的值分別被轉換為 2000~2069 和 1970~1999 範圍的 YEAR 值。'0' 與 '00' 的作用相同。插入超過取值範圍的值將被轉換為 2000。
以 2 位數字表示的 YEAR,範圍為 1~99。1~99 和 70~99 範圍的值分別被轉換為 2001~2069 和 1970~1999 範圍的 YEAR 值。注意,在這裡 0 值將被轉換為 0000,而不是 2000。
提示:兩位整數範圍與兩位字串範圍稍有不同。例如,插入 3000 年,讀者可能會使用數字格式的 0 表示 YEAR,實際上,插入資料庫的值為 0000,而不是所希望的 3000。只有使用字串格式的 '0' 或 '00',才可以被正確解釋為 3000,非法 YEAR值將被轉換為 0000。

TIME 型別
TIME 型別用於只需要時間資訊的值,在儲存時需要 3 個位元組。格式為 HH:MM:SS。HH 表示小時,MM 表示分鐘,SS 表示秒。

TIME 型別的取值範圍為 -838:59:59~838:59:59,小時部分如此大的原因是 TIME 型別不僅可以用於表示一天的時間(必須小於 24 小時),還可能是某個事件過去的時間或兩個事件之間的時間間隔(可大於 24 小時,或者甚至為負)。

可以使用各種格式指定 TIME 值,如下所示。
'D HH:MM:SS' 格式的字串。還可以使用這些“非嚴格”的語法:'HH:MM:SS'、'HH:MM'、'D HH' 或 'SS'。這裡的 D 表示日,可以取 0~34 之間的值。在插入資料庫時,D 被轉換為小時儲存,格式為 “D*24+HH”。
'HHMMSS' 格式、沒有間隔符的字串或者 HHMMSS 格式的數值,假定是有意義的時間。例如,'101112' 被理解為'10:11:12',但是 '106112' 是不合法的(它有一個沒有意義的分鐘部分),在儲存時將變為 00:00:00。
提示:為 TIME 列分配簡寫值時應注意:如果沒有冒號,MySQL 解釋值時,假定最右邊的兩位表示秒。(MySQL 解釋 TIME 值為過去的時間而不是當前的時間)。例如,讀者可能認為 '1112' 和 1112 表示 11:12:00(即 11 點過 12 分鐘),但MySQL 將它們解釋為 00:11:12(即 11 分 12 秒)。同樣 '12' 和 12 被解釋為00:00:12。相反,TIME 值中如果使用冒號則肯定被看作當天的時間,也就是說,'11:12' 表示 11:12:00,而不是 00:11:12。

DATE 型別
DATE 型別用於僅需要日期值時,沒有時間部分,在儲存時需要 3 個位元組。日期格式為 'YYYY-MM-DD',其中 YYYY 表示年,MM 表示月,DD 表示日。

在給 DATE 型別的欄位賦值時,可以使用字串型別或者數字型別的資料插入,只要符合 DATE 的日期格式即可。如下所示:
以 'YYYY-MM-DD' 或者 'YYYYMMDD' 字元中格式表示的日期,取值範圍為 '1000-01-01'~'9999-12-3'。例如,輸入 '2015-12-31' 或者 '20151231',插入資料庫的日期為2015-12-31。
以 'YY-MM-DD' 或者 'YYMMDD' 字串格式表示日期,在這裡YY表示兩位的年值。MySQL 解釋兩位年值的規則:'00~69' 範圍的年值轉換為 '20002069','7099' 範圍的年值轉換為 '1970~1999'。例如,輸入 '15-12-31',插入資料庫的日期為 2015-12-31;輸入 '991231',插入資料庫的日期為 1999-12-31。
以 YYMMDD 數字格式表示的日期,與前面相似,00~69 範圍的年值轉換為 2000~2069,80~99 範圍的年值轉換為 1980~1999。例如,輸入 151231,插入資料庫的日期為 2015-12-31,輸入 991231,插入資料庫的日期為 1999-12-31。
使用 CURRENT_DATE 或者 NOW(),插入當前系統日期。
提示:MySQL 允許“不嚴格”語法:任何標點符號都可以用作日期部分之間的間隔符。例如,'98-11-31'、'98.11.31'、'98/11/31'和'98@11@31' 是等價的,這些值也可以正確地插入資料庫。

DATETIME 型別
DATETIME 型別用於需要同時包含日期和時間資訊的值,在儲存時需要 8 個位元組。日期格式為 'YYYY-MM-DD HH:MM:SS',其中 YYYY 表示年,MM 表示月,DD 表示日,HH 表示小時,MM 表示分鐘,SS 表示秒。

在給 DATETIME 型別的欄位賦值時,可以使用字串型別或者數字型別的資料插入,只要符合 DATETIME 的日期格式即可,如下所示。
以 'YYYY-MM-DD HH:MM:SS' 或者 'YYYYMMDDHHMMSS' 字串格式表示的日期,取值範圍為 '1000-01-01 00:00:00'~'9999-12-3 23:59:59'。例如,輸入 '2014-12-31 05:05:05' 或者 '20141231050505’,插入資料庫的 DATETIME 值都為 2014-12-31 05:05:05。
以 'YY-MM-DD HH:MM:SS' 或者 'YYMMDDHHMMSS' 字串格式表示的日期,在這裡 YY 表示兩位的年值。與前面相同,'00~79' 範圍的年值轉換為 '2000~2079','80~99' 範圍的年值轉換為 '1980~1999'。例如,輸入 '14-12-31 05:05:05',插入資料庫的 DATETIME 為 2014-12-31 05:05:05;輸入 141231050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05。
以 YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 數字格式表示的日期和時間。例如,輸入 20141231050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05;輸入 140505050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05。
提示:MySQL 允許“不嚴格”語法:任何標點符號都可用作日期部分或時間部分之間的間隔符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+35'、'98/12/31 113045' 和 '98@12@31 113045' 是等價的,這些值都可以正確地插入資料庫。

TIMESTAMP 型別
TIMESTAMP 的顯示格式與 DATETIME 相同,顯示寬度固定在 19 個字元,日期格式為 YYYY-MM-DD HH:MM:SS,在儲存時需要 4 個位元組。但是 TIMESTAMP 列的取值範圍小於 DATETIME 的取值範圍,為 '1970-01-01 00:00:01'UTC~'2038-01-19 03:14:07'UTC。在插入資料時,要保證在合法的取值範圍內。
提示:協調世界時(英:Coordinated Universal Time,法:Temps Universel Coordonné)又稱為世界統一時間、世界標準時間、國際協調時間。英文(CUT)和法文(TUC)的縮寫不同,作為妥協,簡稱 UTC。

TIMESTAMP 與 DATETIME 除了儲存位元組和支援的範圍不同外,還有一個最大的區別是:
DATETIME 在儲存日期資料時,按實際輸入的格式儲存,即輸入什麼就儲存什麼,與時區無關;
而 TIMESTAMP 值的儲存是以 UTC(世界標準時間)格式儲存的,儲存時對當前時區進行轉換,檢索時再轉換回當前時區。即查詢時,根據當前時區的不同,顯示的時間值是不同的。
提示:如果為一個 DATETIME 或 TIMESTAMP 物件分配一個 DATE 值,結果值的時間部分被設定為 '00:00:00',因此 DATE 值未包含時間資訊。如果為一個 DATE 物件分配一個 DATETIME 或 TIMESTAMP 值,結果值的時間部分被刪除,因此DATE 值未包含時間資訊。

5. 字串型別

  字串型別用來儲存字串資料,還可以儲存圖片和聲音的二進位制資料。字串可以區分或者不區分大小寫的串比較,還可以進行正則表示式的匹配查詢。
  MySQL 中的字串型別有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
  下表中列出了 MySQL 中的字串資料型別,括號中的M表示可以為其指定長度。

 

VARCHAR 和 TEXT 型別是變長型別,其儲存需求取決於列值的實際長度(在前面的表格中用 L 表示),而不是取決於型別的最大可能尺寸。

例如,一個 VARCHAR(10) 列能儲存一個最大長度為 10 個字元的字串,實際的儲存需要字串的長度 L 加上一個位元組以記錄字串的長度。對於字元 “abcd”,L 是 4,而儲存要求 5 個位元組。

CHAR 和 VARCHAR 型別
CHAR(M) 為固定長度字串,在定義時指定字串列長。當儲存時,在右側填充空格以達到指定的長度。M 表示列的長度,範圍是 0~255 個字元。

例如,CHAR(4) 定義了一個固定長度的字串列,包含的字元個數最大為 4。當檢索到 CHAR 值時,尾部的空格將被刪除。

VARCHAR(M) 是長度可變的字串,M 表示最大列的長度,M 的範圍是 0~65535。VARCHAR 的最大實際長度由最長的行的大小和使用的字符集確定,而實際佔用的空間為字串的實際長度加 1。

例如,VARCHAR(50) 定義了一個最大長度為 50 的字串,如果插入的字串只有 10 個字元,則實際儲存的字串為 10 個字元和一個字串結束字元。VARCHAR 在值儲存和檢索時尾部的空格仍保留。

【例項】下面將不同的字串儲存到 CHAR(4) 和 VARCHAR(4) 列,說明 CHAR 和 VARCHAR 之間的差別,如下表所示。

插入值 CHAR(4) 儲存需求 VARCHAR(4) 儲存需求
' ' ' ' 4位元組 '' 1位元組
'ab' 'ab ' 4位元組 'ab' 3位元組
'abc' 'abc ' 4位元組 'abc' 4位元組
'abcd' 'abcd' 4位元組 'abcd' 5位元組
'abcdef' 'abcd' 4位元組 'abcd' 5位元組
對比結果可以看到,CHAR(4) 定義了固定長度為 4 的列,無論存入的資料長度為多少,所佔用的空間均為 4 個位元組。VARCHAR(4) 定義的列所佔的位元組數為實際長度加 1。
TEXT 型別
TEXT 列儲存非二進位制字串,如文章內容、評論等。當儲存或查詢 TEXT 列的值時,不刪除尾部空格。

TEXT 型別分為 4 種:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 型別的儲存空間和資料長度不同。
TINYTEXT 表示長度為 255(28-1)字元的 TEXT 列。
TEXT 表示長度為 65535(216-1)字元的 TEXT 列。
MEDIUMTEXT 表示長度為 16777215(224-1)字元的 TEXT 列。
LONGTEXT 表示長度為 4294967295 或 4GB(232-1)字元的 TEXT 列。

ENUM 型別
ENUM 是一個字串物件,值為表建立時列規定中列舉的一列值。其語法格式如下:
<欄位名> ENUM( '值1', '值1', …, '值n' )
欄位名指將要定義的欄位,值 n 指列舉列表中第 n 個值。

ENUM 型別的欄位在取值時,能在指定的列舉列表中獲取,而且一次只能取一個。如果建立的成員中有空格,尾部的空格將自動被刪除。

ENUM 值在內部用整數表示,每個列舉值均有一個索引值;列表值所允許的成員值從 1 開始編號,MySQL 儲存的就是這個索引編號,列舉最多可以有 65535 個元素。

例如,定義 ENUM 型別的列('first','second','third'),該列可以取的值和每個值的索引如下表所示。

值 索引
NULL NULL
'' 0
’first 1
second 2
third 3
ENUM 值依照列索引順序排列,並且空字串排在非空字串前,NULL 值排在其他所有列舉值前。
提示:ENUM 列總有一個預設值。如果將 ENUM 列宣告為 NULL,NULL 值則為該列的一個有效值,並且預設值為 NULL。如果 ENUM 列被宣告為 NOT NULL,其預設值為允許的值列表的第 1 個元素。

SET 型別
SET 是一個字串的物件,可以有零或多個值,SET 列最多可以有 64 個成員,值為表建立時規定的一列值。指定包括多個 SET 成員的 SET 列值時,各成員之間用逗號,隔開,語法格式如下:
SET( '值1', '值2', …, '值n' )
與 ENUM 型別相同,SET 值在內部用整數表示,列表中每個值都有一個索引編號。當建立表時,SET 成員值的尾部空格將自動刪除。

但與 ENUM 型別不同的是,ENUM 型別的欄位只能從定義的列值中選擇一個值插入,而 SET 型別的列可從定義的列值中選擇多個字元的聯合。
提示:如果插入 SET 欄位中的列值有重複,則 MySQL 自動刪除重複的值;插入 SET 欄位的值的順序並不重要,MySQL 會在存入資料庫時,按照定義的順序顯示;如果插入了不正確的值,預設情況下,MySQL 將忽視這些值,給出警告。

七、Mysql主要專業名稱介紹

1. 主鍵

1.1 什麼是主鍵
“主鍵(PRIMARY KEY)”的完整稱呼是“主鍵約束”。MySQL 主鍵約束是一個列或者列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可以強制表的實體完整性。

1.2 選取設定主鍵約束的欄位
主鍵約束即在表中定義一個主鍵來唯一確定表中每一行資料的識別符號。主鍵可以是表中的某一列或者多列的組合,其中由多列組合的主鍵稱為複合主鍵。主鍵應該遵守下面的規則:

  • 每個表只能定義一個主鍵。
  • 主鍵值必須唯一標識表中的每一行,且不能為 NULL,即表中不可能存在兩行資料有相同的主鍵值。這是唯一性原則。
  • 一個列名只能在複合主鍵列表中出現一次。
  • 複合主鍵不能包含不必要的多餘列。當把複合主鍵的某一列刪除後,如果剩下的列構成的主鍵仍然滿足唯一性原則,那麼這個複合主鍵是不正確的。這是最小化原則。

1.3 建立主鍵
語法規則:<欄位名> <資料型別> PRIMARY KEY [預設值]

 

2. 外來鍵約束

2.1 什麼是外來鍵約束
  MySQL 外來鍵約束(FOREIGN KEY)用來在兩個表的資料之間建立連結,它可以是一列或者多列。一個表可以有一個或多個外來鍵。
  外來鍵對應的是參照完整性,一個表的外來鍵可以為空值,若不為空值,則每一個外來鍵的值必須等於另一個表中主鍵的某個值。
  外來鍵是表的一個欄位,不是本表的主鍵,但對應另一個表的主鍵。定義外來鍵後,不允許刪除另一個表中具有關聯關係的行。
  外來鍵的主要作用是保持資料的一致性、完整性。例如,部門表 tb_dept 的主鍵是 id,在員工表 tb_emp5 中有一個鍵 deptId 與這個 id 關聯。

  • 主表(父表):對於兩個具有關聯關係的表而言,相關聯欄位中主鍵所在的表就是主表。
  • 從表(子表):對於兩個具有關聯關係的表而言,相關聯欄位中外來鍵所在的表就是從表。

2.2 選取設定 MySQL 外來鍵約束的欄位
定義一個外來鍵時,需要遵守下列規則:
(1)父表必須已經存在於資料庫中,或者是當前正在建立的表。如果是後一種情況,則父表與子表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。
(2)必須為父表定義主鍵。
(3)主鍵不能包含空值,但允許在外來鍵中出現空值。也就是說,只要外來鍵的每個非空值出現在指定的主鍵中,這個外來鍵的內容就是正確的。
(4)在父表的表名後面指定列名或列名的組合。這個列或列的組合必須是父表的主鍵或候選鍵。
(5)外來鍵中列的數目必須和父表的主鍵中列的數目相同。
(6)外來鍵中列的資料型別必須和父表主鍵中對應列的資料型別相同。

2.3 在建立表時設定外來鍵約束
在資料表中建立外來鍵使用 FOREIGN KEY 關鍵字,具體的語法規則如下:
[CONSTRAINT <外來鍵名>] FOREIGN KEY 欄位名 [,欄位名2,…]
REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]

其中:外來鍵名為定義的外來鍵約束的名稱,一個表中不能有相同名稱的外來鍵;欄位名錶示子表需要新增外健約束的欄位列;主表名即被子表外來鍵所依賴的表的名稱;主鍵列表示主表中定義的主鍵列或者列組合。

3. 唯一約束

MySQL唯一約束(Unique Key)要求該列唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複值。

4. 預設值

4.1 什麼是預設值
  “預設值(Default)”的完整稱呼是“預設值約束(Default Constraint)”。MySQL 預設值約束用來指定某列的預設值。
  例如女性同學較多,性別就可以預設為“女”。如果插入一條新的記錄時沒有為這個欄位賦值,那麼系統會自動為這個欄位賦值為“女”。

4.2 在建立表時設定預設值約束
建立表時可以使用 DEFAULT 關鍵字設定預設值約束,具體的語法規則如下:
<欄位名> <資料型別> DEFAULT <預設值>;

 

5. 非空約束

5.1 什麼是非空約束
  MySQL 非空約束(NOT NULL)可以通過 CREATE TABLE 或 ALTER TABLE 語句實現。在表中某個列的定義後加上關鍵字 NOT NULL 作為限定詞,來約束該列的取值不能為空。
  非空約束(Not Null Constraint)指欄位的值不能為空。對於使用了非空約束的欄位,如果使用者在新增資料時沒有指定值,資料庫系統就會報錯。

5.2 在建立表時設定非空約束
建立表時可以使用 NOT NULL 關鍵字設定非空約束,具體的語法規則如下:
<欄位名> <資料型別> NOT NULL;

 

6. 觸發器

觸發器(TRIGGER)是由事件來觸發某個操作。這些事件包括INSERT語句、UPDATE語句和DELETE語句。當資料庫系統執行這些事件時,會啟用促發其執行相應的操作。

7. DML

DML(data manipulation language)資料操縱語言:
    就是我們最經常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用來對資料庫的資料進行一些操作。

SELECT 列名稱 FROM 表名稱
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
DELETE FROM 表名稱 WHERE 列名稱 = 值

8. DDL

DDL(data definition language)資料庫定義語言:其實就是我們在建立表的時候用到的一些sql,比如說:CREATE、ALTER、DROP等。DDL主要是用在定義或改變表的結構,資料型別,表之間的連結和約束等初始化工作上

CREATE TABLE 表名稱
(
列名稱1 資料型別,
列名稱2 資料型別,
列名稱3 資料型別,
....
)

ALTER TABLE table_name
ALTER COLUMN column_name datatype

DROP TABLE 表名稱
DROP DATABASE 資料庫名稱

9. DCL

DCL(Data Control Language)資料庫控制語言:是用來設定或更改資料庫使用者或角色許可權的語句,包括(grant,deny,revoke等)語句。這個比較少用到。在公司呢一般情況下我們用到的是DDL、DML這兩種。

八、Mysql常見sql語句

1. select語句

請在資料下載中進行學習

2. 函式

請在資料下載中進行學習

3. 多表查詢

請在資料下載中進行學習

4. 表的內連與外連‘

請在資料下載中進行學習’

九、Mysql設計與語句優化

1. 資料庫建立優化

請在資料下載中進行學習

2. sql語句優化

請在資料下載中進行學習

十、事務介紹

1. 事務概述

事務是訪問並更新資料庫中各種資料項的一個程式執行單元。在事務中的操作,要麼都執行修改,要麼都不執行,這就是事務的目的,也是事務模型區別於檔案系統的重要特徵之一。

嚴格上來說,事務必須同時滿足4個特性,即通常所說事務的ACID特性。雖然理論上定義了嚴格的事務要求,但是資料庫廠商出於各種目的並沒有嚴格滿足事務的ACID標準。例如,對於MYSQL的NDB Cluster引擎,雖然支援事務,但是不滿足D的要求,即永續性的要求。對於Oracle資料庫來說,其預設的事務隔離級別為READ COMMITTED,不滿足I的要求,即隔離性的要求。對於InnoDB儲存引擎而言,預設的事務隔離級別是READ REPRATABLE,完全遵循和滿足事務的ACID特性。

A(atomicity),原子性。原子性指整個資料庫事務是不可分割的工作單位。只有使事務中所有的資料庫操作都執行成功,整個事務的執行才算成功。事務中任何一個SQL語句執行失敗,那麼已經執行成功的SQL語句也必須撤銷,資料庫狀態應該退回到事務前的狀態。

C(consistency),一致性。一致性是指事務將資料庫從一種狀態轉變為另一種狀態。在事務的開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。

I(isolation),隔離性。隔離性還有其他的稱呼,如併發控制、可序列