MySQL技術(shù)參考手冊(cè)_第1頁(yè)
MySQL技術(shù)參考手冊(cè)_第2頁(yè)
MySQL技術(shù)參考手冊(cè)_第3頁(yè)
MySQL技術(shù)參考手冊(cè)_第4頁(yè)
MySQL技術(shù)參考手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩146頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

目錄

SQL語(yǔ)言概述5

什么是SQL5

NoSQL5

關(guān)系數(shù)據(jù)庫(kù)概述5

數(shù)據(jù)模型7

數(shù)據(jù)類型10

主流關(guān)系數(shù)據(jù)庫(kù)12

SQL12

語(yǔ)法特點(diǎn)13

關(guān)系模型13

MySQL入門(mén)24

MariaDB25

Aurora25

PolarDB25

安裝MySQL26

設(shè)置一個(gè)MySQL用戶帳號(hào)27

MySQLAccountsandLoginAccounts28

運(yùn)行MySQL28

創(chuàng)建數(shù)據(jù)庫(kù)和示例表28

啟動(dòng)和終止mysql30

使用選項(xiàng)文件指定連接參數(shù)32

保護(hù)選項(xiàng)文件34

混合命令行和選項(xiàng)文件參數(shù)34

如果無(wú)法找到mysql該怎么辦35

設(shè)置環(huán)境變量36

發(fā)出查詢40

發(fā)出查詢41

選擇數(shù)據(jù)庫(kù)42

TemporarilyUsingaTablefromAnotherDatabase43

取消部分輸入的查詢43

重復(fù)和編輯查詢44

使用數(shù)據(jù)庫(kù)和表名稱的自動(dòng)完成46

在查詢中使用SQL變量47

告訴mysql從文件中讀取查詢語(yǔ)句49

告訴mysql從其它程序中讀取查詢52

在命令行上指定查詢53

使用復(fù)制和粘貼作為mysql輸入源54

防止查詢輸出從屏幕滾動(dòng)54

SendingQueryOutputtoaFileortoaProgram56

選擇表格或表格分隔的查詢輸出格式57

指定任意輸出列分隔符58

產(chǎn)生HTML輸出59

生成XML輸出60

在查詢輸出中禁止列標(biāo)題61

編號(hào)查詢輸出行62

使長(zhǎng)輸出行更具可讀性63

控制mysql的冗位級(jí)別64

記錄交互式mysql會(huì)話65

從以前執(zhí)行的查詢創(chuàng)建mysql腳本66

使用mysql作為計(jì)算器66

在Shell腳本中使用mysql68

使用可執(zhí)行程序69

查找DOS提示限制?73

查詢數(shù)據(jù)73

準(zhǔn)備數(shù)據(jù)73

MySQL75

基本查詢75

條件查詢78

投影查詢80

排序81

分頁(yè)查詢82

聚合查詢85

多表查詢88

連接直詢90

修改數(shù)據(jù)93

INSERT93

UPDATE94

DELETE96

MySQL命令97

數(shù)據(jù)庫(kù)的操作125

數(shù)據(jù)表操作125

數(shù)據(jù)操作126

列屬性126

數(shù)值類型127

1.整數(shù)127

2.小數(shù)127

日期時(shí)間型128

字符串類型128

管理MySQL130

數(shù)據(jù)庫(kù)130

表131

退出MySQL133

實(shí)用SQL語(yǔ)句133

插入或替換134

插入或更新134

插入或忽略134

快照134

寫(xiě)入查詢結(jié)果集135

事務(wù)136

隔離級(jí)別137

ReadUncommitted138

ReadCommitted140

RepeatableRead141

Serializable143

默認(rèn)隔離級(jí)別143

?MySQL命令執(zhí)行SQL文件的方法143

SQL語(yǔ)言概述

什么是SQL

簡(jiǎn)單地說(shuō),SQL就是訪問(wèn)和處理關(guān)系數(shù)據(jù)庫(kù)的計(jì)算機(jī)標(biāo)準(zhǔn)語(yǔ)言。也就是說(shuō),無(wú)論用什么編程語(yǔ)言

(Java、Python,C++……)編寫(xiě)程序,只要涉及到操作關(guān)系數(shù)據(jù)庫(kù),比如,一個(gè)電商網(wǎng)站需要把

用戶和商品信息存入數(shù)據(jù)庫(kù),或者一個(gè)手機(jī)游戲需要把用戶的道具、通關(guān)信息存入數(shù)據(jù)庫(kù),都必

須通過(guò)SQL來(lái)完成。

所以,現(xiàn)代程序離不開(kāi)關(guān)系數(shù)據(jù)庫(kù),要使用關(guān)系數(shù)據(jù)庫(kù)就必須掌握SQL。

在本教程中,你將學(xué)到關(guān)系數(shù)據(jù)庫(kù)的基本概念,如何使用SQL操作數(shù)據(jù)庫(kù),以及一種最流行的開(kāi)

源數(shù)據(jù)庫(kù)MySQL的基本安裝和使用方法。

NoSQL

你可能還聽(tīng)說(shuō)過(guò)NoSQL數(shù)據(jù)庫(kù),也就是非SQL的數(shù)據(jù)庫(kù),包括MongoDB、Cassandra.

Dynamo等等,它們都不是關(guān)系數(shù)據(jù)庫(kù)。有很多人鼓吹現(xiàn)代Web程序已經(jīng)無(wú)需關(guān)系數(shù)據(jù)庫(kù)了,只

需要使用NoSQL就可以。但事實(shí)上,SQL數(shù)據(jù)庫(kù)從始至終從未被取代過(guò)?;仡櫼幌翹oSQL的

發(fā)展歷程:

?1970:NoSQL=WehavenoSQL

?1980:NoSQL=KnowSQL

?2000:NoSQL=NoSQL!

?2005:NoSQL=NotonlySQL

?2013:NoSQL=No,SQL!

今天,SQL數(shù)據(jù)庫(kù)仍然承擔(dān)了各種應(yīng)用程序的核心數(shù)據(jù)存儲(chǔ),而NoSQL數(shù)據(jù)庫(kù)作為SQL數(shù)據(jù)庫(kù)

的補(bǔ)充,兩者不再是二選一的問(wèn)題,而是主從關(guān)系。所以,無(wú)論使用哪種編程語(yǔ)言,無(wú)論是Web

開(kāi)發(fā)、游戲開(kāi)發(fā)還是手機(jī)開(kāi)發(fā),掌握SQL,是所有軟件開(kāi)發(fā)人員所必須的。

關(guān)系數(shù)據(jù)庫(kù)概述

為什么需要數(shù)據(jù)庫(kù)?

因?yàn)閼?yīng)用程序需要保存用戶的數(shù)據(jù),比如Word需要把用戶文檔保存起來(lái),以便下次繼續(xù)編輯或

