目錄
1.8 列屬性——是否爲空(null | not null)
1.10 列屬性——自動增長(auto_increment)
1、數據類型
1.1 值類型
1.1.1 整型
作爲SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數類型的存儲和範圍。
提示:無符號整數(unsigned):無符號沒有負數,正數部分是有符號的兩倍。
整型支持顯示寬度(最小的顯示位數) 比如int(5),如果數值的位數小於5位,前面加上前導0。比如輸入12,顯示00012;大於5位就不添加前導0。
注意:必須結合zerofill才起作用
1.1.2 浮點型(保存近似值小數)
FLOAT類型用於表示近似數值數據類型。SQL標準允許在關鍵字FLOAT後面的括號內選擇用位指定精度(但不能爲指數範圍)。MySQL還支持可選的只用於確定存儲大小的精度規定。0到23的精度對應FLOAT列的4字節單精度。24到53的精度對應DOUBLE列的8字節雙精度。
浮點型 | 佔用字節 | 範圍 |
float(單精度) | 4 | -3.4E+38~3.4E+38 |
double(雙精度) | 8 | -1.8E+308~1.8E+308 |
浮點數聲明:float(M,D) double(M,D)
M:總位數
D:小數位數
如果精度超過允許範圍,會四捨五入。
超過允許位數範圍會報錯:
浮點數存的是近似值,精度可能丟失。
1.1.3 定點數
decimal(M,D)
定點數是將小數的整數部分和小數部分分開保存,定點數不知道用幾個字節,它是變長的。
1.2 字符型
數據類型 | 描述 | 長度 |
char | 定長 | 最大255 |
varchar | 變長 | 最大65535 |
tinytext | 大段文本 | 2^8-1=255 |
text | 大段文本 | 2^16-1=65535 |
mediumtext | 大段文本 | 2^24-1 |
longtext | 大段文本 | 2^32-1 |
1)char(10)和varchar(10)的區別?
答:相同點:它們最多隻能保存10個字符;
不同點:char不回收富餘的字符,varchar會回收多餘的字符;
char效率高,浪費空間,varchar節省空間,效率比char低。
注意:char的最大長度是255,varchar理論長度是65535字節,實際根本達不到,具體長度與字符編碼有關。
編碼格式不同,實際的長度也不同。
一條記錄的長度不能超過65535.
大塊文本(text)不計算在總長度中,一個大塊文本只佔用10個字節來保存文本的地址。
1.3 枚舉(enum)
從集合中選擇一個數據(單選)
報錯原因:只能插入枚舉值。
MySQL的枚舉類型是通過整數來管理的,第一個值是1,第二個值是2,以此類推。
枚舉的優點:運行速度快(數字比字符串運算速度快);限制數據,保證數據完整性;節省空間。
思考:已知枚舉佔用2個字節,請問最多有多少個枚舉值?
答:2個字節=16位,可以保存數字(0-65535),枚舉是從1開始,所以枚舉最多可以有65535個枚舉值。
1.4 集合(set)
從集合中選擇一些數據(多選)
注意:插入順序不同,但是顯示的順序是一樣的。
插入集合中沒有的選項會報錯。
每個集合的元素都分配一個固定的數字,分配的方式從左往右按2的0、1、2、...次方
思考:已知集合佔用8個字節,最多可以表示幾個選項?
64 (8*8) 8個字節=64位,一個位表示1個選項,最多可以表示64個選項。
如果是多選,他們的關係是按位或。
1.5 日期
數據類型 | 描述 |
datetime | 日期時間,佔用8個字節 |
data | 日期 佔用3個字節 |
time | 時間 佔用3個字節 |
timestamp | 時間戳 佔用4個字節 |
year | 年份 佔用1個字節 |
1)datetime
格式:年-月-日 小時:分鐘:秒
加載不到10000年。
2)date
3)timestamp:時間戳
從1970年0時0分0秒到現在的秒數
timestamp類型和 datetime類型在表現上是一樣的。他們的區別: datetime是從1到9999,而timestamp從1970年~2038年,2038年01月19日11:14:07秒以後就超出timestamp範圍了。
4)year
因爲只佔用1個字節,最多隻能表示255個年份,範圍是1901-2155之間的年份
5)time 表示時間或時間間隔,範圍是-838:59:59~838:59:59
注意:time支持以天的方式插入。
1.6 boolean
MySQL不支持boolean類型,true和false在數據庫中對應1和0。
true和false在數據庫中對應1和0.
1.7 練習題
下列事物用什麼數據類型存儲?
手機號碼 char
電話號碼 varchar
性別 char enum
人的年齡 tinyint
照片信息 binary(理論) 一般存地址
薪水 decimal
注意:一個字段到底選數字還是字符,取決於有沒有計算的可能,如果沒有計算的可能即使是數字也要用字符類型,比如手機號、QQ號,…
1.8 列屬性——是否爲空(null | not null)
null:可以爲空
not null:不可爲空
思考題:
1)學生姓名允許爲空嗎? 非空
2)家庭地址 非空
3)電子郵件信息 可爲空
4)考試成績 可爲空
1.9 列屬性——默認值(default)
1、如果一個字段沒有插入值,可以默認插入一個指定的值。
2、default關鍵字用來插入默認值
1.10 列屬性——自動增長(auto_increment)
1、字段的值從1開始,每次遞增1,特點就在字段中的數據不可能重複,適合爲記錄生成唯一的id
2、自動增長都是無符號整數。
3、在MySQL中,auto_increment必須是主鍵。但是主鍵不一定是自動增長的。
4、如果要給自動增長列插入數據,使用null關鍵字。
5、自動增長列上的數據被刪除,默認情況下此記錄的編號不再使用。
1.11 列屬性——主鍵(primary key)
主鍵:唯一標識表中記錄的一個或一組列
主鍵的特點:不能重複,不能爲空
一個表只能有一個主鍵,主鍵可以有多個字段組成。
主鍵的作用:
1、 保證數據完整性
2、 加快查詢速度
1.11.1 添加主鍵
1)創建表的時候添加主鍵
注意:
如果插入主鍵相同的數據就會報錯
主鍵不能插入空值
2)創建表的時候添加主鍵
3)更改表的時候添加主鍵
1.11.2 創建組合鍵
1.11.2 查看主鍵
1.11.3 刪除主鍵
1.11.4 選擇主鍵的原則
1、 最少性:儘量選擇一個字段做主鍵
2、 穩定性:儘量選擇更新少的列做主鍵
3、 儘量選擇數字型的列做主鍵
1.11.5 主鍵思考題
1、在主鍵列輸入的數值,允許爲空嗎? 不可以
2、 一個表可以有多個主鍵嗎? 不可以
3、 在一個學校數據庫中,如果一個學校內允許重名的學員,但是一個班級內不允許學員重名,可以組合班級和姓名兩個字段一起來作爲主鍵嗎? 可以
4、 標識列(自動增長列)允許爲字符數據類型嗎? 不可以
5、 表中沒有合適的列作爲主鍵怎麼辦? 添加自動增加列
6、 如果標識列A的初始值爲1,增長量爲1,則輸入三行數據以後,再刪除兩行,下次再輸入數據行的時候,標識值從多少開始? 從4開始
1.12 列屬性——唯一鍵
特點:
1、不能重複,可以爲空
2、一個表可以有多個唯一鍵
作用:
1、 保證數據不能重複。保證數據完整性
2、 加快數據訪問
1.12.1 添加唯一鍵
方法一:創建表的時候添加唯一鍵
方法二:修改表的時候添加唯一鍵
添加一個唯一鍵
添加多個唯一鍵
與上面的不同,添加組合唯一鍵:
還有一種方法
1.12.2 查看唯一鍵
添加唯一鍵,給唯一鍵起名字:
1.12.3 刪除唯一鍵
通過唯一鍵的名字來刪除唯一鍵
alter table 表名 drop index 唯一鍵名稱
eg:
顯示結果:
問題:主鍵和唯一鍵的區別?
1、主鍵不能重複,不能爲空,唯一鍵不能重複,可以爲空
2、主鍵只有一個,唯一鍵可以有多個。
1.13 列屬性——備註(comment)
爲了程序員之間的相互交流
1.14 SQL註釋
單行註釋:--或#
多行註釋:/* */
1.15 數據完整性介紹
1.15.1 保證實體完整性
1、 主鍵約束
2、 唯一約束
3、 自動增長列
1.15.2 保證域完整性
1、 數據類型約束
2、 非空約束
3、 默認值約束
1.15.3 保證引用完整性
1、外鍵約束:從表中的公共字段是主表的外鍵
1.16 引用完整性
1.16.1 主表和從表
兩個表建立關係(兩個表只要有公共字段就有關係),一個表稱爲主表,一個表稱爲從表。
外鍵約束可以實現:
1、 主表中沒有的從表中不允許插入
2、 從表中有的主表中不允許刪除
3、 不能更改主表中的值而導致從表中的記錄孤立存在。
4、 先刪除從表,再刪除主表
1.16.2 外鍵(foreign key)
1、 外鍵:從表中的公共字段,公共字段的名字可以不一樣,但是數據類型必須一樣。
2、 外鍵約束用來保證引用完整性
1.16.3 添加外鍵
方法一:創建表的時候添加外鍵
添加如下字段失敗,因爲在stumarks中的id不是stuinfo的外鍵,主表中沒有該id的信息:
在主表中添加該id信息後,
在從表中才能添加相應的信息:
直接無法刪除主表的信息
必須先刪除從表對應id的信息後方能刪除
總結:主表中沒有的,從表中不允許刪除;從表中有的,主表中不能刪除;不能更改主表的數據後使得從表的數據獨立。
方法二:修改表的時候添加外鍵
注意:要創建外鍵必須是innodb引擎,myisam不支持外鍵約束!!
1.16.4 查看外鍵
外鍵爲:stuid
1.16.5 刪除外鍵
通過外鍵的名字刪除外鍵
mysql 語法:alter table 表名 drop foreign key 外鍵名
從表是:stumarks 主表是stuinfo
1.17 外鍵操作
1、 嚴格操作(前面講的是嚴格操作)
2、 置空操作(set null):如果主表記錄刪除或更新,從表置空
3、 級聯操作(cascade):如果主表記錄刪除或更新,從表級聯
一般來說:主表刪除的時候,從表置空操作,主表更新的時候,從表級聯操作。
mysql 語法:foreign key(外鍵) references 主表(關鍵字段)[主表刪除是的動作][主表更新時候的動作]
1.18 客戶端介紹
第一:命令行
第二:MySQL-Front和Navicat
MySQL-Front