1. 程式人生 > >一個小時學會MySQL資料庫

一個小時學會MySQL資料庫

隨著移動網際網路的結束與人工智慧的到來大資料變成越來越重要,下一個成功者應該是擁有海量資料的,資料與資料庫你應該知道。

一、資料庫概要

資料庫(Database)是儲存與管理資料的軟體系統,就像一個存入資料的物流倉庫。

在商業領域,資訊就意味著商機,取得資訊的一個非常重要的途徑就是對資料進行分析處理,這就催生了各種專業的資料管理軟體,資料庫就是其中的一種。當然,資料庫管理系統也不是一下子就建立起來,它也是經過了不斷的豐富和發展,才有了今天的模樣。

1.1、發展歷史

1.1.1、人工處理階段

在20世紀50年代中期以前的計算機誕生初期,其處理能力很有限,只能夠完成一些簡單的運算,資料處理能力也很有限,這使得當時的計算機只能夠用於科學和工程計算。計算機上沒有專用的管理資料的軟體,資料由計算機或處理它的程式自行攜帶。當資料的儲存格式、讀寫路徑或方法發生變化的時候,其處理程式也必須要做出相應的改變以保持程式的正確性。

1.1.2、檔案系統

20世紀50年代後期到60年代中期,隨著硬體和軟體技術的發展,計算機不僅用於科學計算,還大量用於商業管理中。在這一時期,資料和程式在儲存位置上已經完全分開,資料被單獨組織成檔案儲存到外部儲存裝置上,這樣資料檔案就可以為多個不同的程式在不同的時間所使用。
雖然程式和資料在儲存位置上分開了,而且作業系統也可以幫助我們對完成了資料的儲存位置和存取路徑的管理,但是程式設計仍然受到資料儲存格式和方法的影響,不能夠完全獨立於資料,而且資料的冗餘較大。

1.1.3、資料庫管理系統

從20世紀70年代以來,計算機軟硬體技術取得了飛躍式的發展,這一時期最主要的發展就是產生了真正意義上的資料庫管理系統,它使得應用程式和資料之間真正的實現的介面統一、資料共享等,這樣應用程式都可以按照統一的方式直接操作資料,也就是應用程式和資料都具有了高度的獨立性。

1.2、常見資料庫技術品牌、服務與架構

 發展了這麼多年市場上出現了許多的資料庫系統,最強的個人認為是Oracle,當然還有許多如:DB2、Microsoft SQL Server、MySQL、SyBase等,下圖列出常見資料庫技術品牌、服務與架構。

1.3、資料庫分類

資料庫通常分為層次式資料庫、網路式資料庫和關係式資料庫三種。

而不同的資料庫是按不同的資料結構來聯絡和組織的。

而在當今的網際網路中,最常見的資料庫模型主要是兩種,即關係型資料庫和非關係型資料庫。

1.3.1、關係型資料庫

當前在成熟應用且服務與各種系統的主力資料庫還是關係型資料庫。

代表:Oracle、SQL Server、MySQL

1.3.2、非關係型資料庫

隨著時代的進步與發展的需要,非關係型資料庫應運而生。

代表:Redis、Mongodb

NoSQL資料庫在儲存速度與靈活性方面有優勢,也常用於快取。

1.4、資料庫規範化

經過一系列的步驟,我們現在終於將客戶的需求轉換為資料表並確立這些表之間的關係,那麼是否我們現在就可以在開發中使用呢?答案否定的,為什麼呢!同一個專案,很多人蔘與了需求的分析,資料庫的設計,不同的人具有不同的想法,不同的部門具有不同的業務需求,我們以此設計的資料庫將不可避免的包含大量相同的資料,在結構上也有可能產生衝突,在開發中造成不便。

1.4.1. 什麼是正規化

要設計規範化的資料庫,就要求我們根據資料庫設計正規化――也就是資料庫設計的規範原則來做。正規化可以指導我們更好地設計資料庫的表結構,減少冗餘的資料,藉此可以提高資料庫的儲存效率,資料完整性和可擴充套件性。

