迷你整形,系統采用一個字節來保存的整形:一個字節 = 8位,最大能表示的數值是0-255
Smallint小整形,系統采用兩個字節來保存的整形:能表示0-65535之間
Mediumint中整形,采用三個字節來保存數據。
Int整形(标準整形),采用四個字節來保存數據。
Bigint大整形,采用八個字節來保存數據。
1、 創建數據表
2、 插入合理數據
3、 插入錯誤數據(超出對應的數據範圍)
4、 錯誤原因:并不是說tinyint沒有這麼大的空間,而是因為mysql默認的為整形增加負數。
實際表示的區間為-128,127
實際應用中,應該根據對應的數據的範圍來選定對應的整形類型:通常使用的比較多的TINYINT和int。
無符号标識設定無符号:表示存儲的數據在當前字段中,沒有負數(隻有正數,區間為0-255)
基本語法:在類型之後加上一個 unsigned
顯示長度:指數據(整型)在數據顯示的時候,到底可以顯示多長位。
Tinyint(3): 表示最長可以顯示3位,unsigned說明隻能是正數,0-255永遠不會超過三個長度
Tinyint(4):表示最長可以顯示4位,-128~127
顯示長度隻是代表了數據是否可以達到指定的長度,但是不會自動滿足到指定長度:如果想要數據顯示的時候,保持最高位(顯示長度),那麼還需要給字段增加一個zerofill屬性才可以。
Zerofill:從左側開始填充0(左側不會改變數值大小),所以負數的時候就不能使用zerofill,一旦使用zerofill就相當于确定該字段為unsigned
數據顯示的時候,zerofill會在左側填充0到指定位:如果不足3位,那麼填充到3位,如果本身已經夠了或者超出,那麼就不在填充。
顯示長度可以自己設定:超出長度(但是不超出範圍)不會影響,隻會對不夠長度的進行補充(顯示長度)
專門用來存儲小數的
在Mysql中将小數類型又分為兩類:浮點型和定點型
浮點型浮點型又稱之為精度類型:是一種有可能丢失精度的數據類型,數據有可能不那麼準确(由其是在超出範圍的時候)
浮點型之所以能夠存儲較大的數值(不精确),原因就是利用存儲數據的位來存儲指數
整型:所有位都為1
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
計算結果:
浮點型:有部分用于存儲數據,有部分用于存指數
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
前三位轉換成十進制之後用作10的指數: 10^7 * 數據值
FloatFloat又稱之為單精度類型:系統提供4個字節用來存儲數據,但是能表示的數據範圍比整型大的多,大概是10^38;隻能保證大概7個左右的精度(如果數據在7位數以内,那麼基本是準确的,但是如果超過7位數,那麼就是不準确的)
基本語法
Float:表示不指定小數位的浮點數
Float(M,D):表示一共存儲M個有效數字,其中小數部分占D位
Float(10,2):整數部分為8位,小數部分為2位
1、 創建一個數據表保存浮點數據
2、 存入數據:合法數據
注意:如果數據精度丢失,那麼浮點型是按照四舍五入的方式進行計算
3、 插入數據,超出大小
4、 數據長度剛好滿足條件,但是會超出精度
說明:用戶不能插入數據直接超過指定的整數部分長度,但是如果是系統自動進位導緻,系統可以承擔。
5、浮點數可以采用科學計數法來存儲數據
浮點數的應用:通常是用來保存一些數量特别大,大到可以不用那麼精确的數據。
DoubleDouble又稱之為雙精度:系統用8個字節來存儲數據,表示的範圍更大,10^308次方,但是精度也隻有15位左右。
定點數定點數:能夠保證數據精确的小數(小數部分可能不精确,超出長度會四舍五入),整數部分一定精确
DecimalDecimal定點數:系統自動根據存儲的數據來分配存儲空間,每大概9個數就會分配四個字節來進行存儲,同時小數和整數部分是分開的。
Decimal(M,D):M表示總長度,最大值不能超過65,D代表小數部分長度,最長不能超過30。
1、 創建表:與浮點數對比
2、 插入正常數據
3、 插入最大數據
4、 嘗試定點數進行四舍五入
定點數的應用:如果涉及到錢的時候有可能使用定點數
時間日期類型Date日期類型:系統使用三個字節來存儲數據,對應的格式為:YYYY-mm-dd,能表示的範圍是從1000-01-01 到9999-12-12,初始值為0000-00-00
Time時間類型:能夠表示某個指定的時間,但是系統同樣是提供3個字節來存儲,對應的格式為:HH:ii:ss,但是mysql中的time類型能夠表示時間範圍要大的多,能表示從-838:59:59~838:59:59,在mysql中具體的用處是用來描述時間段。
Datetime日期時間類型:就是将前面的date和time合并起來,表示的時間,使用8個字節存儲數據,格式為YYYY-mm-dd HH:ii:ss,能表示的區間1000-01-01 00:00:00 到9999-12-12 23:59:59,其可以為0值:0000-00-00 00:00:00
Timestamp時間戳類型:mysql中的時間戳隻是表示從格林威治時間開始,但是其格式依然是:YYYY-mm-dd HH:ii:ss
Year年類型:占用一個字節來保存,能表示1900~2155年,但是year有兩種數據插入方式:0~99和四位數的具體年
1、 創建對應的時間日期類型的數據表
2、 插入數據:正常數據
3、 year的特殊性:可以采用兩位數的數據插入,也可以采用四位數的年份插入
4、 year進行兩位數插入的時候,有一個區間劃分,零界點為69和70:當輸入69以下,那麼系統時間為20 數字,如果是70以上,那配系統時間為19 數字
5、 timestamp當對應的數據被修改的時候,會自動更新(這個被修改的數據不是自己)
6、 time類型特殊性:本質是用來表示時間區間(當前時間之後的多少個小時),能表示的範圍比較大
7、 在進行時間類型錄入的時候(time)還可以使用一個簡單的日期代替時間,在時間格式之前加一個空格,然後指定一個數字(可以是負數):系統會自動将該數字轉換成天數 * 24小時,再加上後面的時間。
PHP中有着非常強大的時間日期轉換函數:date将時間戳轉換成想要的格式,strtotime又可以将很多格式轉換成對應的時間戳。PHP通常不需要數據庫來幫助處理這麼複雜的時間日期,所以通常配合PHP的時候,時間的保存通常使用時間戳(真正),從而用整型來保存。字符串型
Mysql記錄長度在mysql中,有一項規定:mysql的記錄長度(record == 行row)總長度不能超過65535個字節。
Varchar能夠存儲的理論值為65535個字符:字符在不同的字符集下可能占用多個字節。
1、 創建表:證明varchar在mysql中能夠達到的理論值(utf8和GBK)
Varchar除了存儲的數據本身要占用空間:還需要額外的空間來保存記錄長度
2、 計算在utf8和GBK下對應的varchar能夠存儲的長度
Utf8 最多隻能存儲21844個字符
GBK最多隻能存儲32766個字符
定長字符:指定長度之後,系統一定會分配指定的空間用于存儲數據
基本語法:char(L),L代表字符數(中文與英文字母一樣),L長度為0到255
Varchar變長字符:指定長度之後,系統會根據實際存儲的數據來計算長度,分配合适的長度(數據沒有超出長度)
基本語法:Varchar(L),L代表字符數,L的長度理論值位0到65535
因為varchar要記錄數據長度(系統根據數據長度自動分配空間),所以每個varchar數據産生後,系統都會在數據後面增加1-2個字節的額外開銷:是用來保存數據所占用的空間長度
如果數據本身小于127個字符:額外開銷一個字節;如果大于127個,就開銷兩個字節
Char和varchar數據存儲對比(utf8,一個字符都會占用3個字節)
存儲數據 |
Char(2) |
Varchar(2) |
Char所占字節 |
Varchar所占字節 |
A |
A |
A |
2 * 3 = 6 |
1 * 3 1 = 4 |
AB |
AB |
AB |
2 * 3 = 6 |
2 * 3 1 = 7 |
Char和varchar的區别
1、 char一定會使用指定的空間,varchar是根據數據來定空間
2、 char的數據查詢效率比varchar高:varchar是需要通過後面的記錄數來計算
如果确定數據一定是占指定長度,那麼使用char類型;
如果不确定數據到底有多少,那麼使用varchar類型;
如果數據長度超過255個字符,不論是否固定長度,都會使用text,不再使用char和varchar
Text文本類型:本質上mysql提供了兩種文本類型
Text:存儲普通的字符文本
Blob:存儲二進制文本(圖片,文件),一般都不會使用blob來存儲文件本身,通常是使用一個鍊接來指向對應的文件本身。
Text:系統中提供的四種text
Tinytext:系統使用一個字節來保存,實際能夠存儲的數據為:2 ^ 8 1
Text:使用兩個字節保存,實際存儲為:2 ^ 16 2
Mediumtext:使用三個字節保存,實際存儲為:2 ^ 24 3
Longtext:使用四個字節保存,實際存儲為:2 ^ 32 4
注意:
1、 在選擇對應的存儲文本的時候,不用刻意去選擇text類型,系統會自動根據存儲的數據長度來選擇合适的文本類型。
2、 在選擇字符存儲的時候,如果數據超過255個字符,那麼一定選擇text存儲
Enum枚舉類型:在數據插入之前,先設定幾個項,這幾個項就是可能最終出現的數據結果。
如果确定某個字段的數據隻有那麼幾個值:如性别,男、女、保密,系統就可以在設定字段的時候規定當前字段隻能存放固定的幾個值:使用枚舉
基本語法:enum(數據值1,數據值2…)
系統提供了1到2個字節來存儲枚舉數據:通過計算enum列舉的具體值來選擇實際的存儲空間:如果數據值列表在255個以内,那麼一個字節就夠,如果超過255但是小于65535,那麼系統采用兩個字節保存。
1、 創建表
2、 插入數據:合法數據,字段對應的值必須是設定表的時候所确定的值
3、 錯誤數據:enum有規範數據的功能,能夠保證插入的數據必須是設定的範圍,其他類型都不可以
4、 枚舉enum的存儲原理:實際上字段上所存儲的值并不是真正的字符串,而是字符串對應的下标:當系統設定枚舉類型的時候,會給枚舉中每個元素定義一個下标,這個下标規則從1開始
Enum(1=>‘男’,2=>’女’,3=>’保密’)
特性:在mysql中系統是自動進行類型轉換的:如果數據碰到“ 、-、*、/”系統就會自動将數據轉換成數值:而普通字符串轉換成數值為0
Select 字段名 0 from 表名;
5、 既然實際enum字段存儲的結果是數值:那麼在進行數據插入的時候,就可以使用對應的數值來進行。
枚舉的意義:
1、 規範數據本身,限定隻能插入規定的數據項
2、 節省存儲空間
Set集合:是一種将多個數據選項可以同時保存的數據類型,本質是将指定的項按照對應的二進制位來進行控制:1表示該選項被選中,0表示該選項沒有被選中。
基本語法:set(‘值1’,’值2’,’值3’…)
系統為set提供了多個字節進行保存,但是系統會自動計算來選擇具體的存儲單元
1個字節:set隻能有8個選項
2個字節:set隻能有16個選項
3個字節:set隻能表示24個選項
8個字節:set可以表示64個選項
Set和enum一樣,最終存儲到數據字段中的依然是數字而不是真實的字符串
1、 創建表
2、 插入數據:可以插入多個數據,就是在數據插入的字符串中,使用對應的逗号“,”将選項進行隔開
3、 數據選項所在的數據與數據插入的順序無關:最終都會變成選項對應的順序
4、 分析數據存儲的方式
4.1 系統将對應的數據選項(設計)按照順序進行編排:從第一個開始進行占位,每一個都對應一個二進制位。
4.2 數據在存儲的時候,如果被選中,那麼對應的位的值就為1,否則為0
4.3 系統在進行存儲的時候會自動将得到的最終的二進制颠倒過來,然後再進行轉換成十進制存儲
5、 查看數據:按照自動轉換成數值來查看
6、 既然是數值,那麼就可以插入數值來代替實際插入數據
注意:數字插入的前提是對應的二進制位上都有對應的數據項
Set集合的意義:
1、 規範數據
2、 節省存儲空間
Enum:單選框
Set:複選框
列屬性列屬性又稱之為字段屬性,在mysql中一共有6個屬性:null,默認值,列描述,主鍵,唯一鍵和自動增長
Null屬性NULL屬性:代表字段為空
如果對應的值為YES表示該字段可以為NULL
注意:
1、 在設計表的時候,盡量不要讓數據為空
2、 Mysql的記錄長度為65535個字節,如果一個表中有字段允許為NULL,那麼系統就會設計保留一個字節來存儲NULL,最終有效存儲長度為65534個字節。
默認值Default:默認值,當字段被設計的時候,如果允許默認條件下,用戶不進行數據的插入,那麼就可以使用事先準備好的數據來填充:通常填充的是NULL
測試:不給當前字段提供數據值
Default關鍵字的另外一層使用:顯示的告知字段使用默認值:在進行數據插入的時候,對字段值直接使用default
列描述:comment,是專門用于給開發人員進行維護的一個注釋說明
基本語法:comment ‘字段描述’;
查看Comment:必須通過查看表創建語句
顧名思義:主要的鍵,primary key,在一張表中,有且隻有一個字段,裡面的值具有唯一性
創建主鍵随表創建系統提供了兩種增加主鍵的方式
1、 方案1:直接在需要當做主鍵的字段之後,增加primary key屬性來确定主鍵
2、 方案2:在所有字段之後增加primary key選項:primary key(字段信息)
基本語法:alter table 表名 add primary key(字段);
方案1:查看表結構
方案2:查看表的創建語句
基本語法:alter table 表名 drop primary key;
案例:有一張學生選修課表:一個學生可以選修多個選修課,一個選修課也可以由多個學生來選:但是一個學生在一個選修課中隻有一個成績。
主鍵一旦增加,那麼對對應的字段有數據要求
1、 當前字段對應的數據不能為空;
2、 當前字段對應的數據不能有任何重複
主鍵分類采用的是主鍵所對應的字段的業務意義分類
業務主鍵:主鍵所在的字段,具有業務意義(學生ID,課程ID)
邏輯主鍵:自然增長的整型(應用廣泛)
自動增長自動增長:auto_increment,當給定某個字段該屬性之後,該列的數據在沒有提供确定數據的時候,系統會根據之前已經存在的數據進行自動增加後,填充數據。
通常自動增長用于邏輯主鍵。
原理自動增長的原理:
1、 在系統中有維護一組數據,用來保存當前使用了自動增長屬性的字段,記住當前對應的數據值,再給定一個指定的步長
2、 當用戶進行數據插入的時候,如果沒有給定值,系統在原始值上再加上步長變成新的數據
3、 自動增長的觸發:給定屬性的字段沒有提供值
4、 自動增長隻适用于數值
使用自動增長基本語法:在字段之後增加一個屬性auto_increment
插入數據:觸發自動增長,不能給定具體值
1、 查看自增長:自增長一旦觸發使用之後,會自動的在表選項中增加一個選項(一張表最多隻能擁有一個自增長)
2、 表選項可以通過修改表結構來實現
Alter table 表名 auto_increment = 值;
删除自增長:就是在字段屬性之後不再保留auto_increment,當用戶修改自增長所在字段時,如果沒有看到auto_increment屬性,系統會自動清除該自增長
在系統中,有一組變量用來維護自增長的初始值和步長
Show variables like ‘auto_increment%’;
1、 一張表隻有一個自增長:自增長會上升到表選項中
2、 如果數據插入中沒有觸發自增長(給定了數據),那麼自增長不會表現
3、 自增長修改的時候,值可以較大,但是不能比當前已有的自增長字段的值小
唯一鍵:unique key,用來保證對應的字段中的數據唯一的。
主鍵也可以用來保證字段數據唯一性,但是一張表隻有一個主鍵。
1、 唯一鍵在一張表中可以有多個。
2、 唯一鍵允許字段數據為NULL,NULL可以有多個(NULL不參與比較)
創建唯一鍵創建唯一鍵與創建主鍵非常類似
1、 直接在表字段之後增加唯一鍵标識符:unique[ key]
2、 在所有的字段之後使用unique key(字段列表);
3、 在創建完表之後也可以增加唯一鍵alter table 表名 add unique key(字段列表);
唯一鍵是屬性,可以通過查看表結構來實現
唯一鍵效果:在不為空的情況下,不允許重複
在查看表創建語句的時候,會看到與主鍵不同的一點:多出一個“名字”
一個表中允許存在多個唯一鍵:假設命令為主鍵一樣:alter table 表名 drop unique key;//錯誤的
Index關鍵字:索引,唯一鍵是索引一種(提升查詢效率)
删除的基本語法:alter table 表名 drop index 唯一鍵名字;
修改唯一鍵:先删除後增加
複合唯一鍵唯一鍵與主鍵一樣可以使用多個字段來共同保證唯一性;
一般主鍵都是單一字段(邏輯主鍵),而其他需要唯一性的内容都是由唯一鍵來處理。
表關系表關系:表與表之間(實體)有什麼樣的關系,每種關系應該如何設計表結構。
一對一一對一:一張表中的一條記錄與另外一張表中最多有一條明确的關系:通常,此設計方案保證兩張表中使用同樣的主鍵即可
學生表
學生ID(PRI) |
姓名 |
年齡 |
性别 |
籍貫 |
婚否 |
住址 |
表的使用過程中:常用的信息會經常去查詢,而不常用的信息會偶爾才會用到。
解決方案:将兩張表拆分,常見的放一張表,不常見的放一張表
常用表
學生ID(PRI) |
姓名 |
年齡 |
性别 |
不常用表
學生ID(PRI) |
籍貫 |
婚否 |
住址 |
一對多,通常也叫作多對一的關系。通常一對多的關系設計的方案,在“多”關系的表中去維護一個字段,這個字段是“一”關系的主鍵。
母親表
母親ID |
姓名 |
年齡 |
身高 |
M1 | |||
M2 |
孩子表
孩子ID |
姓名 |
年齡 |
身高 |
母親ID |
K1 |
M1 | |||
K2 |
M1 |
多對多:一張表中的一條記錄在另外一張表中可以匹配到多條記錄,反過來也一樣。
多對多的關系如果按照多對一的關系維護:就會出現一個字段中有多個其他表的主鍵,在訪問的時候就會帶來不便。
既然通過兩張表自己增加字段解決不了問題,那麼就通過第三張表來解決。
師生關系
1、 一個老師教過多個班級的學生;
2、 一個學生聽過多個老師講的課;
首先得有兩個實體:老師表和學生表
從中間設計一張表:維護兩張表對應的每一種聯系都包含
多對多解決方案;增加一個中間表,讓中間表與對應的其他表形成兩個多對一的關系:多對一的解決方案是在“多”表中增加“一”表對應的主鍵字段。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!