1. 程式人生 > 其它 >🚴‍♂️全套MySQL資料庫教程_Mysql基礎入門教程,零基礎小白自學MySQL資料庫必備教程☔ #002 # 第二單元 MySQL資料型別、操作表#

🚴‍♂️全套MySQL資料庫教程_Mysql基礎入門教程,零基礎小白自學MySQL資料庫必備教程☔ #002 # 第二單元 MySQL資料型別、操作表#

二、本單元知識點概述

(Ⅰ)知識點概述

、本單元教學目標

(Ⅰ)重點知識目標

1.Mysql的資料型別
2.如何選擇資料型別
3.建立表
4.修改表
5.刪除表

(Ⅱ)能力目標

1.熟練建立資料庫及刪除資料庫
2.牢記資料型別
3.熟練表的操作

三、本單元知識詳講

2.1 MySQL資料型別介紹

MySQL資料庫提供了多種資料型別。其中包括整數型別、浮點數型別、定點數型別、 日期和時間型別、字串型別和二進位制資料型別。不同的資料型別有各自的特點,使用範 圍不相同。而且,儲存方式也不一樣。本節將詳細講解各種資料型別。首先簡單介紹以下建立表的sql語句(create table 表名(欄位1名稱 欄位型別,...))

2.1.1整數型別★★★★★

整數型別是資料庫中最基本的資料型別。標準SQL中支援INTEGER和SMALLINT 這兩類整數型別。MySQL資料庫除了支援這兩種型別以外,還擴充套件支援了 TINYINT、MEDIUMINT和BIGINT。本小節將講解各種整數型別的取值範圍、儲存的位元組數、特點 等內容。下面從不同整數型別的位元組數、取值範圍等方面進行對比,如表2.1所示。

表2.1 MySQL的整數型別

整數型別位元組數無符號數的取值範圍有符號數的取值範圍
TINYINT 1 0—255 -128—127
SMALLINT 2 0〜65535 —32768〜32767
MEDIUMINT
3 0〜16777215 -8388608〜8388607
INT 4 0〜4294967295 —2147483648〜2147483647
INTEGER 4 0〜4294967295 —2147483648〜2147483647
BIGINT 8 0〜18446744073709551615 -9223372036854775808〜9223372036854775807

從,表2.1中可以看到,INT型別和INTEGER型別的位元組數和取值範圍都是一樣的。其 實,在MySQL中INT型別和INTEGER型別是一樣的。TINYINT型別佔用的位元組最小,只需要1個位元組。因此,其取值範圍是最小的。BIGINT型別佔用的位元組最大,需要8個 位元組。因此,其取值範圍是最大的。 不同型別的整數型別的位元組數不同。根據型別所佔的位元組數可以算出該型別的取值範 圍。例如,TINYINT的空間為1個位元組,1個位元組是8位。那麼,TINYINT無符號數的最大值為2的八次方-1,即為255。TINYINT有符號數的最大值為2的七次方-1,即為127。同理可以算出其他不同整數型別的取值範圍。


MySQL支援資料型別的名稱後面指定該型別的顯示寬度。其基本形式如下: 資料型別(顯示寬度) 其中,資料型別引數是整數資料型別的名稱;顯示寬度引數是指定寬度的數值。顯示 寬度是指能夠顯示的最大資料的長度。例如,INT(4)在不指定寬度的情況下,每個整數型別都有預設的顯示寬度。 【示例2-1】下面某表的欄位a、b、c、d和e的資料型別分別為TINYINT, SMALLINT, MEDIUMINT、INT和BIGINT,這些整數型別都沒有設定顯示寬度,都為其預設值。該表的資料型別顯示如下:

從上面結果可以看出各種整數型別的預設顯示寬度。

  • TINYINT型別的預設顯示寬度為 4;

  • SMALLINT型別的預設顯示寬度為6;

  • MEDIUMINT型別的預設顯示寬度為9;

  • INT類 型的預設顯示寬度為11;

  • BIGINT型別的預設顯示寬度為20。

