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

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

2021-10-11 18:14:21 資料庫

二、本單元知識點概述

(Ⅰ)知識點概述

、本單元教學目標

(Ⅰ)重點知識目標

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.修改資料庫

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309045.html

標籤:MySQL

上一篇:一口氣看完MySQL--上篇

下一篇:Shopee x JuiceFS:ClickHouse 冷熱資料分離存盤架構與實踐

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more