者拷貝到另一臺(tái)電腦。

要保存用戶的數(shù)據(jù),一個(gè)最簡(jiǎn)單的方法是把用戶數(shù)據(jù)寫(xiě)入文件。例如,要保存一個(gè)班級(jí)所有學(xué)生

的信息,可以向文件中寫(xiě)入一個(gè)CSV文件:

id,name,gender,score

1,小明,M,90

2,小紅,F(xiàn),95

3,小軍,M,88

4,小麗,F(xiàn),88

如果要保存學(xué)校所有班級(jí)的信息,可以寫(xiě)入另一個(gè)CSV文件。

但是,隨著應(yīng)用程序的功能越來(lái)越復(fù)雜,數(shù)據(jù)量越來(lái)越大,如何管理這些數(shù)據(jù)就成了大問(wèn)題:

?讀寫(xiě)文件并解析出數(shù)據(jù)需要大量重復(fù)代碼;

?從成千上萬(wàn)的數(shù)據(jù)中快速查詢出指定數(shù)據(jù)需要復(fù)雜的邏輯。

如果每個(gè)應(yīng)用程序都各自寫(xiě)自己的讀寫(xiě)數(shù)據(jù)的代碼,一方面效率低,容易出錯(cuò),另一方面,每個(gè)應(yīng)用

程序訪問(wèn)數(shù)據(jù)的接口都不相同,數(shù)據(jù)難以復(fù)用。

所以,數(shù)據(jù)庫(kù)作為一種專門(mén)管理數(shù)據(jù)的軟件就出現(xiàn)了。應(yīng)用程序不需要自己管理數(shù)據(jù),而是通過(guò)數(shù)據(jù)

庫(kù)軟件提供的接口來(lái)讀寫(xiě)數(shù)據(jù)。至于數(shù)據(jù)本身如何存儲(chǔ)到文件,那是數(shù)據(jù)庫(kù)軟件的事情,應(yīng)用程序自

己并不關(guān)心:

II

|applicationI

II

read||write

II

database

這樣一來(lái),編寫(xiě)應(yīng)用程序的時(shí)候,數(shù)據(jù)讀寫(xiě)的功能就被大大地簡(jiǎn)化了。

數(shù)據(jù)模型

數(shù)據(jù)庫(kù)按照數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù),實(shí)際上,數(shù)據(jù)庫(kù)一共有三種模型:

?層次模型

?網(wǎng)狀模型

?關(guān)系模型

層次模型就是以“上下級(jí)”的層次關(guān)系來(lái)組織數(shù)據(jù)的一種方式,層次模型的數(shù)據(jù)結(jié)構(gòu)看起來(lái)就像一

顆樹(shù):

I

IIIIII

網(wǎng)狀模型把每個(gè)數(shù)據(jù)節(jié)點(diǎn)和其它很多節(jié)點(diǎn)都連接起來(lái),它的數(shù)據(jù)結(jié)構(gòu)看起來(lái)就像很多城市之間的

路網(wǎng):

關(guān)系模型把數(shù)據(jù)看作是一個(gè)二維表格,任何數(shù)據(jù)都可以通過(guò)行號(hào)+列號(hào)來(lái)唯一確定,它的數(shù)據(jù)模

型看起來(lái)就是一個(gè)Excel表:

隨著時(shí)間的推移和市場(chǎng)競(jìng)爭(zhēng),最終,基于關(guān)系模型的關(guān)系數(shù)據(jù)庫(kù)獲得了絕對(duì)市場(chǎng)份額。

為什么關(guān)系數(shù)據(jù)庫(kù)獲得了最廣泛的應(yīng)用?

因?yàn)橄啾葘哟文P秃途W(wǎng)狀模型,關(guān)系模型理解和使用起來(lái)最簡(jiǎn)單。

關(guān)系數(shù)據(jù)庫(kù)的關(guān)系模型是基于數(shù)學(xué)理論建立的。我們把域(Domain)定義為一組具有相同數(shù)據(jù)類

型的值的集合,給定一組域D1,D2,...,Dn,它們的笛卡爾集定義為

D1XD2X……xDn={(d1,d2,…,dn)|dieDi,i=1,2,...,n},而D1xD2x……xDn的子集叫作在域

D1,D2Dn上的關(guān)系,表示為R(D1,D2,...,Dn),這里的R表示$#%&"@!&$#;!~%¥%:(……算

了,根本講不明白,大家也不用理解。

基于數(shù)學(xué)理論的關(guān)系模型雖然講起來(lái)挺復(fù)雜,但是,基于日常生活的關(guān)系模型卻十分容易理解。

我們以學(xué)校班級(jí)為例,一個(gè)班級(jí)的學(xué)生就可以用一個(gè)表格存起來(lái),并且定義如下:

姓班級(jí)性年

ID名ID別齡

1小201M9

2小202F8

3小202M8

4小201F9

其中,班級(jí)ID對(duì)應(yīng)著另一個(gè)班級(jí)表:

|D名稱任

201二年級(jí)一王老

班師

202二年級(jí)二李老

班師

通過(guò)給定一個(gè)班級(jí)名稱,可以查到一條班級(jí)記錄,根據(jù)班級(jí)ID,又可以查到多條學(xué)生記錄,這

樣,二維表之間就通過(guò)ID映射建立了“一對(duì)多”關(guān)系。

數(shù)據(jù)類型

對(duì)于一個(gè)關(guān)系表,除了定義每一列的名稱外,還需要定義每一列的數(shù)據(jù)類型。關(guān)系數(shù)據(jù)庫(kù)支持的標(biāo)準(zhǔn)

數(shù)據(jù)類型包括數(shù)值、字符串、時(shí)間等:

名稱類型說(shuō)明

INT整型4字節(jié)整數(shù)類型,范圍約+/-21億

BIGINT長(zhǎng)整型8字節(jié)整數(shù)類型,范圍約+/-922億億

REAL浮點(diǎn)型4字節(jié)浮點(diǎn)數(shù),范圍約+/-10相

DOUBLE浮點(diǎn)型8字節(jié)浮點(diǎn)數(shù),范圍約+/-1088

名稱類型說(shuō)明

DECIMAL(M,N)高精度小數(shù)由用戶指定精度的小數(shù),例如,DECIMAL(20,10)表示一共20位,其中小數(shù)10

計(jì)算

CHAR(N)定長(zhǎng)字符串存儲(chǔ)指定長(zhǎng)度的字符串,例如,CHAR0OO)總是存儲(chǔ)100個(gè)字符的字符串

VARCHAR(N)變長(zhǎng)字符串存儲(chǔ)可變長(zhǎng)度的字符串,例如,VARCHAR(IOO)可以存儲(chǔ)0T00個(gè)字符的字符1

