數據類型
數據庫mysql中也是分很多數據類型的,最常用的就是:數字類型、字符類型、日期類型、枚舉與集合類型
一、數字類型:
默認都是有符號的,即正負號,若想無符號,在創建表時加unsigned。指定寬度時,只影響顯示寬度不影響存儲,即只決定讀不決定寫。
注:其實我們完全沒必要為整數類型指定顯示寬度,使用默認的就可以了
最常用的是int,常用的一般是tinyint和int
tinyint:1個字節,有符號時可存(-128~127),無符號時可存(0~255),超過范圍的數存成最大范圍的那個數
smallint:2個字節,有符號時可存(-2^15~2^15 -1),無符號時可存(0~2^16 -1)
mediumint:3個字節,有符號時可存(-2^23~2^23 -1),無符號時可存(0~2^24 -1)
int:4個字節,有符號是可存(-2^31~2^31 -1),無符號是可存(0~2^32 -1)
bigint:8個字節,有符號時可存(-2^63~2^63 -1),無符號時可存(0~2^64 -1)
另外還有浮點型: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;#查看時需要轉換一下進制,需要什么進制呈現就用相應的函數
二、字符類型:寬度約束的是字符的個數
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
三、時間類型:根據不同的需求選擇不同的時間類型
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');#這種形式也支持
四、枚舉與集合: 字段只能在給定的范圍內選擇。枚舉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。插入記錄時先操作父表,再操作字表。