設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。目前關係資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴德斯科範式(BCNF)、第四正規化(4NF)和第五正規化(5NF,又稱完美正規化)。滿足最低要求的正規化是第一正規化(1NF)。在第一正規化的基礎上進一步滿足更多規範要求的稱為第二正規化(2NF),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3NF)就行了。

1.4.2. 三大正規化

第一正規化(1NF)

所謂第一正規化(1NF)是指在關係模型中,對列新增的一個規範要求,所有的列都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一正規化就是無重複的域。

例如:表1-1中,其中”工程地址”列還可以細分為省份,城市等。在國外,更多的程式把”姓名”列也分成2列,即”姓”和“名”。

雖然第一正規化要求各列要儲存原子性,不能再分,但是這種要求和我們的需求是相關聯的,如上表中我們對”工程地址”沒有省份,城市這樣方面的查詢和應用需求,則不需拆分,”姓名”列也是同樣如此。

表1-1   原始表

工程號

工程名稱

工程地址

員工編號

員工名稱

薪資待遇

職務

P001

港珠澳大橋

廣東珠海

E0001

Jack

6000/月

工人

P001

港珠澳大橋

廣東珠海

E0002

Join

7800/月

工人

P001

港珠澳大橋

廣東珠海

E0003

Apple

8000/月

高階技工

P002

南海航天

海南三亞

E0001

Jack

5000/月

工人

第二正規化(2NF)

在1NF的基礎上,非Key屬性必須完全依賴於主鍵。第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或記錄必須可以被唯一地區分。選取一個能區分每個實體的屬性或屬性組,作為實體的唯一標識。

第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識。簡而言之,第二正規化就是在第一正規化的基礎上屬性完全依賴於主鍵。

例如:表1-1中,一個表描述了工程資訊,員工資訊等。這樣就造成了大量資料的重複。按照第二正規化,我們可以將表1-1拆分成表1-2和表1-3:

l  工程資訊表:(工程編號,工程名稱,工程地址):

表1-2   工程資訊表

工程編號

工程名稱

工程地址

P001

港珠澳大橋

廣東珠海

P002

南海航天

海南三亞

l  員工資訊表(員工編號,員工名稱,職務,薪資水平):

表1-3   員工資訊表

員工編號

員工姓名

職務

薪資水平

E0001

Jack

工人

3000/月

E0002

Join

工人

3000/月

E0003

Apple

高階技工

6000/月

這樣,表1-1就變成了兩張表,每個表只描述一件事,清晰明瞭。

第三正規化(3NF)

第三正規化是在第二正規化基礎上,更進一層,第三正規化的目標就是確保表中各列與主鍵列直接相關,而不是間接相關。即各列與主鍵列都是一種直接依賴關係,則滿足第三正規化。

第三正規化要求各列與主鍵列直接相關,我們可以這樣理解,假設張三是李四的兵,王五則是張三的兵,這時王五是不是李四的兵呢?從這個關係中我們可以看出,王五也是李四的兵,因為王五依賴於張三,而張三是李四的兵,所以王五也是。這中間就存在一種間接依賴的關係而非我們第三正規化中強調的直接依賴。

現在我們來看看在第二正規化的講解中,我們將表1-1拆分成了兩張表。這兩個表是否符合第三正規化呢。在員工資訊表中包含:”員工編號”、”員工名稱”、”職務”、”薪資水平”,而我們知道,薪資水平是有職務決定,這裡”薪資水平”通過”職務”與員工相關,則不符合第三正規化。我們需要將員工資訊表進一步拆分,如下:

l  員工資訊表:員工編號,員工名稱,職務

l  職務表:職務編號,職務名稱,薪資水平

現在我們已經瞭解了資料庫規範化設計的三大正規化,下面我們再來看看對錶1-1優化後的資料表:

員工資訊表(Employee)

員工編號

員工姓名

職務編號

E0001

Jack

1

E0002

Join

1

E0003

Apple

2

工程資訊表(ProjectInfo)

工程編號

工程名稱

工程地址

P001

港珠澳大橋

廣東珠海

P002

南海航天

海南三亞

職務表(Duty)

職務編號

職務名稱

工資待遇

1

工人

3000/月

2

高階技工

6000/月

工程參與人員記錄表(Project_ Employee_info)

編號

工程編號

人員編號

1

P001

E0001