BOOLEAN布爾類型存儲(chǔ)True或者False

DATE日期類型存儲(chǔ)日期,例如,2018-06-22

TIME時(shí)間類型存儲(chǔ)時(shí)間,例如,12:20:59

DATETIME日期和時(shí)間類存儲(chǔ)日期+時(shí)間,例如,2018-06-2212:20:59

上面的表中列舉了最常用的數(shù)據(jù)類型。很多數(shù)據(jù)類型還有別名,例如,REAL又可以寫(xiě)成FL0AT(24)o

還有一些不常用的數(shù)據(jù)類型,例如,TINYINT(范圍在0~255)。各數(shù)據(jù)庫(kù)廠商還會(huì)支持特定的數(shù)據(jù)類

型,例如JSON.

選擇數(shù)據(jù)類型的時(shí)候,要根據(jù)業(yè)務(wù)規(guī)則選擇合適的類型。通常來(lái)說(shuō),BIGINT能滿足整數(shù)存儲(chǔ)的需求,

VARCHAR(N)能滿足字符串存儲(chǔ)的需求,這兩種類型是使用最廣泛的。

主流關(guān)系數(shù)據(jù)庫(kù)

目前,主流的關(guān)系數(shù)據(jù)庫(kù)主要分為以下幾類:

1.商用數(shù)據(jù)庫(kù),例如:Oracle,SQLServer,DB2等;

2.開(kāi)源數(shù)據(jù)庫(kù),例如:MvSQL,PostareSQL等;

3.桌面數(shù)據(jù)庫(kù),以微軟Access為代表,適合桌面應(yīng)用程序使用;

4.嵌入式數(shù)據(jù)庫(kù),以Sqlite為代表,適合手機(jī)應(yīng)用和桌面程序。

SQL

什么是SQL?SQL是結(jié)構(gòu)化查詢語(yǔ)言的縮寫(xiě),用來(lái)訪問(wèn)和操作數(shù)據(jù)庫(kù)系統(tǒng)。SQL語(yǔ)句既可以查詢數(shù)

據(jù)庫(kù)中的數(shù)據(jù),也可以添加、更新和刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù),還可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理和維護(hù)操作。不

同的數(shù)據(jù)庫(kù),都支持SQL,這樣,我們通過(guò)學(xué)習(xí)SQL這一種語(yǔ)言,就可以操作各種不同的數(shù)據(jù)庫(kù)。

雖然SQL已經(jīng)被ANSI組織定義為標(biāo)準(zhǔn),不幸地是,各個(gè)不同的數(shù)據(jù)庫(kù)對(duì)標(biāo)準(zhǔn)的SQL支持不太一

致。并且,大部分?jǐn)?shù)據(jù)庫(kù)都在標(biāo)準(zhǔn)的SQL上做了擴(kuò)展。也就是說(shuō),如果只使用標(biāo)準(zhǔn)SQL,理論上所

有數(shù)據(jù)庫(kù)都可以支持,但如果使用某個(gè)特定數(shù)據(jù)庫(kù)的擴(kuò)展SQL,換一個(gè)數(shù)據(jù)庫(kù)就不能執(zhí)行了。例如,

Oracle把自己擴(kuò)展的SQL稱為PL/SQL,Microsoft把自己擴(kuò)展的SQL稱為T(mén)-SQL0

現(xiàn)實(shí)情況是,如果我們只使用標(biāo)準(zhǔn)SQL的核心功能,那么所有數(shù)據(jù)庫(kù)通常都可以執(zhí)行。不常用的

SQL功能,不同的數(shù)據(jù)庫(kù)支持的程度都不一樣。而各個(gè)數(shù)據(jù)庫(kù)支持的各自擴(kuò)展的功能,通常我們把它

們稱之為“方言”。

總的來(lái)說(shuō),SQL語(yǔ)言定義了這么幾種操作數(shù)據(jù)庫(kù)的能力:

DDL:DataDefinitionLanguage

DDL允許用戶定義數(shù)據(jù),也就是創(chuàng)建表、刪除表、修改表結(jié)構(gòu)這些操作。通常,DDL由數(shù)據(jù)庫(kù)管理員

執(zhí)行。

DML:DataManipulationLanguage

DML為用戶提供添加、刪除、更新數(shù)據(jù)的能力,這些是應(yīng)用程序?qū)?shù)據(jù)庫(kù)的日常操作。

DQL:DataQueryLanguage

DQL允許用戶查詢數(shù)據(jù),這也是通常最頻繁的數(shù)據(jù)庫(kù)日常操作。

語(yǔ)法特點(diǎn)

SQL語(yǔ)言關(guān)鍵字不區(qū)分大小寫(xiě)?。?!但是,針對(duì)不同的數(shù)據(jù)庫(kù),對(duì)于表名和列名,有的數(shù)據(jù)庫(kù)區(qū)分大

小寫(xiě),有的數(shù)據(jù)庫(kù)不區(qū)分大小寫(xiě)。同一個(gè)數(shù)據(jù)庫(kù),有的在Linux上區(qū)分大〃與,有的在Windows上不

區(qū)分大4與。

所以,本教程約定:SQL關(guān)鍵字總是大寫(xiě),以示突出,表名和列名均使用小寫(xiě)。

關(guān)系模型

我們已經(jīng)知道,關(guān)系數(shù)據(jù)庫(kù)是建立在關(guān)系模型上的。而關(guān)系模型本質(zhì)上就是若干個(gè)存儲(chǔ)數(shù)據(jù)的二維

表,可以把它們看作很多Excel表。

表的每一行稱為記錄(Record),記錄是一個(gè)邏輯意義上的數(shù)據(jù)。

表的每一列稱為字段(Column),同一個(gè)表的每一行記錄都擁有相同的若干字段。

字段定義了數(shù)據(jù)類型(整型、浮點(diǎn)型、字符串、日期等),以及是否允許為NULL。注意NULL表示字

段數(shù)據(jù)不存在。一個(gè)整型字段如果為NULL不表示它的值為。,同樣的,一個(gè)字符串型字段為NULL也

不表示它的值為空串

通常情況下,字段應(yīng)該避免允許為NULL。不允許為NULL可以簡(jiǎn)化查詢條件,加快查詢速度,也利

于應(yīng)用程序讀取數(shù)據(jù)后無(wú)需判斷是否為NULL.

和Excel表有所不同的是,關(guān)系數(shù)據(jù)庫(kù)的表和表之間需要建立“一對(duì)多”,“多對(duì)一”和“一對(duì)一”的關(guān)系,

這樣才能夠按照應(yīng)用程序的邏輯來(lái)組織和存儲(chǔ)數(shù)據(jù)。

例如,一個(gè)班級(jí)表:

ID名稱班主任

201二年級(jí)一班王老師

202二年級(jí)二班李老師

