一 整形
1 只有Int類型跟存儲沒有關系,顯示的是寬度,其他類型都是限制 2 整形類型;[(m)][unsigned][zerofill] 3 作用;存儲年齡,等級,id,各種號碼 4 m,代表顯示寬度 默認11 其他數據類型標識的就是幾個字節,限制幾個字節 5 unsigned,代表 限制沒有字符 6 zerofill,代表 寬度顯示不夠,用0補全 7 8 1 整數數字 默認有符號 9 tinyint(1個字節),int(4個字節),bigint(8個字節):注意一下,約束條件和范圍 10 常用 int,bigint 其中int最為常用 11 因為有符號的原因,占用了一個bit位,所以在范圍上,有無符號有差別的 12 1.1 tinyint(1個字節) 2**8 13 create table t1(id tinyint); 14 alter table t1 modify id tinyint unsigned; 改成無符號,如果有數據 先要清空 15 小整數,數據類型用於保存一些范圍的整數數值范圍 16 有符號,-128 到 127 17 無符號,0 到 255 18 1.2 int(4個字節) 2**32 19 create table t1(id int); 20 整數,數據類型用於保存一些范圍的整數數值范圍: 21 有符號,-2147483648 ~ 2147483647 22 無符號,0 ~ 4294967295 23 1.3 bigint(8個字節) 2**64 24 create table t1(id bigint); 25 大整數,數據類型用於保存一些范圍的整數數值范圍: 26 有符號,-9223372036854775808 ~ 9223372036854775807 27 無符號,0 ~ 18446744073709551615 28 29 1.2 寬度 不指定寬度,默認會有int 11,默認合理合法,11位包含了2**32有無符號都包括了 30 alter table t1 modify id int(3); 修改寬度,是修改顯示的寬度 31 alter table t1 modify id int(8) zerofill; 顯示寬度不夠,用0補全,在前面補全 32 如果沒有zerofill這個限制,select * from t1;查看沒什么效果 33 34 ** 注意,修改有無符號,或者補全的時候,都是需要將表里數據清空 35 整數在約束上加上zerofill會自動添加無符號,unsigned
二 浮點數 默認有符號
1 浮點數 默認有符號 2 decimal[(m[,d])] [unsigned] [zerofill] 3 准確的小數值,m是數字總個數(負號不算),d是小數點后個數。 m最大值為65,d最大值為30。 4 特別的;對於精確數值計算時需要用此類型 5 decaimal能夠存儲精確值的原因在於其內部按照字符串存儲。 6 7 FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 4字節 8 單精度浮點數(非准確小數值),m是數字總個數,d是小數點后個數。 9 10 DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 8字節 11 雙精度浮點數(非准確小數值),m是數字總個數,d是小數點后個數。 12 13 2.1 示例 14 create table t1(salary float(5,2)); 15 insert into t1 values (3.4343); 16 inster into t1 values (1111.22); 超出,報錯 17 5是寬度限制,2表示小數點位數,所以整數最多3位 18 19 ** 注意,浮點數在約束上加上zerofill會自動添加無符號,unsigned 20 21 22 3 位類型 BIT 存儲二進制,默認只能存儲一位,也就是能存儲0,1 23 BIT(M)可以用來存放多位二進制數,M范圍從1~64,如果不寫默認為1位。 24 注意:對於位字段需要使用函數讀取 25 bin()顯示為二進制 26 hex()顯示為十六進制 27 3 .1 示例 28 create table t1(name bit); 29 insert into t1 values(0),(1); 30 插入其他的就會報錯了,或者你開始創建表的時候給默認寬度 31 create table t1(name bit(4)); 代表四個比特位 32 select * from t1; 查看不到因為是二進制 33 select bin(x) from t5; 這樣查看 34 seleect hex(x) from t5; 十進制
三 位類型 BIT 存儲二進制,默認只能存儲一位,也就是能存儲0,1
1 位類型 BIT 存儲二進制,默認只能存儲一位,也就是能存儲0,1 2 BIT(M)可以用來存放多位二進制數,M范圍從1~64,如果不寫默認為1位。 3 注意:對於位字段需要使用函數讀取 4 bin()顯示為二進制 5 hex()顯示為十六進制 6 3 .1 示例 7 create table t1(name bit); 8 insert into t1 values(0),(1); 9 插入其他的就會報錯了,或者你開始創建表的時候給默認寬度 10 create table t1(name bit(4)); 代表四個比特位 11 select * from t1; 查看不到因為是二進制 12 select bin(x) from t5; 這樣查看 13 seleect hex(x) from t5; 十進制 14 15 3.2 位數1 就是 0 2**0 16 位數2 就是 0 2**1+2**0 以此類推,最多64位,記住二進制的運算 17 通過bin(x)查詢的結果就是二進制, 18 比如位數1 插入值是0 or 1結果就是 0 or 1 19 位數2 插入值是0 or 1 or 2 or 3 結果就是 0 or 1 or 10 or 11
四 char與varchar測試
1 char 定長(不夠湊夠固定長度,浪費空間,存取效率快) 2 varchar 變長(精准,計算出待放的數據長度,節省空間,效率低) 3 而且存儲的時候,還需要存儲頭,用來取值的時候知道多少位 4 5 2.1 示例 6 create table t1(name char(4)); 表示四個字符,並不是顯示字符,顯示字符只有數字int是顯示寬度 7 insert into t1 values('alexsb') 存儲不下來,太長了 8 insert into t1 values('埃里克斯') 9 10 2.2 二者區別 11 create table t1(x char(5),y varchar(5)); 12 insert into t1 values('abcdef','abcddd'); 前后都會報錯,都不能超過五個 13 區別在於,char 不夠五個,用空格補全,varchar 有幾個就是幾個,但是都不能超五個 14 通過select * from t1;看不出來,需要通過內置函數來查看 15 查看字符長度,char_lenth 16 select char_length(x),char_length(y) from t1; char_length :查看字符的長度,好像還是沒有區別 17 看到可能還是3個字符,因為char的流氓性,所以需要更改下表限制 18 SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; 看到char是定義時候的長度 19 在通過select char_length(x),char_length(y) from t1;查看 20 insert into t7 values('你好啊','好你妹'); #char_length :查看字符的長度 5 3 21 insert into t7 values('你好啊','好你妹'); #length:查看字節的長度 11 9 utf8中文 一個字符等於3個字節,英文數字就是一個字符就是一個字節 22 23 2.3 空格 24 #注意兩點:如果查找條件正好滿足限定字符,也是可以查到空格的,前后都可以,但是如果超這個限制,那么只有在后面的空格可以找到 25 insert into t7 values('abc ','abc '); #空格算字符,查看字符長度就是 5 4 注意開始前提是給5個限制 26 select * from t7 where y='abc '; #去掉末尾的空格然后去比較 27 select * from t7 where y=' abc'; #前面是空格就不行了找不到 28 29 2.4 其他字符串,無非是存儲過長超過255的時候,cahr,varchar只支持255個字符,大文件存儲就沒必要存儲在數據庫里面 30 效率低,而且大,數據庫存儲名字,路徑就好了
五 日期
1 #注冊時間 2 datetime 2017-09-06 10:39:49 3 #出生年月日,開學時間 4 date:2017-09-06 5 #聊天記錄,上課時間 6 time:10:39:49 7 #出生年 8 year:2017 9 10 3.1 示例 11 create table student( 12 id int, 13 name char(5), 14 born_date date, 15 born_year year, 16 reg_time datetime, 17 class_time time 18 ); 19 插入時間 20 insert into student values(1,'alex',now(),now(),now(),now()); now當前時間 21 insert into student values(1,'alex','2017-09-06','2017','2017-09-06 10:39:00','08:30:00'); 22 23 3.2 插入時間的其他插入寫法,存儲在數據庫都是統一的格式,插入寫法不一樣而已 24 insert into student values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00'); 25 insert into student values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00'); 26 insert into student values(1,'alex','20170906',2017,'20170906103900','083000');
六 枚舉&集合
1 enum 枚舉 規定一個范圍,可有多個值,但是為該字段插入值時,只能取規定范圍中的其中一個 2 set 規定一個范圍,可有多個值,但是為該字段傳值時,能取規定范圍中的多個值 3 4 4.1 示例 5 create table student( 6 id int primary key auto_increment, 7 name char(5), 8 sex enum('male','female'), 枚舉 9 hobbies set('music','read','study','coding') set 10 ); 11 insert into student(name,sex,hobbies) values('egon','None','ddd') 12 查看的時候,就會看到不符合的都是空的,沒有找到的也是空 13 insert into student(name,sex,hobbies) values('egon','male','music,read')
七 約束條件¬ null&default
1 5.1 not null 與 default 2 3 5.2 not null 示例 4 create table student( 5 id int primary key auto_increment, 主鍵遞增 6 name char(5), 7 sex enum('male','female') not null 8 ); 9 insert into student(name,sex) values('alex',NULL) 插入成功,性別為空 10 需要限制,不能為空 11 sex enum('male','female') not null not null就是約束條件 12 insert into student(name,sex) values('alex',null) 報錯,因為不能空了 13 14 15 5.3 default 示例 16 create table student( 17 id int primary key auto_increment, 主鍵遞增 18 name char(5), 19 sex enum('male','female') , 默認值就是左邊第一個 20 age int 21 ); 22 insert into student(name) values('alex'); 查看的效果就是除了名字后面都是NULL 23 sex enum('male','female') not null; 有默認參數,默認時第一個參數,還是從左邊開始 24 sex enum('male','female') not null default 'female'; 修改默認值 25 insert into t1(name) values('alex'); 就會看到,sex這塊默認是female 26 age int not null 加上這個,不為空,默認值是0 27 age int not null default 30 不為空,默認值30
八 unique 唯一
1 6.1 示例 2 #單列唯一 3 create table teacher( 4 id int not null unique, 有值且唯一,這樣寫相當於主鍵 5 name char(10) 6 ); 7 insert into teacher values(1,'egon'); 8 insert into teacher values(1,'alex'); 9 插入報錯,因為ID是唯一 10 11 6.2 #多列唯一 12 #255.255.255.255 IP地址最大的狀態 13 create table services( 14 id int primary key auto_increment, 15 name char(10), 16 host char(15), 17 port int, 18 constraint host_port unique(host,port) 19 ); 20 constraint 約束的意思,host_port 別名 unique(host,port) 表示這2個字段加起來都是唯一的,聯合唯一 21 insert into services values('ftp','192.168.20.17',8080); 22 insert into services values('httpd','192.168.20.17',8081); 23 24 6.3 primary key 唯一 25 create table t8(x int,y int,primary key(x,y)); 26 查看顯示2個主鍵,其實是一個,是x,y和起來的主鍵 27 insert into t1 values(1,2); 28 insert into t1 valyes(1,3) 都不會報錯,除非是插入后,在插入相同的就會報錯了,x,y主鍵是合起來的
九 auto_increment_offset:偏移量
1 7.1 示例 2 create table dep( 3 id int primary key auto_increment, 4 name char(10) 5 ); 6 insert into dep(name) values('IT'),('HR'),('SALE'),('Boss'); 7 #修改默認值,從10開始記錄ID 8 create table dep1( 9 id int primary key auto_increment, 10 name char(10) 11 )auto_increment=10; 修改默認從10開始,就是ID從10開始 12 insert into dep1(name) values('IT'),('HR'),('SALE'),('Boss'); 13 14 7.2 #auto_increment_increment:步長 15 create table dep2( 16 id int primary key auto_increment, 17 name char(10) 18 ); 19 set session auto_increment_increment=2; #會話級,只對當前會話有效,退出終端就斷了 20 set global auto_increment_increment=2; #全局,對所有的會話都有效 21 insert into dep1(name) values('IT'),('HR'),('SALE'),('Boss'); 22 23 7.3 #auto_increment_offset和auto_increment_increment組合使用 24 注意:如果auto_increment_offset的偏移量值大於auto_increment_increment的步長值,則auto_increment_offset的值會被忽略 25 set session auto_increment_offset=2; 就是從2這個位置開始,第二數據就是5 26 set global auto_increment_increment=3; 27 show variables like '%auto_in%'; 查看偏移量和步長 28 29 create table dep3( 30 id int primary key auto_increment, 31 name char(10) 32 ); 33 insert into dep3(name) values('IT'),('HR'),('SALE'),('Boss');
十 foreign key 員工信息表
1 8.1 示例 部門信息 2 #先建被關聯的表,並且被關聯的字段必須唯一 3 create table dep( 4 id int primary key auto_increment, 不為空,唯一,主鍵 5 department varchar(50), 6 comment varchar(100) 7 ); 8 9 #在創建關聯的表 員工信息 10 create table emp_info( 11 id int primary key auto_increment, 12 name varchar(20), 13 dep_id int, 14 constraint(約束) fk_depid_id foreign key(dep_id) references dep(id) 讓員工關聯部門 15 on delete cascade 不需要先刪除/修改被關聯的表內容,后面沒有逗號 和上面是一行 16 on update cascade 17 ); 18 foreign key(dep_id) references dep(id) 創建關聯,dep_id自己的字段,references引用關聯,dep表的字段 19 constraint fk_depid_id 起個別名,跟unique一樣 20 21 8.2 #插入數據 22 #先給被關聯的表插入數據 23 insert into dep values 24 (1,'歐德博愛技術有限事業部','說的好'), 25 (2,'艾利克斯人力資源部','招不到人'), 26 (3,'銷售部','賣不出東西'); 27 28 #再給關聯的表插入數據 29 insert into emp_info values 30 (1,'egon',1), 31 (2,'alex1',2), 32 (3,'alex2',2), 33 (4,'alex3',2), 34 (5,'李坦克',3), 35 (6,'劉飛機',3), 36 (7,'張火箭',3), 37 (8,'林子彈',3), 38 (9,'加特林',3); 39 40 8.3 #刪除操作 41 delete update 42 delete from dep where id=2; 先刪除被關聯表 43 delete from emp_info where dap_id=2; 才能刪除關聯表 44 update user set uid=10 where uid=2; 修改關聯表,關聯表有修改,但是被關聯表沒有被修改 45 on delete cascade 46 on update cascade 47 被關聯的表刪除或是修改,關聯的表也會隨之刪除或是修改,這才合理 48 49 drop batle t1;刪除表的時候,應該先刪除被關聯表,在刪除關聯表