2

P001

E0002

3

P002

E0003

通過對比我們發現,表多了,關係複雜了,查詢資料變的麻煩了,程式設計中的難度也提高了,但是各個表中內容更清晰了,重複的資料少了,更新和維護變的更容易了,哪麼如何平衡這種矛盾呢?

1.4.3. 正規化與效率

在我們設計資料庫時,設計人員、客戶、開發人員通常對資料庫的設計有一定的矛盾,客戶更喜歡方便,清晰的結果,開發人員也希望資料庫關係比較簡單,降低開發難度,而設計人員則需要應用三大正規化對資料庫進行嚴格規範化,減少資料冗餘,提高資料庫可維護性和擴充套件性。由此可以看出,為了滿足三大正規化,我們資料庫設計將會與客戶、開發人員產生分歧,所以在實際的資料庫設計中,我們不能一味的追求規範化,既要考慮三大正規化,減少資料冗餘和各種資料庫操作異常,又要充分考慮到資料庫的效能問題,允許適當的資料庫冗餘。

二、MySQL介紹

2.1、MySQL概要

MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體之一。


MySQL是一種關係資料庫管理系統,關係資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,分為社群版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。

2.2、系統特性

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,.NET和 Tcl 等。

4.支援多執行緒,充分利用 CPU 資源。

5.優化的 SQL查詢演算法,有效地提高查詢速度。

6.既能夠作為一個單獨的應用程式應用在客戶端伺服器網路環境中,也能夠作為一個庫而嵌入到其他的軟體中。

7.提供多語言支援,常見的編碼如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作資料表名和資料列名。

8.提供 TCP/IP、ODBC 和 JDBC等多種資料庫連線途徑。

9.提供用於管理、檢查、優化資料庫操作的管理工具。

10.支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。

11.支援多種儲存引擎。

12.MySQL 是開源的,所以你不需要支付額外的費用。

13.MySQL 使用標準的 SQL資料語言形式。

14.MySQL 對 PHP 有很好的支援,PHP是目前最流行的 Web 開發語言。

15.MySQL是可以定製的,採用了 GPL協議,你可以修改原始碼來開發自己的 MySQL 系統。

16.線上 DDL/更改功能,資料架構支援動態應用程式和開發人員靈活性(5.6新增)

17.複製全域性事務標識,可支援自我修復式叢集(5.6新增)

18.複製無崩潰從機,可提高可用性(5.6新增)

19.複製多執行緒從機,可提高效能(5.6新增)

20.3倍更快的效能(5.7新增)

21.新的優化器(5.7新增)

22.原生JSON支援(5.7新增)

23.多源複製(5.7新增)

24.GIS的空間擴充套件(5.7新增)

2.3、儲存引擎

MySQL資料庫根據應用的需要準備了不同的引擎,不同的引擎側重點不一樣,區別如下:

MyISAM MySQL 5.0 之前的預設資料庫引擎,最為常用。擁有較高的插入,查詢速度,但不支援事務

InnoDB 事務型資料庫的首選引擎,支援ACID事務,支援行級鎖定, MySQL 5.5 起成為預設資料庫引擎

BDB源 自 Berkeley DB,事務型資料庫的另一種選擇,支援Commit 和Rollback 等其他事務特性

Memory 所有資料置於記憶體的儲存引擎,擁有極高的插入,更新和查詢效率。但是會佔用和資料量成正比的記憶體空間。並且其內容會在 MySQL 重新啟動時丟失

Merge 將一定數量的 MyISAM 表聯合而成一個整體,在超大規模資料儲存時很有用\

Archive 非常適合儲存大量的獨立的,作為歷史記錄的資料。因為它們不經常被讀取。Archive 擁有高效的插入速度,但其對查詢的支援相對較差

Federated 將不同的 MySQL 伺服器聯合起來,邏輯上組成一個完整的資料庫。非常適合分散式應用

Cluster/NDB 高冗餘的儲存引擎,用多臺資料機器聯合提供服務以提高整體效能和安全性。適合資料量大,安全和效能要求高的應用

CSV 邏輯上由逗號分割資料的儲存引擎。它會在資料庫子目錄裡為每個資料表建立一個 .csv 檔案。這是一種普通文字檔案,每個資料行佔用一個文字行。CSV 儲存引擎不支援索引。