每一行對(duì)應(yīng)著一個(gè)班級(jí),而一個(gè)班級(jí)對(duì)應(yīng)著多個(gè)學(xué)生,所以班級(jí)表和學(xué)生表的關(guān)系就是“一對(duì)多”:

ID姓名班級(jí)ID性別

1小明201M

2小紅202F

3小軍202M

4小白201F

反過(guò)來(lái),如果我們先在學(xué)生表中定位了一行記錄,例如ID=1的小明,要確定他的班級(jí),只需要根據(jù)他

的“班級(jí)ID”對(duì)應(yīng)的值2。1找到班級(jí)表中ID=201的記錄,即二年級(jí)一班。所以,學(xué)生表和班級(jí)表是“多

對(duì)一”的關(guān)系。

如果我們把班級(jí)表分拆得細(xì)一點(diǎn),例如,單獨(dú)創(chuàng)建一個(gè)教師表:

ID名稱年齡

A1王老師26

A2張老師39

A3李老師32

A4趙老師27

班級(jí)表只存儲(chǔ)教師ID:

ID名稱班主任ID

201二年級(jí)一班Al

202二年級(jí)二班A3

這樣,一個(gè)班級(jí)總是對(duì)應(yīng)一個(gè)教師,班級(jí)表和教師表就是“一對(duì)一”關(guān)系。

在關(guān)系數(shù)據(jù)庫(kù)中,關(guān)系是通過(guò)主鍵和外鍵來(lái)維護(hù)的。我們?cè)诤竺鏁?huì)分別深入講解。

主鍵

在關(guān)系數(shù)據(jù)庫(kù)中,一張表中的每一行數(shù)據(jù)被稱為一條記錄。一條記錄就是由多個(gè)字段組成的。例如,

students表的兩行記錄:

idclassjdnamegenderscore

11小明M90

21小紅F95

每一條記錄都包含若干定義好的字段。同一個(gè)表的所有記錄都有相同的字段定義。

對(duì)于關(guān)系表,有個(gè)很重要的約束,就是任意兩條記錄不能重復(fù)。不能重復(fù)不是指兩條記錄不完全相

同,而是指能夠通過(guò)某個(gè)字段唯一區(qū)分出不同的記錄,這個(gè)字段被稱為主鍵。

例如,假設(shè)我們把name字段作為主鍵,那么通過(guò)名字小明或小紅就能唯一確定一條記錄。但是,這么

設(shè)定,就沒(méi)法存儲(chǔ)同名的同學(xué)了,因?yàn)椴迦胂嗤麈I的兩條記錄是不被允許的。

對(duì)主鍵的要求,最關(guān)鍵的一點(diǎn)是:記錄一旦插入到表中,主鍵最好不要再修改,因?yàn)橹麈I是用來(lái)唯一

定位記錄的,修改了主鍵,會(huì)造成一系列的影響。

由于主鍵的作用十分重要,如何選取主鍵會(huì)對(duì)業(yè)務(wù)開(kāi)發(fā)產(chǎn)生重要影響。如果我們以學(xué)生的身份證號(hào)作

為主鍵,似乎能唯一定位記錄。然而,身份證號(hào)也是一種業(yè)務(wù)場(chǎng)景,如果身份證號(hào)升位了,或者需要

變更,作為主鍵,不得不修改的時(shí)候,就會(huì)對(duì)業(yè)務(wù)產(chǎn)生嚴(yán)重影響。

所以,選取主鍵的一個(gè)基本原則是:不使用任何業(yè)務(wù)相關(guān)的字段作為主鍵。

因此,身份證號(hào)、手機(jī)號(hào)、郵箱地址這些看上去可以唯一的字段,均不可用作主鍵。

作為主鍵最好是完全業(yè)務(wù)無(wú)關(guān)的字段,我們一般把這個(gè)字段命名為id。常見(jiàn)的可作為id字段的類型

有:

1.自增整數(shù)類型:數(shù)據(jù)庫(kù)會(huì)在插入數(shù)據(jù)時(shí)自動(dòng)為每一條記錄分配一個(gè)自增整數(shù),這樣我們就完全不用擔(dān)

心主鍵重復(fù),也不用自己預(yù)先生成主鍵;

2.全局唯一GUID類型:使用一種全局唯一的字符串作為主鍵,類似8f55d96b-8acc-4636-8cb8-

76bf8abe2f57。GUID算法通過(guò)網(wǎng)卡MAC地址、時(shí)間戳和隨機(jī)數(shù)保證任意計(jì)算機(jī)在任意時(shí)間生成的字

符串都是不同的,大部分編程語(yǔ)言都內(nèi)置了GUID算法,可以自己預(yù)算出主鍵。

對(duì)于大部分應(yīng)用來(lái)說(shuō),通常自增類型的主鍵就能滿足需求。我們?cè)赟tudents表中定義的主鍵也是

BIGINTNOTNULLAUTO_INCREMENT類型。

如果使用INT自增類型,那么當(dāng)一張表的記錄數(shù)超過(guò)2147483647(約21億)時(shí),會(huì)達(dá)到上限而出

錯(cuò)。使用BIGINT自增類型則可以最多約922億億條記錄。

聯(lián)合主鍵

關(guān)系數(shù)據(jù)庫(kù)實(shí)際上還允許通過(guò)多個(gè)字段唯一標(biāo)識(shí)記錄,即兩個(gè)或更多的字段都設(shè)置為主鍵,這種主鍵

被稱為聯(lián)合主鍵。

對(duì)于聯(lián)合主鍵,允許一列有重復(fù),只要不是所有主鍵列都重復(fù)即可:

other

id_numid_typecolumns...

1A

other

id_numid_typecolumns...

2A

2B...

如果我們把上述表的id_num和id.type這兩列作為聯(lián)合主鍵,那么上面的3條記錄都是允許的,因?yàn)?/p>

沒(méi)有兩列主鍵組合起來(lái)是相同的。

沒(méi)有必要的情況下,我們盡量不使用聯(lián)合主鍵,因?yàn)樗o關(guān)系表帶來(lái)了復(fù)雜度的上升。

小結(jié)

主鍵是關(guān)系表中記錄的唯一標(biāo)識(shí)。主鍵的選取非常重要:主鍵不要帶有業(yè)務(wù)含義,而應(yīng)該使用

BIGINT自增或者GUID類型。主鍵也不應(yīng)該允許NULL。

可以使用多個(gè)列作為聯(lián)合主鍵,但聯(lián)合主鍵并不常用。

外鍵

當(dāng)我們用主鍵唯一標(biāo)識(shí)記錄時(shí),我們就可以在students表中確定任意一個(gè)學(xué)生的記錄:

idnameothercolumns...

1小明

2小紅

我們還可以在classes表中確定任意一個(gè)班級(jí)記錄:

idnameothercolumns...

1一班...

2二班…

但是我們?nèi)绾未_定students表的一條記錄,例如,id=l的小明,屬于哪個(gè)班級(jí)呢?

由于一個(gè)班級(jí)可以有多個(gè)學(xué)生,在關(guān)系模型中,這兩個(gè)表的關(guān)系可以稱為“一對(duì)多”,即一個(gè)classes

的記錄可以對(duì)應(yīng)多個(gè)students表的記錄。

為了表達(dá)這種一對(duì)多的關(guān)系,我們需要在students表中加入一列class_idr讓它的值與classes表的

某條記錄相對(duì)應(yīng):

idclassidnameothercolumns...

11小明…

21小紅...

52小白…

這樣,我們就可以根據(jù)classed這個(gè)列直接定位出一個(gè)students表的記錄應(yīng)該對(duì)應(yīng)到classes的哪

條記錄。

例如:

?小明的classed是1,因此,對(duì)應(yīng)的classes表的記錄是id=l的一班;

?小紅的class_id是1,因此,對(duì)應(yīng)的classes表的記錄是id=l的一班;

?小白的class_id是2,因此,對(duì)應(yīng)的classes表的記錄是id=2的二班。

在students表中,通過(guò)class.id的字段,可以把數(shù)據(jù)與另一張表關(guān)聯(lián)起來(lái),這種列稱為外鍵

外鍵并不是通過(guò)列名實(shí)現(xiàn)的,而是通過(guò)定義外鍵約束實(shí)現(xiàn)的:

ALTERTABLEstudents

ADDCONSTRAINTfk_class_id

FOREIGNKEY(class_id)

REFERENCESclasses(id);

其中,外鍵約束的名稱fk_class_id可以任意,FOREIGNKEY(classed)指定了class_id作為外鍵,

REFERENCESclasses(id)指定了這個(gè)外鍵將關(guān)聯(lián)到classes表的id列(即classes表的主鍵)。

通過(guò)定義外鍵約束,關(guān)系數(shù)據(jù)庫(kù)可以保證無(wú)法插入無(wú)效的數(shù)據(jù)。即如果classes表不存在id=99的記

錄,students表就無(wú)法插入class_id=99的記錄。

由于外健約束會(huì)降低數(shù)據(jù)庫(kù)的性能,大部分互聯(lián)網(wǎng)應(yīng)用程序?yàn)榱俗非笏俣龋⒉辉O(shè)置外健約束,而是

僅靠應(yīng)用程序自身來(lái)保證邏輯的正確性。這種情況下,class_id僅僅是一個(gè)普通的列,只是它起到了

外鍵的作用而已。

要?jiǎng)h除一個(gè)外鍵約束,也是通過(guò)ALTERTABLE實(shí)現(xiàn)的:

ALTERTABLEstudents

DROPFOREIGNKEYfk_class_id;

注意:刪除外鍵約束并沒(méi)有刪除夕隧這一列。刪除列是通過(guò)DROPCOLUMN...實(shí)現(xiàn)的。

多對(duì)多

通過(guò)一個(gè)表的外鍵關(guān)聯(lián)到另一個(gè)表,我們可以定義出一對(duì)多關(guān)系。有些時(shí)候,還需要定義多對(duì)多”關(guān)

系。例如,一個(gè)老師可以對(duì)應(yīng)多個(gè)班級(jí),一個(gè)班級(jí)也可以對(duì)應(yīng)多個(gè)老師,因此,班級(jí)表和老師表存在

多對(duì)多關(guān)系。

多對(duì)多關(guān)系實(shí)際上是通過(guò)兩個(gè)一對(duì)多關(guān)系實(shí)現(xiàn)的,即通過(guò)一個(gè)中間表,關(guān)聯(lián)兩個(gè)一對(duì)多關(guān)系,就形成

了多對(duì)多關(guān)系:

teachers表:

idname

1張老師

2王老師

3李老師

4趙老師

classes表:

idname

1一班

2二班

中間表teacher_class關(guān)聯(lián)兩^一對(duì)多關(guān)系:

idteacherjdclassjd

111

212

idteacher_idclassjd

321

422

531

642

通過(guò)中間表teacher_class可知teachers到classes的關(guān)系:

?id=l的張老師對(duì)應(yīng)id=l,2的一班和二班;

?id=2的王老師對(duì)應(yīng)id=l,2的一班和二班;

?id=3的李老師對(duì)應(yīng)id=l的一班;

?id=4的趙老師對(duì)應(yīng)id=2的二班。

同理可知classes到teachers的關(guān)系:

?id=l的一班對(duì)應(yīng)id=l,2,3的張老師、王老師和李老師;

?id=2的二班對(duì)應(yīng)id=I,2,4的張老師、王老師和趙老師;

因此,通過(guò)中間表,我們就定義了一個(gè)“多對(duì)多”關(guān)系。

一對(duì)一

一對(duì)一關(guān)系是指,一個(gè)表的記錄對(duì)應(yīng)到另一個(gè)表的唯一個(gè)記錄。

例如,students表的每個(gè)學(xué)生可以有自己的聯(lián)系方式,如果把聯(lián)系方式存入另一個(gè)表contacts,我們

就可以得到一個(gè)“一對(duì)一”關(guān)系:

idstudent_idmobile

11135xxxx6300

22138xxxx2209

35139xxxx8086

有細(xì)心的童鞋會(huì)問(wèn),既然是一對(duì)一關(guān)系,那為啥不給students表增加一個(gè)mobile歹1),這樣就能合二

為一了?

如果業(yè)務(wù)允許,完全可以把兩個(gè)表合為一個(gè)表。但是,有些時(shí)候,如果某個(gè)學(xué)生沒(méi)有手機(jī)號(hào),那么,

contacts表就不存在對(duì)應(yīng)的記錄。實(shí)際上,一對(duì)一關(guān)系準(zhǔn)確地說(shuō),是contacts表一對(duì)一對(duì)應(yīng)

students表。

還有一些應(yīng)用會(huì)把一個(gè)大表拆成兩個(gè)一對(duì)一的表,目的是把經(jīng)常讀取和不經(jīng)常讀取的字段分開(kāi),以獲

得更高的性能。例如,把一個(gè)大的用戶表分拆為用戶基本信息表usejinf。和用戶詳細(xì)信息表

user_profiles,大部分時(shí)候,只需要查詢user_info表,并不需要查詢user_profiles表,這樣就提

高了查詢速度。

小結(jié)

關(guān)系數(shù)據(jù)庫(kù)通過(guò)外鍵可以實(shí)現(xiàn)一對(duì)多、多對(duì)多和一對(duì)一的關(guān)系。外鍵既可以通過(guò)數(shù)據(jù)庫(kù)來(lái)約束,也可