仔細觀察會發現,TINYINT 型別的預設顯示寬度與其有符號數的最小值的顯示寬度相同。因為此處負號是佔一個位置 的。依此類推,其他整數型別的預設顯示寬度與其有符號數的最大值的顯示寬度相同。這 個可以理解為,.一個數據型別的預設顯示寬度剛好能顯示該資料型別的所有值。

2.1.2 浮點數型別和定點數型別★★★★

MySQL中使用浮點數型別和定點數型別來表示小數。浮點數型別包括單精度浮點數 (FLOAT型)和雙精度浮點數(DOUBLE型)。定點數型別就是DECIMAL型。本小節中將講解FLOAT型、DOUBLE型和DECIMAL型的取值範圍、儲存的位元組數和特點等內容。 下面從這三種類型的位元組數、取值範圍等方面進行對比,如表2.2所示。

表2.2 MySQL的浮點數型別和定點數型別

整數型別位元組數負數的取值範圍非負數的取值範圍
FLOAT 4 -3.402823466E+38 〜-1.175494351E-38 0 和 1.175494351E—38〜3.402823466E+38
DOUBLE 8 -1.7976931348623157E+308〜-2.225073 8585072014E-308 0 和 2.2250738585072014E-308〜1.7976931348623157E+308
DECIMAL(M,D) 或 DEC(M,D) M+2 同DOUBLE型 同DOUBLE型

從上面表中可以看到,DECIMAL型的取值範圍與DOUBLE相同。但是,DECIMAL的有效取值範圍由M和D決定。而且,DECIMAL型的位元組數是M+2。也就是說,定點數的儲存空間是根據其精度決定的。 MySQL中可以指定浮點數和定點數的精度。其基本形式如下: 資料型別(M,D) 其中,“資料型別”引數是浮點數或定點數的資料型別名稱;

  • M:這個欄位的長度

  • D:有幾位小數 這個沒有精度丟失,經常用來表示金錢

例如,FLOAT(6,2) 的含義資料FLOAT型,資料長度為6,小數點後保留2位。按此定義,1234.56是符合要 求的。


注意:上述指定小數精度的方法雖然都適合於浮點數和定點數,但不是浮點數的標準用法。建議在定義浮點數時,如果不是實際情況需要,最好不要使用。如果使用了,可能會影響資料庫的遷移。對定點數而言,DECIMAL(M,D)是定點數的標準格式, 一般情況下可以選擇這種資料型別。

如果插入值的精度高於實際定義的精度,系統會自動進行四捨五入處理,使值的精度 達到要求。不同的是,FLOAT型和DOUBLE型在四捨五入時不會報錯,而DECIMAL型 會有警告。

【示例2-2】下面某表的欄位a、b和c的資料型別分別是FLOAT(6,2)、DOUBLE(6,2) 和DECIMAL(6,2),向表中插入3.143、3.145和3.1434。其顯示結果如下:


如果不指定精度,浮點數和定點數有其預設的精度。FLOAT型和DOUBLE型預設會儲存實際精度,但這與作業系統和硬體的精度有關。DECIMAL型預設整數位為10,小數 位為0,即預設為整數。

【示例2-3】下面某表的欄位a、b和c的資料型別分別是FLOAT、DOUBLE和 DECIMAL,向表中插入3.143、3.145和3.1434。其顯示結果如下:

上面程式結果顯示,欄位a和b是按照實際精度儲存的。而欄位c進行了四捨五入處理,而且沒有小數位。

在MySQL中,定點數以字串形式儲存。因此,其精度比浮點數要高,而且, 浮點數會出現誤差,這是浮點數一直存在的缺陷。如果要對資料的精度要求比較高,還是選擇定點數(DECIMAL )比較安全。

2.1.3 日期與時間型別★★★★

日期與時間型別是為了方便在資料庫中儲存日期和時間而設計的。 MySQL中有多種表示日期和時間的資料型別。其中,

  • YEAR型別表示時間;

  • DATE型別表示日期;

  • TIME 型別表示時間;

  • DATETIME和TIMESTAMP表示日期和時間。

本小節將介紹上述型別的儲存的位元組數、取值範圍和特點。

