再次從EXCEL表格說(shuō)起
創(chuàng)建表
常見(jiàn)的數(shù)據(jù)類型
因?yàn)閯?chuàng)建表相關(guān)的知識(shí)點(diǎn)還是比較多的,所以關(guān)于創(chuàng)建表,我打算分兩節(jié)課來(lái)講。本節(jié)課主要講解創(chuàng)建表的基本語(yǔ)法以及表中字段的常見(jiàn)數(shù)據(jù)類型。
在講解創(chuàng)建表的語(yǔ)法之前,我們先再次從上節(jié)課的EXCEL表格說(shuō)起。不知大家還記不記得上節(jié)課講到的深圳市第一中學(xué)的EXCEL,里面有三個(gè)SHEET頁(yè),分別是學(xué)校、老師、學(xué)生。
在EXCEL文件與數(shù)據(jù)庫(kù)的對(duì)比中,EXCEL就相當(dāng)于一個(gè)數(shù)據(jù)庫(kù),而一個(gè)SHEET頁(yè),就相當(dāng)于一個(gè)數(shù)據(jù)庫(kù)表,SHEET頁(yè)里的表頭就對(duì)應(yīng)于數(shù)據(jù)庫(kù)表的列。
在上節(jié)課中,我們使用MySQL-Front客戶端工具創(chuàng)建了一個(gè)mysqlstudy的數(shù)據(jù)庫(kù),并且在數(shù)據(jù)庫(kù)里創(chuàng)建了一張老師表(teacher)。這是創(chuàng)建數(shù)據(jù)庫(kù)和表的一種方式。
還有另外一種方式來(lái)創(chuàng)建表,就是我們本節(jié)課要講解的SQL語(yǔ)句。
使用SQL語(yǔ)句創(chuàng)建表,需要使用數(shù)據(jù)庫(kù)的關(guān)鍵字CREATE TABLE。關(guān)鍵字也叫保留字,是不能隨意使用的,不能作為對(duì)象名,比如不能作為表名、字段名等。
創(chuàng)建一個(gè)SHEET頁(yè)時(shí),我們需要指定SHEET頁(yè)的名稱、SHEET頁(yè)里表格的表頭,以及每一列需要存儲(chǔ)的數(shù)字格式。
創(chuàng)建一張表也是類似的,我們需要指定表名、字段名、字段的數(shù)據(jù)類型。比如下面這個(gè)語(yǔ)句創(chuàng)建了一張老師表(表名為teacher),它包含三個(gè)字段,分別是teacher_id、teacher_name、gender,字段類型分別為varchar(20)、varchar(50)、varchar(10)。
CREATE TABLE teacher
(
teacher_id VARCHAR(20),
teacher_name VARCHAR(50),
gender VARCHAR(10)
);
這里面有一些需要注意的地方,大家一定要記住。
表名和字段名不能使用中文(標(biāo)點(diǎn)符號(hào)也不能使用中文的);(一般為字母開(kāi)頭,字母、數(shù)字、下劃線組成的字符串)
CREATE TABLE關(guān)鍵字后跟上表名,字段名在括號(hào)中列出且以逗號(hào)分隔;
語(yǔ)句最后以分號(hào)結(jié)尾;
不區(qū)分大小寫(xiě),但最好關(guān)鍵字都大寫(xiě);按一定的規(guī)則縮進(jìn);
每個(gè)字段都需要設(shè)置數(shù)據(jù)類型;
對(duì)于第1條,常見(jiàn)的表名命名方式有:t_teacher、T_Teacher、tech。千萬(wàn)不要使用一些稀奇古怪的字符作為表名。
上面有講到,每個(gè)字段都需要設(shè)置數(shù)據(jù)類型。那什么是數(shù)據(jù)類型呢?他有什么作用呢?
數(shù)據(jù)類型,其實(shí)就是數(shù)據(jù)在數(shù)據(jù)庫(kù)里保存的格式,它決定了對(duì)應(yīng)的字段可以存儲(chǔ)什么格式的數(shù)據(jù),以及如何存儲(chǔ)這些數(shù)據(jù)。
常見(jiàn)的數(shù)據(jù)類型有以下幾類:
字符串類
數(shù)值類
日期和時(shí)間類
二進(jìn)制類
字符串類
字符串類,是最常見(jiàn)的數(shù)據(jù)類型?;究梢哉f(shuō)所有我們看到的符號(hào),都是字符串。所以,如果說(shuō)沒(méi)有特殊要求,所有字段都設(shè)置為字符串,也是沒(méi)問(wèn)題的。
舉一些例子,比如常見(jiàn)的學(xué)生的姓名、身份證、家庭地址、電話號(hào)碼,使用的電腦型號(hào),以及購(gòu)買的書(shū)名等。這些都是字符串。
而字符串,一般來(lái)說(shuō),又分為兩種。一種是定長(zhǎng)字符串,另一種是不定長(zhǎng)字符串。
定長(zhǎng)字符串:長(zhǎng)度固定的字符串類型,其長(zhǎng)度是在創(chuàng)建表時(shí)指定的。定義時(shí)使用關(guān)鍵字CHAR。
比如郵政編碼‘510623’,是6位的字符。如果向一個(gè)6位的定長(zhǎng)字符串類型的字段,只插入2位字符,則數(shù)據(jù)庫(kù)默認(rèn)會(huì)在2個(gè)字符末尾補(bǔ)4個(gè)空格,以補(bǔ)足6位。
不定長(zhǎng)字符串:長(zhǎng)度不固定的字符串類型,創(chuàng)建表時(shí)指定一個(gè)最大長(zhǎng)度,或不指定長(zhǎng)度。定義時(shí)使用關(guān)鍵字VARCHAR。
比如姓名,有2位、3位、4位甚至更長(zhǎng)的。比如:‘馮鞏’、‘周杰倫’、‘倉(cāng)央嘉措’、‘庫(kù)爾班-熱合曼’。
關(guān)于定長(zhǎng)字符串和不定長(zhǎng)字符串的區(qū)別,看下下面兩張圖,可能會(huì)更直觀一些。
定長(zhǎng)字符串就像左邊的膠全板一樣,每一張的大小尺寸都一樣(不一樣的話,會(huì)使用木屑等補(bǔ)足),搬運(yùn)起來(lái)也比較方便。而不定長(zhǎng)字符串,就像右邊的樹(shù)桿原木,長(zhǎng)度粗細(xì)比較隨意,堆疊在一起來(lái),就會(huì)產(chǎn)生很多縫隙,也不太好搬運(yùn)。
所以,定長(zhǎng)字符串具有處理性能高、產(chǎn)生較少的磁盤存儲(chǔ)碎片的優(yōu)點(diǎn),但占用的存儲(chǔ)可能會(huì)多些。而不定長(zhǎng)字符串,占用的存儲(chǔ)較少,但處理性能低,會(huì)產(chǎn)生較多的存儲(chǔ)碎片。
在創(chuàng)建表時(shí),具體使用哪種類型,還要看具體場(chǎng)景而定。不過(guò)隨著數(shù)據(jù)庫(kù)發(fā)展,存儲(chǔ)碎片的產(chǎn)生,對(duì)數(shù)據(jù)庫(kù)的性能影響也越來(lái)越小,所以使用VARCHAR也影響不大。
數(shù)值類
數(shù)值類數(shù)據(jù)類型也是一種非常常見(jiàn)的數(shù)據(jù)類型。在生活中也非常常見(jiàn),基本可以說(shuō),所有能夠度量的數(shù)值,都可以使用數(shù)值類數(shù)據(jù)類型來(lái)儲(chǔ)存。比如說(shuō),像年齡、身高、厚度、速度、利率、人數(shù)等,都可以理解為數(shù)值。
而數(shù)值數(shù)據(jù)類型又分為兩種。
整數(shù)數(shù)值:不帶小數(shù)點(diǎn)的數(shù)值。比如說(shuō),中國(guó)有4個(gè)直轄市;2016年深圳市常住人口有11988400人;或者說(shuō)某人今年的年齡是80歲等待。常見(jiàn)的保存整數(shù)數(shù)值的字段類型有SMALLINT、INT、BIGINT、DECIMAL(m)。
小數(shù)數(shù)值:帶小數(shù)點(diǎn)的數(shù)值。比如說(shuō),珠穆朗瑪峰的高度為8844.43米;銀行一年期定期存款利率為2.75%等。常見(jiàn)的保存小數(shù)數(shù)值的字段類型有FLOAT、DOUBLE、DECIMAL(m,d)。
日期和時(shí)間類
第三種是日期和時(shí)間類型,比如學(xué)校要開(kāi)學(xué)了,規(guī)定的報(bào)名日期9月1日;我們國(guó)家的國(guó)慶節(jié)10月1日;公司的下班時(shí)間17點(diǎn)30分;沿著操場(chǎng)跑一圈,使用秒表記錄的時(shí)間4分13秒;爬山時(shí),從開(kāi)始上山到最后下山中間經(jīng)過(guò)的時(shí)間間隔5小時(shí)25分鐘等,
而日期和時(shí)間類的數(shù)據(jù)類型,分為三種。
日期類型:只包含年、月、日的日期;比如,某人的出生日期為1990年1月3日;定義時(shí)使用關(guān)鍵字DATE。
時(shí)間類型:包含時(shí)、分、秒、毫秒的時(shí)間。比如,上班時(shí)間為08:30:00。定義時(shí)使用關(guān)鍵字TIME。
日期 時(shí)間類型:包含年、月、日、時(shí)、分、秒、毫秒的時(shí)間戳類型。比如,某人從銀行ATM機(jī)上取出1000元現(xiàn)金的時(shí)間是2017年9月2日12時(shí)35分11秒734毫秒。定義時(shí)使用關(guān)鍵字DATETIME、TIMESTAMP。
二進(jìn)制數(shù)據(jù)類型
最后簡(jiǎn)單說(shuō)一下二進(jìn)制數(shù)據(jù)類型。二進(jìn)制我們都知道,是0和1組成的一串?dāng)?shù)字。像我們常見(jiàn)的圖片、視頻、音頻、文檔等,底層都是使用二進(jìn)制保存的。所以打開(kāi)這類文件時(shí),才需要圖片瀏覽軟件、播放器、OFFICE軟件等。
有時(shí)候,我們也想把這類數(shù)據(jù)存入數(shù)據(jù)庫(kù),這時(shí)就需要使用到二進(jìn)制數(shù)據(jù)類型。在MySQL數(shù)據(jù)庫(kù),一般使用BLOB和TEXT類型來(lái)定義二進(jìn)制數(shù)據(jù)類型的字段。
但因?yàn)閿?shù)據(jù)庫(kù)處理這類數(shù)據(jù)效率并不高,而且數(shù)據(jù)量一大,會(huì)極大的影響數(shù)據(jù)庫(kù)的處理效率,所以一般都不建議在數(shù)據(jù)庫(kù)中使用這類數(shù)據(jù)類型。
上面我們講了,在創(chuàng)建一張表時(shí),需要為表中的字段定義數(shù)據(jù)類型。這樣在向表中插入數(shù)據(jù)時(shí),就需要插入與對(duì)應(yīng)位置字段的字段類型一致的數(shù)據(jù),否則是會(huì)報(bào)錯(cuò)的。
但當(dāng)我們插入數(shù)據(jù)的時(shí)候,并不想或并不需要對(duì)某個(gè)字段賦值時(shí),如果字段有設(shè)置默認(rèn)值,則會(huì)以默認(rèn)值來(lái)填充該字段的值而不會(huì)導(dǎo)致錯(cuò)誤;比如,在網(wǎng)上下訂單時(shí),對(duì)于下訂單的日期字段,可以使用數(shù)據(jù)庫(kù)的系統(tǒng)變量“當(dāng)前日期”來(lái)默認(rèn)賦值,這樣就不需要在向訂單表插入訂單數(shù)據(jù)時(shí),單獨(dú)再對(duì)下訂單的日期字段進(jìn)行賦值。
另外,在向表中插入數(shù)據(jù)的時(shí)候,如果某個(gè)字段并沒(méi)有指定賦值為多少,而此時(shí)該字段也沒(méi)有賦默認(rèn)值,那么就會(huì)向該字段插入NULL值。而NULL值的使用效率并不高,并且使用起來(lái)也比較麻煩。
所以,為避免字段的值被插入NULL值,一般在表創(chuàng)建時(shí),都會(huì)為字段指定默認(rèn)值。
為字段指定默認(rèn)值時(shí),使用關(guān)鍵字DEFAULT。如下所示:
CREATE TABLE teacher
(
teacher_id VARCHAR(20) DEFAULT '',
teacher_name VARCHAR(50) DEFAULT '',
gender VARCHAR(10) DEFAULT ''
);
設(shè)置默認(rèn)值時(shí),有以下幾點(diǎn)需要注意:
表中所有的字段都可以設(shè)置默認(rèn)值;
默認(rèn)值的數(shù)據(jù)類型必須與字段保持一致;(不一致時(shí),數(shù)據(jù)庫(kù)雖然有時(shí)也會(huì)默認(rèn)做隱式類型轉(zhuǎn)換,但并不推薦這樣做。一方面是這樣做并不規(guī)范,另一方面是這樣做可能會(huì)導(dǎo)致未知的錯(cuò)誤)
除主鍵字段外,建議其他所有字段都設(shè)置默認(rèn)值;
那一般根據(jù)什么來(lái)決定字段應(yīng)該賦什么默認(rèn)值呢?
對(duì)于字符型字段來(lái)說(shuō),一般賦值為空字符串(也就是’’),或者具有某種業(yè)務(wù)含義的值。比如,對(duì)于性別字段,有三個(gè)取值,F(xiàn)-女,M-男,N-未知,當(dāng)向這個(gè)性別字段插入數(shù)據(jù)時(shí),可能并不知道性別是男還是女,那這時(shí),就可以定義默認(rèn)值為N-未知,代表我們并不知道這條數(shù)據(jù)記錄的值到底是多少。
對(duì)于數(shù)值型字段來(lái)說(shuō),一般賦值為0,或者具有某種業(yè)務(wù)含義的值,或者該字段所表示的業(yè)務(wù)含義的最大值或極大值。
對(duì)于日期和時(shí)間型呢,常見(jiàn)的賦值有系統(tǒng)當(dāng)前日期CURRENT_DATE、系統(tǒng)當(dāng)前時(shí)間CURRENT_TIME、系統(tǒng)當(dāng)前時(shí)間戳CURRENT_TIMESTAMP及NOW()等。
總的來(lái)說(shuō),我們都可以根據(jù)字段的業(yè)務(wù)含義來(lái)為字段賦默認(rèn)值。
下面是創(chuàng)建老師表、班級(jí)表、學(xué)生表的示例語(yǔ)句:
CREATE TABLE teacher
(
teacher_id varchar(50) not null,
teacher_name varchar(100) not null default '' ,
gender varchar(10) not null default 'F',
);
CREATE TABLE class
(
class_id varchar(50) not null,
class_name varchar(100) not null default ''
);
CREATE TABLE student
(
student_id varchar(50) not null,
student_name varchar(100) not null default '',
gender varchar(10) not null default '',
age integer not null default 0 ,
class_id varchar(50) not null default ''
);
聯(lián)系客服