以不設(shè)置約束,僅依靠應(yīng)用程序的邏輯來(lái)保證。

索引

在關(guān)系數(shù)據(jù)庫(kù)中,如果有上萬(wàn)甚至上億條記錄,在查找記錄的時(shí)候,想要獲得非??斓乃俣?,就需要

使用索引。

索引是關(guān)系數(shù)據(jù)庫(kù)中對(duì)某一列或多個(gè)列的值進(jìn)行預(yù)排序的數(shù)據(jù)結(jié)構(gòu)。通過(guò)使用索引,可以讓數(shù)據(jù)庫(kù)系

統(tǒng)不必掃描整個(gè)表,而是直接定位到符合條件的記錄,這樣就大大加快了查詢速度。

例女口,對(duì)于students表:

idclass_idnamegenderscore

11小明M90

21小紅F95

31小軍M88

如果要經(jīng)常根據(jù)score列進(jìn)行查詢,就可以對(duì)score列創(chuàng)建索引

ALTERTABLEstudents

ADDINDEXidx_score(score);

使用ADDINDEXidx_score(score)就創(chuàng)建了一個(gè)名稱為idx_score,使用列score的索引。索引名稱

是任意的,索引如果有多列,可以在括號(hào)里依次寫(xiě)上,例如:

ALTERTABLEstudents

ADDINDEXidx_name_score(name,score);

索引的效率取決于索引列的值是否散列,即該列的值如果越互不相同,那么索引效率越高。反過(guò)來(lái),

如果記錄的列存在大量相同的值,例如gender列,大約一半的記錄值是M,另一半是F,因此,對(duì)該

列創(chuàng)建索引就沒(méi)有意義。

可以對(duì)一張表創(chuàng)建多個(gè)索引。索引的優(yōu)點(diǎn)是提高了查詢效率,缺點(diǎn)是在插入、更新和刪除記錄時(shí),需

要同時(shí)修改索引,因此,索引越多,插入、更新和刪除記錄的速度就越慢。

對(duì)于主鍵,關(guān)系數(shù)據(jù)庫(kù)會(huì)自動(dòng)對(duì)其創(chuàng)建主鍵索引。使用主鍵索引的效率是最高的,因?yàn)橹麈I會(huì)保證絕

對(duì)唯一。

唯一索引

在設(shè)計(jì)關(guān)系數(shù)據(jù)表的時(shí)候,看上去唯一的列,例如身份證號(hào)、郵箱地址等,因?yàn)樗麄兙哂袠I(yè)務(wù)含義,

因此不宜作為主鍵。

但是,這些列根據(jù)業(yè)務(wù)要求,又具有唯一性約束:即不能出現(xiàn)兩條記錄存儲(chǔ)了同一個(gè)身份證號(hào)。這個(gè)

時(shí)候,就可以給該列添加一個(gè)唯一索引。例如,我們假設(shè)students表的name不能重復(fù):

ALTERTABLEstudents

ADDUNIQUEINDEXuni_name(name);

通過(guò)UNIQUE關(guān)鍵字我們就添加了一個(gè)唯一索引。

也可以只對(duì)某一列添加一個(gè)唯一約束而不創(chuàng)建唯一索引:

ALTERTABLEstudents

ADDCONSTRAINTuni_nameUNIQUE(name);

這種情況下,name列沒(méi)有索引,但仍然具有唯一性保證。

無(wú)論是否創(chuàng)建索引,對(duì)于用戶和應(yīng)用程序來(lái)說(shuō),使用關(guān)系數(shù)據(jù)庫(kù)不會(huì)有任何區(qū)別。這里的意思是說(shuō),

當(dāng)我們?cè)跀?shù)據(jù)庫(kù)中查詢時(shí),如果有相應(yīng)的索引可用,數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)自動(dòng)使用索引來(lái)提高查詢效率,

如果沒(méi)有索引,查詢也能正常執(zhí)行,只是速度會(huì)變慢。因此,索引可以在使用數(shù)據(jù)庫(kù)的過(guò)程中逐步優(yōu)

化。

小結(jié)

通過(guò)對(duì)數(shù)據(jù)庫(kù)表創(chuàng)建索引,可以提高查詢速度。

通過(guò)創(chuàng)建唯一索引,可以保證某一列的值具有唯一性。

數(shù)據(jù)庫(kù)索引對(duì)于用戶和應(yīng)用程序來(lái)說(shuō)都是透明的。

MySQL入門(mén)

MySQL是目前應(yīng)用最廣泛的開(kāi)源關(guān)系數(shù)據(jù)庫(kù)。MySQL最早是由瑞典的MySQLAB公司開(kāi)發(fā),

該公司在2008年被SUN公司收購(gòu),緊接著,SUN公司在2009年被Oracle公司收購(gòu),所

以MySQL最終就變成了Oracle旗下的產(chǎn)品。

和其它關(guān)系數(shù)據(jù)庫(kù)有所不同的是,MySQL本身實(shí)際上只是一個(gè)SQL接口,它的內(nèi)部還包含

了多種數(shù)據(jù)引擎,常用的包括:

?InnoDB:由InnobaseOy公司開(kāi)發(fā)的一款支持事務(wù)的數(shù)據(jù)庫(kù)引擎,2006年被Oracle收

購(gòu);

?MylSAM:MySQL早期集成的默認(rèn)數(shù)據(jù)庫(kù)引擎,不支持事務(wù)。

MySQL接口和數(shù)據(jù)庫(kù)引擎的關(guān)系就好比某某瀏覽器和瀏覽器引擎(IE引擎或Webkit引

擎)的關(guān)系。對(duì)用戶而言,切換瀏覽器引擎不影響瀏覽器界面,切換MySQL引擎不影響自

己寫(xiě)的應(yīng)用程序使用MySQL的接口。

使用MySQL時(shí),不同的表還可以使用不同的數(shù)據(jù)庫(kù)引擎。如果你不知道應(yīng)該采用哪種引

擎,記住總是選擇InnoDB就好了。

因?yàn)镸ySQL一開(kāi)始就是開(kāi)源的,所以基于MySQL的開(kāi)源版本,又衍生出了各種版本:

MariaDB

由MySQL的創(chuàng)始人創(chuàng)建的一個(gè)開(kāi)源分支版本,使用XtraDB引擎。

Aurora

由Amazon改進(jìn)的一個(gè)MySQL版本,專門(mén)提供給在AWS托管MySQL用戶,號(hào)稱5倍的性能

提升。

PolarDB

由Alibaba改進(jìn)的一個(gè)MySQL版本,專門(mén)提供給在阿里云托管的MySQL用戶,號(hào)稱6倍的

性能提升。

而MySQL官方版本又分了好幾個(gè)版本:

?CommunityEdition:社區(qū)開(kāi)源版本,免費(fèi);