下面從這5種日期與時間型別的位元組數、取值範圍和零值等方面進行對比,如表2.3所示。 表2.3 MySQL的日期與時間型別

整數型別位元組數取值範圍零 值
YEAR 1 1901〜2155 0000
DATE 4 1000-01-01 〜9999-12-31 0000:00:00
TIME 3 一838:59:59〜838:59:59 00:00:00
DATETIME 8 1000-01-01 00:00:00〜9999-12-31 23:59:59 0000-00-00 00:00:00
TIMESTAMP 4 19700101080001-20380119111407 00000000000000

從上表中可以看到,每種日期與時間型別都有一個有效範圍。如果插入的值超過了這個範圍,系統會報錯,並將零值插入到資料庫中。不同的日期與時間型別有不同的零值,上表中已經詳細列出。

YEAR型別使用1個位元組來表示年份。MySQL中以YYYY的形式顯示YEAR型別的 值。給YEAR型別的欄位賦值的表示方法如下: 使用4位字串或數字表示。其範圍從1901〜2155。輸入格式為'YYYY,或YYYY。 例如,輸入'2008'或者2008,可直接儲存為2008。如果超過了範圍,就會插入0000。

【示例2-4】下面某表的欄位a的資料型別是YEAR型別,向表中插入1997、'1998' 和'1900'。其顯示結果如下:

結果顯示,1997和1998直接儲存到欄位a中。而1900沒有插入到欄位a中,而是顯示 0000 ,此處還有“Out of range value for column a at row 1"的警告資訊。


TIME型別使用3個位元組來表示時間。MySQL中以HH:MM:SS的形式顯示TIME類 型的值。 其中,

  • HH表示時;

  • MM表示分,取值範圍為0〜59;

  • SS表示秒,取值範圍是0〜 59;

  • TIME型別的範圍可以從'-838:59:59'〜'838:59:59'。

雖然,小時的範圍是0〜23。 但是為了表示某種特殊需要的時間間隔,將TIME型別的範圍擴大了。而且,還支援了負值。TIME型別的欄位賦值的表示方法如下。 'D HH:MM:SS'格式的字串表示。其中,D表示天數,取值範圍是0〜34。儲存時,小時的值等於(D*24+HH)。例如,輸入'2 11:30:50' , TIME型別會轉 換為59:30:50。當然,輸入時可以不嚴格按照這個格式,也可以是“HH:MM:SS”、HH:MM”、“DHH:MM”、“DHH” 或者 “SS” 等形式。例如,輸入'30', TIME型別會轉換為00:00:30。 【示例2-5】下面某表的欄位a的資料型別是TIME型別,向表中插入'2 23:50:50'、‘22:22:22’、'11:11'、'2 20:20'、'2 20'和'30'。其顯示結果如下:

結果顯示,‘223:50:50’ 轉換為 71:50:50;‘11:11’轉換為 11:11:00;20:20,轉換為 68:20:00;‘2 20’轉換為 68:00:00; '30'轉換為 00:00:30。

HHMMSS'格式的字串或HHMMSS格式的數值表示。例如,輸入'345454', TIME型別會轉換為34:54:54;輸入值為數值345454, TIME型別也會轉換為34:54:54。如果輸入0和'0',那麼TIME型別會轉換為0000:00:00。 【示例2-6】下面某表的欄位a的資料型別是TIME型別,向表中插入121212、 '131313'、 '0'和0。其顯示結果如下:

結果顯示,121212轉換為12:12:12;‘131313’轉換為13:13:13; '0'和0轉換為 00:00:00。如果分鐘和秒鐘大於60時,系統會出現“Out of range value for column 'a* at row 1”這樣的警告資訊。

使用CURRENT TIME或者NOW。輸入當前系統時間。 【示例2-7】下面某表的欄位a的資料型別是TIME型別,向表中插入CURRENT_TIME和NOW()。其顯示結果如下:

結果顯示,CURRENTJTIME和NOW()都轉換為當前系統時間。因此,如果要獲取當 前的系統時間,最好選擇CURRENTJTIME和NOW()。 一個合法的TIME值,如果超出TIME的範圍,將被裁為範圍最接近的端點,如, '880:00:00'被轉換為838:59:59。無效TIME值,在命令列下是無法被插入到表中的。 注意:如果插入的TIME值是無效的,系統會提示“ERROR 1292 (22007): Incorrect time value5,.即使這個無效值被插入到表中,其值也會被轉換為00:00:00。例如, '877034'就是一個無效的值,因為分鐘部分超出了範圍。TIME型別專門用來儲存時間資料,而且只佔3個位元組。如果只需要記錄時間,選擇TIME型別是最合適的。


DATE型別使用4個位元組來表示日期。MySQL中是以YYYY-MM-DD的形式顯示 DATE型別的值。其中,YYYY表示年;MM表示月;DD表示日。DATE型別的範圍可 以從,1000-01-01,〜‘9999-12-31'。

給DATE型別的欄位賦值的表示方法如下: 'YYYY-MM-DD'或'YYYYMMDD'格式的字串表示。這種方式可以表達的 範圍是'1000-01-01'〜‘9999-12-31’。例如,輸入'4008-2-8,, DATE 型別 將轉換為 4008-02-08;輸入'20220308' , DATE 型別將轉換為 2022-03-08

MySQL中還支援一些不嚴格的語法格式,任何標點都可以用來做間隔符。 如 'YYYY/MM/DD'、'YYYY@MM@DD'、'YYYY.MM.DD'等分隔形式。例如,輸 入'2011.3.8' , DATE 型別將轉換為 2011-03-08。

【示例2-8】下面某表的欄位a的資料型別是DATE型別, 向表中插入'1949-10-01'、'1950#2#3'、'1951@3@4'和'19520101'。其顯示結果如下:

結果顯示,'1949-10-01'保持原樣的儲存到欄位中;'1950#2#3'轉換為1950-02-03; '1951@3@4'轉換為 1951-03-04; '19520101'轉換為 1952-01-01。

雖然MySQL支援DATA型別的一些不嚴格的語法格式。但是,在實際應用中, 最好還是選擇標準形式。日期中使用做分隔符,時間用“:”做分隔符。如 果有特殊需要,可以使用“@”、"*”等特殊字元做分隔符。


DATETIME型別使用8個位元組來表示日期和時間。MySQL中以'YYYY-MM-DD HH:MM:SS'的形式顯示DATETIME型別的值。從其形式可以看出.,DATETIME型別可 以直接用DATE型別和TIME型別組合而成。

給DATETIME型別的欄位賦值的表示方法 如下: 'YYYY-MM-DDHH:MM:SS'或'YYYYMMDDHHMMSS'格式的字串表示。 這種方式可以表達的範圍是 41000-01-01 00:00:00'〜'9999-12-31 23:59:59'。 例如,輸入 2008-08-08 08:08:08 , DATETIME 型別轉換為 2008-08-08 08:08:08; 輸入'20080808080808',同樣轉換為 2008-08-08 08:08:08。

MySQL中還支援一些不嚴格的語法格式,任何標點都可以用來做間隔符。情況與 DATE型別相同。而且,時間部分也可以用任意分隔符隔開,這與TIME型別不同。TIME 型別只能用“:”隔開。例如,輸入'2008@08@08 080808',同樣轉換為2008-08-08 08:08:08。 【示例2-9]下面某表的欄位a的資料型別是DATETIME型別,向表中插入 '1949-10-01 11:11:11'、'1950#2#3 11+11+11'和'19510101121212' ,其顯示結果如下。

結果顯示,'1949-10-01 11:11:11'直接儲存到欄位中;'1950#2#3 11+11+11'轉換 為 1950-02-03 11:11:11; '19510101121212'轉換為 1951-01-01 12:12:12。


TIMESTAMP型別使用4個位元組來表示日期和時間。

TIMESTAMP型別的範圍是從 1970-01-01 08:00:01—2038-01-19 11:14:07。MySQL 中也是以'YYYY-MM-DD HH:MM:SS' 的形式顯示TIMESTAMP型別的值。