BlackHole 黑洞引擎,寫入的任何資料都會消失,一般用於記錄 binlog 做複製的中繼

EXAMPLE 儲存引擎是一個不做任何事情的存根引擎。它的目的是作為 MySQL 原始碼中的一個例子,用來演示如何開始編寫一個新儲存引擎。同樣,它的主要興趣是對開發者。EXAMPLE 儲存引擎不支援編索引。

另外,MySQL 的儲存引擎介面定義良好。有興趣的開發者可以通過閱讀文件編寫自己的儲存引擎。

三、快速安裝執行MySQL資料庫

MySQL以前一直是開源免費的,被Oracle收購後有些變化:以前的版本都是免費的,社群版按GPL協議開源免費,商業版提供更加豐富的功能,但收費。

3.1、使用綠色版

為了方便快捷的使用MySQL我已經準備好了一個綠化了的MySQL,解壓後就可以直接使用,不需要任何配置。

下載後直接解壓:

點選啟動PStart.exe這是一個自定義選單的小工具,為了整理資源用的。

裡面有兩個MySQL的綠色版軟體5.0,5.5

Navicat for MySQL是一個數據庫客戶端管理工具

點選啟動PStart.exe後的結果如下:

點選啟動MySQL服務,執行Navicat for MySQL即可。

*注意:上面的PStart只是一個整理文件資料的工具,並非必要,如果啟動時有錯誤或為空時,可以直接關閉,直接啟動MySQL服務,如:

mysql_start.bat用於啟動MySql資料庫,mysql_stop.bat用於關閉MySql資料庫。

開發工具的啟動方式也一樣,如下所示:

navicat.exe用於啟動Navicat資料庫客戶端,最好傳送快捷方式到桌面,省去每次開啟資料夾的麻煩。

3.1.1、設定mysql遠端訪問

執行mysql 命令進入mysql 命令模式,執行如下SQL程式碼 

mysql> use mysql; 
mysql> GRANT ALL ON *.* TO [email protected]'%' IDENTIFIED BY 'admin' WITH GRANT OPTION; 

#這句話的意思 ,允許任何IP地址(上面的 % 就是這個意思)的電腦 用admin帳戶 和密碼(admin)來訪問這個MySQL Server
#必須加類似這樣的帳戶,才可以遠端登陸。 root帳戶是無法遠端登陸的,只可以本地登陸

3.1.2、修改mysql使用者密碼

1.mysqladmin命令

格式如下(其中,USER為使用者名稱,PASSWORD為新密碼):

mysqladmin -u USER -p password PASSWORD

該命令之後會提示輸入原密碼,輸入正確後即可修改。
例如,設定root使用者的密碼為123456,則

mysqladmin -u root -p password 123456

2.UPDATE user 語句

這種方式必須是先用root帳戶登入mysql,然後執行:

UPDATE user SET password=PASSWORD('123456') WHERE user='root';
FLUSH PRIVILEGES;

3.SET PASSWORD 語句

這種方式也需要先用root命令登入mysql,然後執行:

SET PASSWORD FOR root=PASSWORD('123456');

4.root密碼丟失的情況

使用 MySQL 自帶的一個工具"MySQL GUI Tools",我一直用的是5.0版本的。 在安裝目錄中執行一個程式 MySQLSystemTrayMonitor.exe,執行完後在系統托盤會出現圖示。如果MySQL服務尚未安裝,則不會出現,可先通過Action>Manage MySQL Instances 先配置和安裝服務。如果已經安裝服務,滑鼠右鍵點選後,會出現"Configure Instance"的選單。點選後出現如下MySQL Administrator視窗:
假如原來的服務配置都正常的情況下,選中左側列表中的“啟動變數”,並在相應的右側標籤中選擇“安全”,勾選“禁用grant表”,然後“應用更改”。
並回到左側的“伺服器控制”,和右側相應的“開始/停止服務”標籤,點選啟動服務。此時,連線mysql已經不需要使用者名稱和密碼了,你可以修改root密碼。

3.1.2、安裝服務

