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