從其形式可以看出,TIMESTAMP型別與DATETIME型別顯示的格式是一樣的。給TIMESTAMP型別的欄位賦值的表示方法基本與DATETIME型別相同。值得注意的是,TIMESTAMP類型範圍比較小,沒有DATETIME型別的範圍 大。因此,輸入值時要保證在TIMESTAMP型別的有效範圍內。 【示例2-10】下面某表的欄位a的資料型別是TIMESTAMP型別,向表中插入 1979-10-01 11:11:11'、,1970#2#3 11+11+11'、19710101121212'、28-01-01、'33@1@1 1111*11'、'790101121212'、20080808080808090101080808、0 和 NOW()。 其顯示結果如下:

結果顯示,'1970#2#3 11+11+11 轉換為 1970-02-03 11:11:11; '33@1@1 111111' 轉換為 2033-01-01 11:11:11:090101080808 轉換為 2009-01-01 08:08:08;0轉換為 0000-00-00 00:00:00; NOW。轉換為系統當前時間。

2.1.4 字串型別★★★★★

字串型別是在資料庫中儲存字串的資料型別。字串型別包括CHAR、VARCHAR, BLOB、TEXT、ENUM和SET。 1.CHAR型別和VARCHAR型別

CHAR型別和VARCHAR型別都是在建立表時指定了最大長度,其基本形式如下:
其中,"字串型別”引數指定了資料型別為CHAR型別還是VARCHAR型別;M 引數指定了該字串的最大長度為M。例如,CHAR(4)就是指資料型別為CHAR型別,其 最大長度為4。
CHAR型別的長度是固定的,在建立表時就指定了。其長度可以是0-255的任意值。 例如,CHAR(IOO)就是指定CHAR型別的長度為100。
VARCHAR型別的長度是可變的,在建立表時指定了最大長度。定義時,其最大值可 以取0〜65535之間的任意值。指定VARCHAR型別的最大值以後,其長度可以在。到最 大長度之間。

例如,VARCHAR(IOO)的最大長度是100。但是,不是每條記錄都要佔用100 個位元組。而是在這個最大值範圍內,使用多少分配多少。VARCHAR型別實際佔用的空間 為字串的實際長度加1。這樣,即可有效節約系統的空間。

【示例2-11】下面向CHAR(5)與VARCHAR(5)中存入不同長度的字串。將資料庫 中的儲存形式和佔用的位元組數進行對比,如表2.4所示。

表 2.4 CHAR(5)與VARCHAR(5)的對比

插入值CHAR(5)佔用位元組數VARCHAR(5)佔用位元組數
'' <, 5個位元組 '' 1個位元組
'1' '1' 5個位元組 '1' 2個位元組
'123' ‘123, 5個位元組 ‘123' 4個位元組
'123 ' '123' 5個位元組 '123' 5個位元組
‘12345’ '12345' 5個位元組 '12345' 6個位元組

表2.4顯示,CHAR(5)所佔用的空間都是5個位元組。這表示CHAR(5)的固定長度就是 5個位元組。而VARCHAR(5)所佔的位元組數是實際長度的基礎上加1。因為字串的結束標誌符佔用了 1個位元組。從表的第三行可以看到,VARCHAR將字串'123 '最後面的空格依然保留著。為了確認空格是否保留,將所有資料後面加上“*”字元,結果顯示如下:

由此可見,VARCHAR型別將'123 '最後面的空格保留著。而CHAR型別中將,123後面的空格自動刪除了。 注意:如果CHAR和VARCHAR的長度為5,而插入的值為*123456'。那麼系統會 阻止這個值的插入,並且會報錯。錯誤資訊是“ERROR 1406 (22001): Data too long for column”。這說明插入的字串的長度已經大於了可以插入的最大值。

TEXT型別是一種特殊的字串型別。TEXT只能儲存字元資料,如新聞的內容等。 TEXT 型別包括 TINYTEXT. TEXT、MEDIUMTEXT 和 LONGTEXTo 下面將從 4 種 TEXT 型別允許的長度和儲存空間進行對比,如表2.5所示。

表2.5各種TEXT型別的對比