?StandardEdition:標(biāo)準(zhǔn)版;

?EnterpriseEdition:企業(yè)版;

?ClusterCarrierGradeEdition:集群版。

以上版本的功能依次遞增,價(jià)格也依次遞增。不過(guò),功能增加的主要是監(jiān)控、集群等管理

功能,對(duì)于基本的SQL功能是完全一樣的。

所以使用MySQL就帶來(lái)了一個(gè)巨大的好處:可以在自己的電腦上安裝免費(fèi)的Community

Edition版本,進(jìn)行學(xué)習(xí)、開(kāi)發(fā)、測(cè)試,部署的時(shí)候,可以選擇付費(fèi)的高級(jí)版本,或者云

服務(wù)商提供的兼容版本,而不需要對(duì)應(yīng)用程序本身做改動(dòng)。

MySQL數(shù)據(jù)庫(kù)系統(tǒng)使用以服務(wù)器.),必/”為中心的客戶端-服務(wù)器體系結(jié)構(gòu)。服務(wù)器是實(shí)

際操作數(shù)據(jù)庫(kù)的程序??蛻舳顺绦虿恢苯舆@樣做;相反,他們通過(guò)結(jié)構(gòu)化查詢語(yǔ)言

(SQL)編寫(xiě)的查詢將您的意圖傳達(dá)給服務(wù)器??蛻舳顺绦虮镜匕惭b在您希望從中訪問(wèn)

MySQL的計(jì)算機(jī)上,但只要客戶端可以連接到服務(wù)器,服務(wù)器就可以安裝在任何位置。

MySQL是一個(gè)固有的網(wǎng)絡(luò)數(shù)據(jù)庫(kù)系統(tǒng),因此客戶端可以與在您的計(jì)算機(jī)上本地運(yùn)行的服

務(wù)器或在其它地方運(yùn)行的服務(wù)器進(jìn)行通信,也許可以在地球另一端的計(jì)算機(jī)上進(jìn)行通信。

可以為許多不同的目的編寫(xiě)客戶端,但每個(gè)客戶端通過(guò)連接到服務(wù)器,向其發(fā)送SQL查

詢以執(zhí)行數(shù)據(jù)庫(kù)操作,并從中接收查詢結(jié)果,從而與服務(wù)器進(jìn)行交互。

一個(gè)這樣的客戶端是MySQL發(fā)行版中包含的mysql程序。交互使用時(shí),機(jī)ysq/會(huì)提示輸

入查詢,將其發(fā)送到MySQL服務(wù)器執(zhí)行,并顯示結(jié)果。這個(gè)功能使Mgq/本身很有用,

但它也是一個(gè)有用的工具,可以幫助你進(jìn)行MySQL編程活動(dòng)。通??梢苑奖愕乜焖俨榭?/p>

您在腳本中訪問(wèn)的表的結(jié)構(gòu),在程序中使用它之前嘗試查詢以確保它生成正確類型的輸

出,等等。mysq/適合這些工作?!ㄉ賡q/也可以非交互方式使用,例如,從文件或其它程

序讀取查詢。這允許您在腳本或cron作業(yè)中或與其它應(yīng)用程序一起使用它。

本章介紹了〃的功能,以便您可以更有效地使用它。當(dāng)然,要自己嘗試本書(shū)中顯示

的配方和示例,您需要一個(gè)MySQL用戶帳號(hào)和一個(gè)數(shù)據(jù)庫(kù)來(lái)使用。本章的前兩部分描述

了如何使用加竺0來(lái)設(shè)置它們。出于演示目的,示例假設(shè)您將使用MySQL,如下所示:

?MySQL服務(wù)器正在本地主機(jī)上運(yùn)行。

?您的MySQL用戶名和密碼是cbuser和cbpass。

?您的數(shù)據(jù)庫(kù)名為cookbooko

對(duì)于您自己的實(shí)驗(yàn),您可以違反任何這些假設(shè)。您的服務(wù)器無(wú)需在本地運(yùn)行,也無(wú)需使

用本書(shū)中使用的用戶名,密碼或數(shù)據(jù)庫(kù)名稱。當(dāng)然,如果您不以剛剛描述的方式使用

MySQL,則需要更改示例以使用適合您系統(tǒng)的值。即使您使用不同的名稱,我建議您至少

創(chuàng)建一個(gè)專門(mén)用于嘗試此處顯示的配方的數(shù)據(jù)庫(kù),而不是您當(dāng)前用于其它目的的數(shù)據(jù)庫(kù)。

否則,現(xiàn)有表的名稱可能與示例中使用的名稱沖突,并且您必須對(duì)使用單獨(dú)數(shù)據(jù)庫(kù)時(shí)不必

要的示例進(jìn)行修改。

安裝MySQL

要在Windows或Mac上安裝MySQL,首先從MySQL官方網(wǎng)站下載最新的MySQLCommunity

Server版本:

https:〃/downloads/mvscil/

選擇對(duì)應(yīng)的操作系統(tǒng)版本,下載安裝即可。在安裝過(guò)程中,MySQL會(huì)自動(dòng)創(chuàng)建一個(gè)root

用戶,并提示輸入root口令。

要在Linux上安裝MySQL,可以使用發(fā)行版的包管理器。例如,Debian和Ubuntu用戶可

以簡(jiǎn)單地通過(guò)命令apt-getinstallmysql-server安裝最新的MySQL版本。

設(shè)置一個(gè)MySQL用戶帳號(hào)

問(wèn)題

您需要?jiǎng)?chuàng)建一個(gè)帳號(hào),用于連接到在給定主機(jī)上運(yùn)行的MySQL服務(wù)器。

解決方案

使用GRANT語(yǔ)句設(shè)置MySQL用戶帳號(hào)。然后使用該帳號(hào)的名稱和密碼建立與服務(wù)器的連

接。

討論

連接到MySQL服務(wù)器需要用戶名和密碼。您還可以指定運(yùn)行服務(wù)器的主機(jī)的名稱。如果

未明確指定連接參數(shù),則?。┮魃韺⒉捎媚J(rèn)值。例如,如果未指定主機(jī)名,則機(jī)),w/通常

假定服務(wù)器正在本地主機(jī)上運(yùn)行。

下面的示例顯示如何使用四”/程序連接到服務(wù)器并發(fā)出GRANT語(yǔ)句,該語(yǔ)句設(shè)置一個(gè)用

戶帳號(hào),該用戶帳號(hào)具有訪問(wèn)名為cookbook的數(shù)據(jù)庫(kù)的特權(quán)。mysql的參數(shù)包括/

連接到在本地主機(jī)上運(yùn)行的MySQL服務(wù)器,-p告訴皎sq/軸示輸入密碼,-“