首先我們先進入mysql的安裝目錄下的bin目錄、之後開啟DOS命令視窗,進入該目錄下(一定要進入該目錄,否則操作錯誤)

執行DOS命令:

輸入命令:mysqld --install,之後出現如下介面。提示安裝服務成功。

注意是mysqld --install不是mysql --install

如果要解除安裝服務,可以輸入如下命令:mysqld --remove。出現如下介面。提示移除服務成功。

3.2、使用安裝版

選擇自定義:

安裝的元件資訊:

伺服器軟體目錄:

資料目錄:

點選install安裝即可:


配置:

機器型別


是否支援事務功能:

innodb表空間:


連線數量:


字符集設定:


配置windows管理相關:


配置安全選項,設定管理員的使用者名稱與密碼:


最後執行配置即可:


配置後,會啟動服務。

新版的MySQL安裝包大了很多,安裝過程也有些不一樣。

四、使用GUI操作MySQL

4.1、關係型資料庫的典型概念

資料庫 databse:資料的倉庫

表 table:資料是儲存在表內,儲存在一個表內的資料,應該具有相同的資料格式

行:行用於記錄資料

記錄:行內的資料

列:列用於規定資料格式

欄位:資料的某個列

SQL:用來管理資料的語言。結構化查詢語言(SQL,Structured Query Language)

主鍵:唯一地標識表中的某一條記錄,不能空,不能重複

4.2、登入資料庫

*連線本地資料庫時需要啟動服務

4.3、建立資料庫

 

4.4、建立表

列的型別:

數字型別

整數: tinyint、smallint、mediumint、int、bigint
浮點數: float、double、real、decimal
日期和時間: date、time、datetime、timestamp、year

字串型別
字串: char、varchar
文字: tinytext、text、mediumtext、longtext

二進位制(可用來儲存圖片、音樂等): tinyblob、blob、mediumblob、longblob

列的約束:

4.5、管理資料

4.5.1、新增資料

雙擊新建好的表名,開啟表,就可以新增資料了。

4.5.2、刪除資料

4.5.3、修改表結構

如果想向現有的表中新增一列,則可以修改表結構:

4.5.4、外來鍵

上面這個學生表是有些問題的:

a)、不便於修改,比如教室換成了305教室,則每個學員都要修改

b)、資料冗餘,大量的重複資料

將表拆分成兩個,分解後問題解決,如下圖所示:

這裡的班級編號就是外來鍵,可以空,但不為空時他的值一定在要引用表中存在。如果學生表中的編號是主鍵這裡就不應該重複,外來鍵則可以重複也允許為空。

新增外來鍵:

班級表:

學生表:

新增外來鍵:

刪除與更新時可以實現級聯更新與刪除,當更新設定為CASCADE時主鍵變化引用主鍵的表也會一起變化,當刪除設定為CASCADE時刪除主鍵表,引用的記錄都將被刪除。

4.6、上機練習

1、請建立一個新的資料庫叫HR,在HR資料庫中新增EMP表,EMP表的表結構如下所示

EMP表,員工資訊

名稱

型別

描述

1

EMPNO

int

僱員的編號,主鍵,自動增長

2

ENAME

VARCHAR(10)

僱員的姓名,由10位字元所組成,不為空,唯一鍵

3

JOB

VARCHAR(9)

僱員的職位

4

MGR

int

僱員對應的領導編號,領導也是僱員,可空(可刪除這一列)

5

HIREDATE

TimeStamp

僱員的僱傭日期,預設為當前日期

6

SAL

Numeric(7,2)

基本工資,其中有兩位小數,五位整數,一共是七位

7

COMM

Numeric(7,2)

獎金,佣金

8

DEPTNO

int

僱員所在的部門編號,可空,外來鍵fk_deptno

9

DETAIL

Text

備註,可空

Dept,部門表

名稱

型別

描述

1

DeptNO

int

部門的編號,主鍵,自動增長

2

DNAME

VARCHAR(10)

部門名,由50位字元所組成,不為空,唯一鍵

3

DTel

VARCHAR(10)

電話,可空

2、根據上面的表結構完成表的建立,表名為emp

3、在表中新增5條以上的資料

4、完成下列查詢要求

4.1查詢所有員工資訊