類 型允許的長度儲存空間
TINYTEXT 0-255位元組 值的長度+2個位元組
TEXT 0-65535 位元組 值的長度+2個位元組
MEDIUMTEXT 0—167772150 位元組 值的長度+3個位元組
LONGTEXT 0-4294967295 位元組 值的長度+4個位元組

從表2.5可以看出,各種TEXT型別的區別在於允許的長度和儲存空間不同。因此在 這幾種TEXT型別中,根據需求選取既能滿足需要又最節約空間的型別即可。

2.2 如何選擇資料型別

在MySQL中建立表時,需要考慮為欄位選擇哪種資料型別是最合適的。只有選擇了合適的資料型別,才能提高資料庫的效率。本小節將講解選擇資料型別的原則。

2.2.1 整數型別和浮點數型別★★★★

整數型別和浮點數型別最大的區別在於能否表達小數。整數型別不能表示小數,而浮 點數型別可以表示小數。不同的整數型別的取值範圍不同。TINYINT型別的取值範圍為0〜 255。如果欄位的最大值不超過255,那選擇TINYINT型別就足夠了。BIGINT型別的取值 範圍最大。最常用的整數型別是INT型別。 浮點數型別包括FLOAT型別和DOUBLE型別。DOUBLE型別的精度比FLOAT型別 高。如果需要精確到小數點後10位以上,就應該選擇DOUBLE型別,而不應該選擇FLOAT型別。

2.2.2 浮點數型別和定點數型別★★★★

對於浮點數和定點數,當插入值的精度高於實際定義的精度時,系統會自動進行四舍 五入處理。其目的是為了使該值的精度達到要求。浮點數進行四捨五入時系統不會報警, 定點數會岀現警告。 在未指定精度的情況下,浮點數和定點數有其預設的精度。FLOAT型和DOUBLE型 預設會儲存實際精度。這個精度與作業系統和硬體的精度有關。DECIMAL型預設整數位 為10,小數位為0,即預設為整數。 在MySQL中,定點數精度比浮點數要高。而且,浮點數會岀現誤差。如果要對資料 的精度要求比較高,應該選擇定點數。

2.2.3 char型別和varchar型別★★★★★

CHAR型別的長度是固定的,而VARCHAR型別的長度是在範圍內可變的。因此, VARCHAR型別佔用的空間比 CHAR型別小。 而且,VARCHAR型別比CHAR型別靈活。 對於長度變化比較大的字串型別,最好是選擇VARCHAR型別。 雖然CHAR型別佔用的空間比較大,但是CHAR型別的處理速度比VARCHAR快。 因此,對於長度變化不大和查詢速度要求較高的字串型別,最好選擇CHAR型別。

2.3建立表

建立表是指在已存在的資料庫中建立新表。這是建立資料庫最重要的一步,是進行其他表操作的基礎。

2.3.1 建立表的語法形式★★★★

MySQL中,建立表是通過SQL語句CREATE TABLE實現的。其語法形式如下。

CREATE TABLE 表名(屬性名 資料型別[完整性約束條件],
屬性名 資料型別[完整性約束條件],
:
屬性名 資料型別 );

其中,“表名”引數表示所要建立的表的名稱;“屬性名”引數表示表中欄位的名稱; "資料型別"引數指定欄位的資料型別,“完整性約束條件”引數指 定欄位的某些特殊約束條件。 注意;在使用CREATE TABLE語句建立表時,首先要使用USE語句選擇資料庫。選擇資料庫語句的基本格式為“USE資料庫名”。如果沒有選擇資料庫,建立表時 會出現 aERROR 1046 (3D000): No database selected"錯誤。 表名不能為SQL語言的關鍵字,如create、update和order等都不能做表名。一個表中可以有一個或多個屬性。定義時,字母大小寫均可,各屬性之間用逗號隔開,最後一個屬性後不需要加逗號。

【示例3-1】 下面建立一個表名為exampleO的表,SQL程式碼如下:

CREATE TABLE example0(id INT, name VARCHAR(20), sex BOOLEAN );

表3.1完整性約束條件表