加“連接到MySQLroot用戶。您鍵入的文本以粗體顯示;非粗體文本是程序輸出:

%mysql-hlocalhost-p-uroot

Enterpassword:******

mysql>GRANTALLONcookbook.*TO1cbuser1@1localhost*IDENTIFIEDBY

1cbpass';

QueryOK,0rowsaffected(0.09sec)

mysql>QUIT

Bye

輸入第一行中顯示的mg/命令后,如果收到一條消息、,指示找不到該程序或該程序的命

令錯(cuò)誤,請(qǐng)參閱配方1.8。否則,當(dāng)機(jī)以q/打印密碼提示時(shí),輸入MySQLroot密碼,在

其中可以看到L*。(如果MySQLroot用戶沒(méi)有密碼,只需按密碼提示返回。然后發(fā)出

一"1、LIKE所示的GRANT語(yǔ)句。

要使用cookbook以外的數(shù)據(jù)庫(kù)名稱,請(qǐng)使用在GRANT語(yǔ)句中看到的說(shuō)明書(shū)替換其名稱。

請(qǐng)注意,即使用戶帳號(hào)已存在,也需要為數(shù)據(jù)庫(kù)授予權(quán)限。但是,在這種情況下,您可能

需要省略語(yǔ)句中的“IDENTIFIEDBY”部分,否則您將更改該帳號(hào)的當(dāng)前密碼。

“cbuser”的hostname部分表示您將從該主機(jī)連接到MySQL服務(wù)器以訪問(wèn)說(shuō)明書(shū)數(shù)據(jù)庫(kù)。

要設(shè)置將連接到本地主機(jī)上運(yùn)行的服務(wù)器的帳號(hào),請(qǐng)使用localhost,如圖所示。如果計(jì)

劃從另一臺(tái)主機(jī)連接到服務(wù)器,在GRANT語(yǔ)句中替換該主機(jī)。例如,如果要從名為

“Z.C。加的主機(jī)以cbuser身份連接到服務(wù)器,則GRANT語(yǔ)句應(yīng)如下所示:

mysql>GRANTALLONcookbook.*TO1cbuser1@1xyz.com'IDENTIFIEDBY1cbpass*;

您可能已經(jīng)想到,在剛才描述的過(guò)程中,有一點(diǎn)悖論。也就是說(shuō),要設(shè)置可以連接到

MySQLroot服務(wù)器的用戶帳號(hào),必須首先連接到服務(wù)器,以便可以發(fā)出GRANT語(yǔ)句。我

假設(shè)您已經(jīng)可以作為MySQLroot用戶進(jìn)行連接,因?yàn)镚RANT只能由具有設(shè)置其它用戶

帳號(hào)所需的管理權(quán)限的用戶(如root)使用。如果無(wú)法以root身份連接到服務(wù)器,請(qǐng)讓

MySQL管理員為您發(fā)出GRANT語(yǔ)句。完成此操作后,您應(yīng)該能夠使用新的MySQL帳號(hào)

連接到服務(wù)器,創(chuàng)建自己的數(shù)據(jù)庫(kù),并自行繼續(xù)操作。

MySQLAccountsandLoginAccounts

操作系統(tǒng)的MySQL帳戶和登錄帳戶是不同的。例如,MySQLroot用戶和Unix

root用戶是分開(kāi)的,彼此沒(méi)有任何關(guān)系,即使每個(gè)情況下的用戶名都相同。這

意味著他們很可能有不同的密碼。這也意味著您不能通過(guò)為操作系統(tǒng)創(chuàng)建登錄

帳戶來(lái)創(chuàng)建新的MySQL帳戶;因此,無(wú)法為操作系統(tǒng)創(chuàng)建登錄帳戶。改用

GRANT語(yǔ)句o

運(yùn)行MySQL

MySQL安裝后會(huì)自動(dòng)在后臺(tái)運(yùn)行。為了驗(yàn)證MySQL安裝是否正確,我們需要通過(guò)mysql

這個(gè)命令行程序來(lái)連接MySQL服務(wù)器。

在命令提示符下輸入mysql-uroot-p,然后輸入口令,如果一切正確,就會(huì)連接到

MySQL服務(wù)器,同時(shí)提示符變?yōu)閙ysql)。

輸入exit退出MySQL命令行。注意,MySQL服務(wù)器仍在后臺(tái)運(yùn)行。

創(chuàng)建數(shù)據(jù)庫(kù)和示例表

問(wèn)題

您要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)并在其中建立表。

解決方案

使用CREATETABLE語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù),使用CREATETABLE語(yǔ)句創(chuàng)建要使用的每個(gè)表,并使

用INSERT將記錄添加到表中。

討論

上一節(jié)中使用的GRANT語(yǔ)句定義說(shuō)明書(shū)數(shù)據(jù)庫(kù)的權(quán)限,但不創(chuàng)建它。您需要顯式創(chuàng)建數(shù)

據(jù)庫(kù),然后才能使用它。本節(jié)演示如何執(zhí)行此操作,以及如何創(chuàng)建表并使用一些示例數(shù)據(jù)

加載該表,這些數(shù)據(jù)可用于以下部分中的示例。

Afterthecbuseraccounthasbeensetup,verifythatyoucanuseittoconnecttotheMySQL

server.Onceyou'veconnectedsuccessfully,createthedatabase.Fromthehostthatwasnamedin

theGRANTstatement,runthefollowingcommandstodothis(thehostnamedafter-hshouldbe

thehostwheretheMySQLserverisrunning):

%mysql-hlocalhost-p-ucbuser

Enterpassword:cbpass

mysql>CREATEDATABASEcookbook;

QueryOK,1rowaffected(0.08sec)

Nowyouhaveadatabase,soyoucancreatetablesinit.Issuethefollowingstatementstoselect

cookbookasthedefaultdatabase,createasimpletable,andpopulateitwithafewrecords:山

111Ifyoudon'twanttoenterthecompletetextoftheINSERTstatements(andIdon'tblameyou),

skipaheadtoRecipe1.13forashortcut.Andifyoudon'twanttotypeinanyofthestatements,

skipaheadtoRecipe1.16.

mysql>USEcookbook;

mysql>CREATETABLElimbs(thingVARCHAR(20)AlegsINT,armsINT);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*human*,2,2);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*insect*,6,0);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*squid*,0z10);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*octopus',0,8);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*fish,z0,0);

11

mysql>INSERTINTOlimbs(thing,legszarms)VALUES(centipedez100,0);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*table*,4,0);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES('armchair*,4,2);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*phonograph*,0,1);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES('tripod,z3z0);

mysql>INSERTINTOlimbs(thing,legs,arms)VALUES(*PegLegPete*,1,2);

1

mysql>INSERTINTOlimbs(thingzlegs,arms)VALUES(spacealienINULL,NULL);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論