數據庫mysql中也是分不少數據類型的,最經常使用的就是:數字類型、字符類型、日期類型、枚舉與集合類型mysql
1、數字類型:sql
默認都是有符號的,即正負號,若想無符號,在建立表時加unsigned。指定寬度時,隻影響顯示寬度不影響存儲,即只決定讀不決定寫。數據庫
注:其實咱們徹底不必爲整數類型指定顯示寬度,使用默認的就能夠了session
最經常使用的是int,經常使用的通常是tinyint和int函數
tinyint:1個字節,有符號時可存(-128~127),無符號時可存(0~255),超過範圍的數存成最大範圍的那個數spa
smallint:2個字節,有符號時可存(-2^15~2^15 -1),無符號時可存(0~2^16 -1)code
mediumint:3個字節,有符號時可存(-2^23~2^23 -1),無符號時可存(0~2^24 -1)blog
int:4個字節,有符號是可存(-2^31~2^31 -1),無符號是可存(0~2^32 -1)內存
bigint:8個字節,有符號時可存(-2^63~2^63 -1),無符號時可存(0~2^64 -1)utf-8
另外還有浮點型:float、double和decimal
float和double不精準,超過精準範圍的小數會被削爲0,但在平常狀況下已足夠使用。decimal是精準浮點數,但比較消耗內存,因此在通常狀況下建議使用float。格式爲float(x,y),其中的x表明數字總個數不算符號,y表明保留的小數點位數
bit類型:用來存放二進制數,範圍爲1~64,不指定則默認1位
create table t1(id bit);#bit後可加括號指定範圍,不指定默認爲1
insert into t1 values(8);#在表中添加一個8
select bin(id),hex(id),oct(id) from t1;#查看時須要轉換一下進制,須要什麼進制呈現就用相應的函數
2、字符類型:寬度約束的是字符的個數
char:定長,不夠寬度時用空格補齊。字符長度範圍:0~255
特色:存取效率快,但浪費空間。存儲時會在右側填充空格以知足指定長度,但在查詢時有自動刪除空格。
varchar:變長,在指定寬度內存什麼就是什麼。字符長度範圍:0~65535
特色:精準,節省空間但存儲效率較慢。
注:雖然varchar更精準,但通常都是用char多一點,畢竟在精準度要求並無特別高的狀況下效率比較重要
#查看字符的長度 select x,char_length(x) from t1; #查看字節的長度(utf-8中一箇中文字符佔三個字節) select x,length(x) from t1; #以上方式查看時,char會自動刪除空格,需在查詢前指定 set sql_mode='pad_char_to_full_length'; #才能夠將char類型的數據完整的查看 #舉例: create table t1(name1 char(10),name2 varchar(5)); insert into t1 values('ladygaga','egon'); select name1,char_length(name1),nam2,char_length(name2) from t1; select name1,length(name1),nam2,length(name2) from t1; #查詢結果爲8,4 #指定set sql_mode='pad_char_to_full_length';後查詢結果爲10,4
3、時間類型:根據不一樣的需求選擇不一樣的時間類型
datetime:yyyy-mm-dd hh:mm:ss 範圍爲1000-01-01 00:00:00~9999-12-31 23:59:59
year:yyyy 範圍爲1901~2155,不管指定何種寬度,最後都是4
date:yyyy-mm-dd 範圍爲1000-01-01~9999-12-31
time:hh:mm:ss
單獨插入時間時須要以字符的形式,按照對應格式。插入年份時儘可能使用4位值,若是用兩位的話須要知道:當輸入的2位<=69時,顯示爲20xx;當輸入的的2位>=70時,顯示爲19xx。
舉例:
create table t2(id int,born_date date,born_year year,reg_time datetime,class_time time); insert into t2 values(1,'alex',now(),now(),now(),now());#now()函數自動插入當前時間 insert into t2 values(2,'egon','2017-09-11','2017','2017-09-11 17:17:17','17:17:17');#標準形式 insert into t2 values(3,'eva','20170911','2017','20170911171717','171717');#這種形式也支持
4、枚舉與集合: 字段只能在給定的範圍內選擇。枚舉enum爲單選,集合set爲多選,可設定默認值
舉例說明
create table t3 (id int primary key auto_increment,#自增id name=char(5), sex enum('male','female'),#枚舉,二選一 hobbies set('eat','sleep','run','sing')#集合,多選 ); insert into t3 (name,sex,hobbies) values('egon','male','eat,sleep');
not null 和null:不爲空和可爲空,建立時指定,不指定時默認爲可空
default:設置默認值的關鍵字,用來設置不傳值時的默認值。若字段設置了默認值,插入空時填入的就是默認值
unique:標識該字段是惟一的
#方法一: create table t4(name char(10) unique); #方法二: create table t5(name char(10),constraint uk_name unique(name)); #聯合惟一:表示多個字段聯合惟一,只要有一個字段不一樣便可插入,只有在全部字段都相同是纔不可插入 create t6(id int,name char(10),host char(20) not null,port int not null,unique(host,port)); #將host和port聯合惟一,若host和port都同樣則不許插入 insert into t6(1,'mao',192.168.0.0',8080); insert into t6(2,'gou',192.168.0.1',8080); insert into t6(3,'zhu',192.168.0.1',8081);#均可插入 insert into t6(4,'ji',192.168.0.1',8081);#不可插入
primary key:主鍵,不爲空且惟一
#方法一: create table t7(id int not null unique);#遵循不爲空且惟一,但不是主鍵的正確表達式 #方法二: create table t7(id int primary key); #方法三: create table t7(id int,constraint pk_name primary key(id));
auto_increment:自增,被約束字段必須同時被key約束。對於自增的字段,delete刪除後再插入值,該字段扔按照刪除前的位置繼續增加
auto_increment_offset:偏移量,默認值爲1
auto_increment_increment:步長,默認值爲1
全局範圍內設置步長set global auto_increment_increment=2;
當前會話範圍內設置步長set session auto_increment_increment=2;
同時設置偏移量和步長的狀況下,若偏移量的值>步長的值,則偏移量的值就會被忽略,即失效,即偏移量=1
foreign key:外鍵,用於表的關聯(重點!查詢語句中最難點)
當有多張表,表1的多條記錄能夠對應到表2的一條記錄時,就能夠將其關聯起來。此時必須保證表2的該記錄是惟一的。
能夠一對一關聯,也能夠多對一關聯,多對多關聯
舉例:將下面的表進行相應的關聯
要求:學生表關聯班級表,課程表關聯老師表,成績表關聯全部表
注:先創建父表,即要被關聯的表,再創建子表並創建外鍵關聯父表,同步更新on update cascade,同步刪除on delete cascade。插入記錄時先操做父表,再操做字表。