4.2查詢所有工資介於2000-5000間的員工姓名、職位與工資

4.3查詢所有姓“張”的員工

4.4 按工資降序查詢出2014年到2015年間入職的員工

4.5、將工資普遍上調20%

4.6、將工資低於3000元的員工獎金修改為工資的2.8倍

4.7、刪除編號為5或者姓“王”的員工

五、使用SQL訪問MySQL資料庫

5.1、增加資料

insert 語句可以用來將一行或多行資料插到資料庫表中, 使用的一般形式如下:

Insert into 表名(欄位列表) values (值列表);

insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);

insert into students values(NULL, "張三", "男", 20, "18889009876");

有時我們只需要插入部分資料, 或者不按照列的順序進行插入, 可以使用這樣的形式進行插入:

insert into students (name, sex, age) values("李四", "女", 21);

5.2、查詢資料

select 語句常用來根據一定的查詢規則到資料庫中獲取資料, 其基本的用法為:

select 欄位名 from 表名稱 [查詢條件];

查詢學生表中的所有資訊:select * from students;

查詢學生表中所有的name與age資訊:select name, age from students;

也可以使用萬用字元 * 查詢表中所有的內容, 語句: select * from students;

5.2.1、表示式與條件查詢

where 關鍵詞用於指定查詢條件, 用法形式為: select 列名稱 from 表名稱 where 條件;

以查詢所有性別為女的資訊為例, 輸入查詢語句: select * from students where sex="女";

where 子句不僅僅支援 "where 列名 = 值" 這種名等於值的查詢形式, 對一般的比較運算的運算子都是支援的, 例如 =、>、<、>=、<、!= 以及一些擴充套件運算子 is [not] null、in、like 等等。 還可以對查詢條件使用 or 和 and 進行組合查詢, 以後還會學到更加高階的條件查詢方式, 這裡不再多做介紹。

示例:

查詢年齡在21歲以上的所有人資訊: select * from students where age > 21;

查詢名字中帶有 "王" 字的所有人資訊: select * from students where name like "%王%";

查詢id小於5且年齡大於20的所有人資訊: select * from students where id<5 and age>20;

5.2.2、聚合函式

獲得學生總人數:select count(*) from students

獲得學生平均分:select avg(mark) from students

獲得最高成績:select max(mark) from students

獲得最低成績:select min(mark) from students

獲得學生總成績:select sum(mark) from students

5.3、刪除資料

delete from 表名 [刪除條件];

刪除表中所有資料:delete from students;

刪除id為10的行: delete from students where id=10;

刪除所有年齡小於88歲的資料: delete from students where age<88;

5.4、更新資料

update 語句可用來修改表中的資料, 基本的使用形式為:

update 表名稱 set 列名稱=新值 where 更新條件;

Update 表名 set 欄位=值 列表 更新條件

使用示例:

將id為5的手機號改為預設的"-": update students set tel=default where id=5;

將所有人的年齡增加1: update students set age=age+1;

將手機號為 13723887766 的姓名改為 "張果", 年齡改為 19: update students set name="張果", age=19 where tel="13723887766";

5.5、修改表

alter table 語句用於建立後對錶的修改, 基礎用法如下:

5.5.1、新增列

基本形式: alter table 表名 add 列名 列資料型別 [after 插入位置];

示例:

在表的最後追加列 address: alter table students add address char(60);

在名為 age 的列後插入列 birthday: alter table students add birthday date after age;

5.5.2、修改列

基本形式: alter table 表名 change 列名稱 列新名稱 新資料型別;

示例:

將表 tel 列改名為 phone: alter table students change tel phone char(12) default "-";

將 name 列的資料型別改為 char(9): alter table students change name name char(9) not null;

5.5.3、刪除列

基本形式: alter table 表名 drop 列名稱;

示例:

刪除 age 列: alter table students drop age;

5.5.4、重命名錶

基本形式: alter table 表名 rename 新表名;

示例:

重新命名 students 表為temp: alter table students rename temp;

5.5.5、刪除表

基本形式: drop table 表名;

示例: 刪除students表: drop table students;

5.5.6、刪除資料庫

基本形式: drop database 資料庫名;

