go#1 MySQL 數(shù)據(jù)類型
1.1 MySQL數(shù)據(jù)類型
- 整型
整型類型(顯示寬度)
int(8)
從上面的顯示我們看到,設(shè)置了寬度為8,并且zerofill了,這樣在查詢的時候,會在前面自動補(bǔ)0播揪。寬度可以不設(shè)置氛堕,因?yàn)檎麛?shù)數(shù)據(jù)類型都有默認(rèn)的顯示寬度,不設(shè)就采用默認(rèn)的.
另外彻况,即使設(shè)置了顯示寬度,也能賦超過顯示寬度的值舅踪,整型的顯示寬度僅僅用于顯示補(bǔ)0纽甘。
- 浮點(diǎn)型與定點(diǎn)型
數(shù)據(jù)類型(M,D)
M:精度,數(shù)據(jù)的總長度
D:標(biāo)度抽碌,小數(shù)點(diǎn)后的長度
這種類型MySQL里有3種如:Float(6,2)悍赢、Double(6,2)、Decimal(6,2);
當(dāng)不指定精度時左权,F(xiàn)loat皮胡、Double默認(rèn)會保存實(shí)際精度,而Decimal默認(rèn)是整數(shù)涮总;
當(dāng)標(biāo)度不夠時胸囱,都會四舍五入,但Decimal會警告信息瀑梗。
- 日期與時間類型
DATE類型前面可以加個D烹笔,D表示天即24小時,如往DATE類型插入 '2 15:20:20'抛丽;
另外TimeStamp類型與DateTime在無輸入的情況下要注意下:
TimeStamp使用Current_TimeStamp()而DateTime使用NOW(來獲取當(dāng)前時間)谤职;
輸入NULL時,系統(tǒng)會輸入系統(tǒng)當(dāng)前日期與時間亿鲜;
無任何輸入時允蜈,系統(tǒng)會輸入系統(tǒng)當(dāng)前日期與時間;
類型 | 字節(jié)數(shù) | 取值范圍 | 零值 |
---|---|---|---|
YEAR | 1 | 1901~2155 | 0000 |
DATE | 4 | 1000-01-01~9999-12-31 | 0000:00:00 |
TIME | 3 | -838:59:59~838:59:59 | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 1970-01-01 08:00:01~2038-01-19 11:14:07 | 00000000000000 |
- 字符串類型
在MySQL中蒿柳,字符串類型包括CHAR饶套、VARCHAR、BLOB垒探、TEXT妓蛮、ENUM、SET圾叼。
CHAR與VARCHAR
字符串類型(M)
這個M是長度的意思蛤克,插入該列的字符串長度將不允許超過M所指定的長度。另外夷蚊,由于MySQL在建庫時就指定了字符集构挤,因此就不存在nchar、nvarchar惕鼓、ntext這種數(shù)據(jù)類型了筋现。
char最長可取255;
varchar最長可取65535呜笑;
TEXT
類型 | 允許的長度 | 存儲空間 |
---|---|---|
TINYTEXT | 0~255字節(jié) | 值的長度+2字節(jié) |
TEXT | 0~65535字節(jié) | 值的長度+2字節(jié) |
MEDIUMTEXT | 0~167772150字節(jié) | 值的長度+3字節(jié) |
LONGTEXT | 0~4294967295字節(jié) | 值的長度+4字節(jié) |
ENUM類型
屬性名 ENUM('值1','值2','值3'...'值n')
ENUM有NOT NULL屬性夫否,其默認(rèn)值為取值列表的第一個元素;
ENUM無NOT NULL叫胁,則ENUM類型將允許插入NULL,并且NULL為默認(rèn)值汞幢;
SET類型
屬性名 SET('值1','值2','值3'...,'值n')
它與ENUM的區(qū)別在什么地方呢驼鹅?
基本上就是多選的ENUM。
二進(jìn)制類型
二進(jìn)制類型是在數(shù)據(jù)庫中存儲二進(jìn)制數(shù)據(jù)的數(shù)據(jù)類型。二進(jìn)制類型包括BINARY输钩、VARBINARY豺型、BIT、TINYBLOB买乃、BLOB姻氨、MEDIUMBLOB、LONGBLOB剪验。
|類型 |取值范圍
|-|
|BINARY(M) |字節(jié)數(shù)為M肴焊,允許長度為0~M的定長二進(jìn)制字符串
|VARBINARY(M) |允許長度為0~M的變長二進(jìn)制字符串,字節(jié)數(shù)為值的長度加1
|BIT(M) |M位二進(jìn)制數(shù)據(jù)功戚,M最大值為64
|TINYBLOB |可變長二進(jìn)制數(shù)據(jù)娶眷,最多255個字節(jié)
|BLOB |可變長二進(jìn)制數(shù)據(jù),最多2的16次方-1個字節(jié)
|MEDIUMBLOB |可變長二進(jìn)制數(shù)據(jù)啸臀,最多2的24次方-1個字節(jié)
|LONGBLOB |可變長二進(jìn)制數(shù)據(jù)届宠,最多2的32次方-1個字節(jié)
數(shù)據(jù)類型的選擇
1.整型:根據(jù)要顯示的最大值決定;
2.浮點(diǎn)型:要顯示小數(shù)乘粒。如果要精確到小數(shù)點(diǎn)后10位豌注,就選擇DOUBLE,而不應(yīng)該選擇FLOAT灯萍。DECIMAL精度較高轧铁,浮點(diǎn)數(shù)會出現(xiàn)誤差,如果精度較高竟稳,則應(yīng)選擇定點(diǎn)數(shù)DECIMAL属桦;
3.字符串型:定長與變長的區(qū)別,CHAR類型占用空間比較大他爸,但是處理速度比VARCHAR快聂宾,如果長度變化不大,如身份證號碼那種诊笤,最好選擇CHAR類型耘纱。而對于評論字符串,最好選擇VARCHAR终抽;
4.時間:根據(jù)需要顯示的類型咯易猫,特別是TIMESTAMP,如果需要顯示的時間與時區(qū)對應(yīng),就應(yīng)該選擇TIMESTAMP晾匠;
5.ENUM類型和SET類型:長度不同茶袒,ENUM類型最多可以由65535個成員,而SET類型最多只能包含64個成員凉馆。且ENUM只能單選薪寓,而SET類型可以多選亡资;
6.TEXT類型和BLOB類型:TEXT只能存儲字符數(shù)據(jù),而BLOB可以存儲二進(jìn)制數(shù)據(jù)向叉。如果是純文本锥腻,適合TEXT。如果是圖片等適合存二進(jìn)制母谎;
1.2 創(chuàng)建數(shù)據(jù)表
create table 表名(id int , name varchar(20));
1.3 為列添加約束
- 添加主鍵約束
//創(chuàng)建用戶表
create table users(id int primary key, name varchar(20),sex set('男','女','未知'));
- 添加外鍵約束
//創(chuàng)建分?jǐn)?shù)表
create table scores( user_id int references users(id), game_id int references games(id), score int default 0 );
- 添加檢查約束
create table test(id int not null, no int check(no in (0,1)));
注意:不再起作用瘦黑,雖然不報錯
- 添加默認(rèn)約束
//創(chuàng)建分?jǐn)?shù)表
create table scores( user_id int references users(id), game_id int references games(id), score int default 0 );
- 添加自增列
//創(chuàng)建游戲表
create table games(id int auto_increment key,game_name varchar(10));
2 MySQL 查看數(shù)據(jù)表
2.1 查看數(shù)據(jù)表
//查看表的基礎(chǔ)結(jié)構(gòu)
desc users;
//查看表的詳細(xì)結(jié)構(gòu)
show create table users;
2.2 修改數(shù)據(jù)表
//修改表名
alter table users rename to user;
//修改字段名
alter table users change id user_id int;
//修改字段類型
alter table users modify id int;
//添加字段
alter table users add nickname varchar(11);
//刪除字段
alter table users drop nickname;
//添加主鍵約束
alter table test add constraint pr primary key (id);
//添加外鍵約束
alter table test1 add constraint cc foreign key (id) references test(id);
//添加檢查約束
alter table test alter id set default 1;
//添加自增列
alter table test modify column id auto_increment;
//解除約束
alter table test1 drop foreign key cc;
2.3 刪除數(shù)據(jù)表
//刪除表
drop table test;
3 MySQL 插入數(shù)據(jù)
3.1 插入數(shù)據(jù)
//插入數(shù)據(jù)
insert games values(1,'三國殺');
//列值對應(yīng)
insert games (id,game_name) values(2,'中國象棋');
//插入多條數(shù)據(jù)
insert games (id,game_name) values(3,'保衛(wèi)蘿卜'),(4,'三國戰(zhàn)紀(jì)');
3.2 修改數(shù)據(jù)
update games set game_name = '三國' where id = 1;
3.3 刪除數(shù)據(jù)
//刪除單條數(shù)據(jù)
delete from games where id = 4;
//清空表
truncate table test;
4 MySQL 查詢基礎(chǔ)
4.1 查詢基礎(chǔ)
//查看所有信息
select * from users;
//查看單個列
select name from users;
//起別名
select name'用戶名' from users;
4.2 簡單查詢
//如果有空值不統(tǒng)計
select count(id) from games;
//空值也統(tǒng)計進(jìn)去
select count(*) from games;
//求和
select sum(id) from games ;
//求平均值
select avg(id) from games ;
//求最大值
select max(id) from games ;
//求最小值
select min(id) from games ;
//多值
select count(*)'人數(shù)', max(scores)'最高分',sum(scores)'總分',avg(scores)'平均分' from scores where user_qq = 1;
4.3 條件查詢
//一個條件
select * from scores where user_qq = 1
//多個條件
select * from scores where user_qq = 1 and user_name = '老李';
4.4 對查詢結(jié)果排序
//降序排列
select * from scores where user_qq = 1 ORDER BY scores desc;
//升序排列
select * from scores where user_qq = 1 ORDER BY scores asc;
//多列排序,先寫的列優(yōu)先級高
select * from scores where user_qq = 1 ORDER BY gno asc, scores DESC;
5 MySQL 匯總和分組數(shù)據(jù)
5.1 匯總和分組數(shù)據(jù)
//分組
select user_id,COUNT(*) from scores GROUP BY user_id;
//加條件
select user_id,COUNT(*) from scores GROUP BY user_id HAVING COUNT(*)>3;
//分組+排序
select user_id,COUNT(*) from scores GROUP BY user_id order by count(*) asc;
5.2 連接查詢
//隱式內(nèi)連接
select * from users,scores ,games where users.id = scores.user_id and scores.game_id = games.id;
//顯示內(nèi)連接
select * from users JOIN scores on users.id = scores.user_id;
//左外連接
select * from users LEFT JOIN scores on users.id = scores.user_id;
//右外連接
select * from users right JOIN scores on users.id = scores.user_id;
兩張表地位不平等奇唤,其中有一張是基礎(chǔ)表
基礎(chǔ)表每條數(shù)據(jù)必須出現(xiàn),沒有的值補(bǔ)null
5.3 子查詢
select * from users where id in (SELECT user_id from scores);
5.4 聯(lián)合查詢
select * from users UNION select * from scores