約束條件說 明
PRIMARY KEY 標識該屬性為該表的主鍵,可以唯一的標識對應的元組
FOREIGN KEY 標識該屬性為該表的外來鍵,是與之聯絡的某表的主鍵
NOT NULL 標識該屬性不能為空
UNIQUE 標識該屬性的值是唯一的
AUTO INCREMENT 標識該屬性的值自動增加,這是MySQL的SQL語句的特色
DEFAULT 為該屬性設定預設值

2.3.2 設定表的主鍵★★★

主鍵的主要目的是幫助MySQL以最快的速度查詢到表中的某一條資訊。主鍵必須滿 足的條件就是主鍵必須是唯一的,表中任意兩條記錄的主鍵欄位的值不能相同;主鍵的值是非空值。主鍵可以是單一的欄位,也可以是多個欄位的組合。

1.單欄位主鍵 主鍵是由一個欄位構成時,可以直接在該欄位的後面加上PRIMARY KEY來設定主 鍵。語法規則如下:

屬性名資料型別PRIMARY KEY

其中,“屬性名”引數表示表中欄位的名稱;“資料型別”引數指定欄位的資料型別。 【示例3-2】 下面在example 1表中設定stu_id作為主鍵,SQL程式碼如下:

CREATE TABLE example1 (
    stujd INT PRIMARY KEY,
    stu_name VARCHAR(20),
    stu_sex BOOLEAN
);

程式碼執行後,example1表中包含3個欄位。stu_id欄位是整型;stu_name欄位是字元 串型;stu_sex是布林型。其中,stu_id欄位是主鍵。

2.多欄位主鍵 主鍵是由多個屬性組合而成時,在屬性定義完之後統一設定主鍵。語法規則如下: PRIMARY KEY(屬性名1,屬性名2,…,屬性名n) 【示例3-3】下面在example2表中設定stu id與course id兩個欄位為主鍵,SQL程式碼 如下:

CREATE TABLE example2( 
stu_id INT,
coursejd INT,
grade "FLOAT,
PRIMARY KEY(stu_id, coursejd)
);

程式碼執行後,example2表中包含3個欄位。其中,stu_id和course id兩個欄位成為主鍵;stu id和course_id兩者的組合可以確定唯一的一條記錄。

2.3.3 設定表的外來鍵★★★

外來鍵的作用是建立該表與其父表的關聯關係。父表中刪除某條資訊時,子表中與之對應的資訊也必須有相應的改變。

【示例3-4】下面在example3表中設定stu_id和course_id為外來鍵。與之相關聯的是 example 1表中的主鍵stu id和course_id。SQL程式碼如下:

CREATE TABLE example3(
id INT PRIMARY KEY,
stu_id INT, 
coursejd INT,
CONSTRAINT c_fk FOREIGN KEY (stu_id, coursejd) REFERENCES example2(stu_id, coursejd)
);

注意:子表的外來鍵關聯的必須是父表的主鍵。而且,資料型別必須是一致。例如,兩者都是INT型別,或者都是CHAR型別。如果不滿足這樣的要求,在建立子表時, 就會出現"ERROR 1005 (HY000): Can't create table"錯誤。

2.3.4 設定表的非空約束★★★

非空性是指欄位的值不能為空值(NULL)。非空約束將保證所有記錄中該欄位都有值。

下面在example4表中設定欄位id和name的非空約束。SQL程式碼如下:

CREATE TABLE example4(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL
);

2.3.5 設定表的唯一性約束★★★

唯一性是指所有記錄中該欄位的值不能重複出現。設定表的唯一性約束是指在建立表時,為表的某些特殊欄位加上UNIQUE約束條件。唯一性約束將保證所有記錄中該欄位的值不能重複出現。

【示例3-6】下面在examples表中設定欄位id和stu_id的唯一性約束。SQL程式碼如下:

CREATE TABLE example5(
id INT PRIMARY KEY,
stujd INT UNIQUE,
name VARCHAR(20) NOT NULL
);

2.3.6 設定表的屬性的預設值★★★