示例: 刪除lcoa資料庫: drop database lcoa;

5.5.7、一千行MySQL筆記

/* 啟動MySQL */
net start mysql

/* 連線與斷開伺服器 */
mysql -h 地址 -P 埠 -u 使用者名稱 -p 密碼

/* 跳過許可權驗證登入MySQL */
mysqld --skip-grant-tables
-- 修改root密碼
密碼加密函式password()
update mysql.user set password=password('root');

SHOW PROCESSLIST -- 顯示哪些執行緒正在執行
SHOW VARIABLES -- 

/* 資料庫操作 */ ------------------
-- 檢視當前資料庫
    select database();
-- 顯示當前時間、使用者名稱、資料庫版本
    select now(), user(), version();
-- 建立庫
    create database[ if not exists] 資料庫名 資料庫選項
    資料庫選項:
        CHARACTER SET charset_name
        COLLATE collation_name
-- 檢視已有庫
    show databases[ like 'pattern']
-- 檢視當前庫資訊
    show create database 資料庫名
-- 修改庫的選項資訊
    alter database 庫名 選項資訊
-- 刪除庫
    drop database[ if exists] 資料庫名
        同時刪除該資料庫相關的目錄及其目錄內容

/* 表的操作 */ ------------------
-- 建立表
    create [temporary] table[ if not exists] [庫名.]表名 ( 表的結構定義 )[ 表選項]
        每個欄位必須有資料型別
        最後一個欄位後不能有逗號
        temporary 臨時表,會話結束時表自動消失
        對於欄位的定義:
            欄位名 資料型別 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']
-- 表選項
    -- 字符集
        CHARSET = charset_name
        如果表沒有設定,則使用資料庫字符集
    -- 儲存引擎
        ENGINE = engine_name    
        表在管理資料時採用的不同的資料結構,結構不同會導致處理方式、提供的特性操作等不同
        常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive
        不同的引擎在儲存表的結構和資料時採用不同的方式
        MyISAM表文件含義:.frm表定義,.MYD表資料,.MYI表索引
        InnoDB表文件含義:.frm表定義,表空間資料和日誌檔案
        SHOW ENGINES -- 顯示儲存引擎的狀態資訊
        SHOW ENGINE 引擎名 {LOGS|STATUS} -- 顯示儲存引擎的日誌或狀態資訊
    -- 資料檔案目錄
        DATA DIRECTORY = '目錄'
    -- 索引檔案目錄
        INDEX DIRECTORY = '目錄'
    -- 表註釋
        COMMENT = 'string'
    -- 分割槽選項
        PARTITION BY ... (詳細見手冊)
-- 檢視所有表
    SHOW TABLES[ LIKE 'pattern']
    SHOW TABLES FROM 表名
-- 查看錶機構
    SHOW CREATE TABLE 表名    (資訊更詳細)
    DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']
    SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
-- 修改表
    -- 修改表本身的選項
        ALTER TABLE 表名 表的選項
        EG:    ALTER TABLE 表名 ENGINE=MYISAM;
    -- 對錶進行重新命名
        RENAME TABLE 原表名 TO 新表名
        RENAME TABLE 原表名 TO 庫名.表名    (可將表移動到另一個數據庫)
        -- RENAME可以交換兩個表名
    -- 修改表的欄位機構
        ALTER TABLE 表名 操作名
        -- 操作名
            ADD[ COLUMN] 欄位名        -- 增加欄位
                AFTER 欄位名            -- 表示增加在該欄位名後面
                FIRST                -- 表示增加在第一個
            ADD PRIMARY KEY(欄位名)    -- 建立主鍵
            ADD UNIQUE [索引名] (欄位名)-- 建立唯一索引
            ADD INDEX [索引名] (欄位名)    -- 建立普通索引
            ADD 
            DROP[ COLUMN] 欄位名        -- 刪除欄位
            MODIFY[ COLUMN] 欄位名 欄位屬性        -- 支援對欄位屬性進行修改,不能修改欄位名(所有原有屬性也需寫上)
            CHANGE[ COLUMN] 原欄位名 新欄位名 欄位屬性        -- 支援對欄位名修改
            DROP PRIMARY KEY    -- 刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性)
            DROP