在建立表時可以指定表中欄位的預設值。如果插入一條新的記錄時沒有為這個欄位賦值,那麼資料庫系統會自動為這個欄位插入預設值。預設值是通過DEFAULT關鍵字來設定的。

CREATE TABLE example7(
id INT PRIMARY KEY AUTO_INCREMENT,
stujd INT UNIQUE,
name VARCHAR20NOT NULL, 
English VARCHAR20DEFAULT 'zero'
);

2.4 查看錶結構

2.4.1查看錶結構★★★

SHOW CREATE TABLE example1 

查看錶結構是指檢視資料庫中已存在的表的定義。查看錶結構的語句包括DESCRIBE語句和SHOW CREATE TABLE語句。通過這兩個語句,可以查看錶的欄位名、欄位的資料型別和完整性約束條件等。

DESCRIBE example1;
DESC examplel;

程式碼執行後,結果顯示如下:

2.4.2 查看錶的詳細結構SHOW CREATE TABLE★★★

SHOW CREATE TABLE example1 

技巧:如果直接使用SHOW CREATE TABLE examplel語句,結果的顯示效果會比較差。尤其是遇到內容比較長的記錄,顯示的結果會很混亂。程式碼最後加上“\G” 引數,可以更加美觀的顯示內容,對內容比較長的記錄效果尤為明顯。

2.5修改表

修改表是指修改資料庫中已存在的表的定義。修改表比重新定義表簡單,不需要重新載入資料,也不會影響正在進行的服務。MySQL中通過ALTER TABLE語句來修改表。 修改表包括修改表名、修改欄位資料型別、修改欄位名、增加欄位、刪除欄位、修改欄位 的排列位置、更改預設儲存引擎和刪除表的外來鍵約束等

2.5.1 修改表名★★★

SHOW CREATE TABLE example1 

表名可以在一個數據庫中唯一的確定一張表。資料庫系統通過表名來區分不同的表。

ALTER TABLE 舊錶名 RENAME 新表名;

2.5.2 修改欄位的資料型別★★★★

SHOW CREATE TABLE example1 
SHOW CREATE TABLE example1 

欄位的資料型別包括整數型、浮點數型、字串型、二進位制型別、日期和時間型別等。

ALTER TABLE 表名 MODIFY 屬性名 資料型別;

2.5.3 修改欄位名★★★

SHOW CREATE TABLE example1 

段名可以在一張表中唯一的確定一個欄位。資料庫系統通過欄位名來區分表中的不同欄位.

ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新資料型別;

2.5.4增加欄位★★★

SHOW CREATE TABLE example1 
  • 増加無完整性約束條件的欄位

ALTER TABLE 表名 ADD 欄位名 資料型別;
  • 増加有完整性約束條件的欄位

ALTER TABLE user ADD age INT4NOT NULL:

2.5.5刪除欄位★★★

SHOW CREATE TABLE example1 

刪除欄位是指刪除已經定義好的表中的某個欄位。

ALTER TABLE 表名 DROP 欄位名;

2.5.6修改欄位的排列位置★★★

SHOW CREATE TABLE example1 
  • 欄位修改到第一個位置

ALTER TABLE user MODIFY name VARCHAR(30) FIRST:
  • 欄位修改到指定位置

ALTER TABLE user MODIFY sex TINYINT(1) AFTER phone;

2.6刪除表

刪除表是指刪除資料庫中已存在的表。刪除表時,會刪除表中的所有資料。

2.6.1刪除沒有被關聯的普通表★★★★

DROP TABLE 表名;

2.6.2刪除被其他表關聯的父表★★★★

執行ALTER TABLE語句,刪除 example4表的外來鍵約束。刪除example4表的外來鍵的SQL語句如下:

ALTER TABLE example4 DROP FOREIGN KEY d_fk;

查詢結果顯示,example4表中已經不存在外來鍵了。現在,已經消除了 example4表與 example1表的關聯關係,即可直接使用DROP TABLE語句刪除example1表。SQL程式碼如下:

DROP TABLE example1;

四、本單元知識總結

1.Mysql的資料型別
2.如何選擇資料型別
3.建立和刪除資料庫
4.修改資料庫