[TOC] 創建數據表 列約束 auto_increment 自增長1 primary key 主鍵索引,加快查詢速度,列的值不能重覆 not null 標識該欄位不能為空 default 該欄位設置預設值 查看數據表結構 列類型(欄位類型) 整型 | 類型 | 大小 | 範圍(無符號) | | | ...
[TOC]
創建數據表
語法:
create table 表名(
欄位名 列類型 [可選參數],
欄位名 列類型 [可選參數]
....
) charset=utf8;
如:
create table t4(
id int,
name char(15)
)charset=utf8;
列約束
- auto_increment 自增長1
- primary key 主鍵索引,加快查詢速度,列的值不能重覆
- not null 標識該欄位不能為空
- default 該欄位設置預設值
create table t5(
id int primary key auto_increment,
name char(15) not null default '',
)charset=utf8;
查看數據表結構
desc t5;
show create table t5;
列類型(欄位類型)
整型
類型 | 大小 | 範圍(無符號) |
---|---|---|
Tinyint | 1個位元組 | (0-255) |
Smallint | 2個位元組 | (0-65535) |
Mediumint | 3個位元組 | |
int(一般直接用int) | 4個位元組 | |
bigint | 8個位元組 |
註:unsigned 加上代表不能取負數,只適用於整型。 基本語法:在類型之後加上一個 unsigned
應用場景:根據公司業務的場景,來選取合適的類型
浮點型
- float
Float又稱之為單精度類型:系統提供4個位元組用來存儲數據,但是能表示的數據範圍比整型大的多,大概是10^38;只能保證大概7個左右的精度(如果數據在7位數以內,那麼基本是準確的,但是如果超過7位數,那麼就是不准確的)
基本語法
Float:表示不指定小數位的浮點數
Float(M,D):表示一共存儲M個有效數字,其中小數部分占D位
Float(10,2):整數部分為8位,小數部分為2位
- decimal
Decimal定點數:系統自動根據存儲的數據來分配存儲空間,每大概9個數就會分配四個位元組來進行存儲,同時小數和整數部分是分開的。
Decimal(M,D):M表示總長度,最大值不能超過65,D代表小數部分長度,最長不能超過30。
比較
mysql> create table t6(
-> id int unsigned auto_increment primary key,
-> salary decimal(16,10),
-> num float
-> )charset=utf8;
insert into t6 values(0,500023.2312345678, 5000.2374837284783274832);
mysql> select * from t6;
+----+-------------------+---------+
| id | salary | num |
+----+-------------------+---------+
| 1 | 500023.2312345678 | 5000.24 |
+----+-------------------+---------+
decimal比較精確,適合描述錢
字元串
- char(長度): 定長字元:指定長度之後,系統一定會分配指定的空間用於存儲數據,char(L),L長度為0到255
- varchar(長度):變長字元,指定長度之後,系統會根據實際存儲的數據來計算長度,分配合適的長度(數據沒有超出長度),長度理論值位0到65535
區別:
Char和varchar數據存儲對比(utf8,一個字元都會占用3個位元組)
存儲數據 | Char(2) | Varchar(2) | Char所占位元組 | Varchar所占位元組 |
---|---|---|---|---|
A | A | A | 2 * 3 = 6 | 1 * 3 + 1 = 4 |
AB | AB | AB | 2 * 3 = 6 | 2 * 3 + 1 = 7 |
char 無論插入的字元是多少個,永遠固定占規定的長度
varchar:根據插入的字元的長度來計算所占的位元組數,但是有一個位元組是用來保存字元串大小的
char的數據查詢效率比varchar高
時間日期類型
Date
日期類型:系統使用三個位元組來存儲數據,對應的格式為:YYYY-mm-dd,能表示的範圍是從1000-01-01 到9999-12-12,初始值為0000-00-00
Time
時間類型:能夠表示某個指定的時間,但是系統同樣是提供3個位元組來存儲,對應的格式為:HH:ii:ss,但是mysql中的time類型能夠表示時間範圍要大的多,能表示從-838:59:59~838:59:59,在mysql中具體的用處是用來描述時間段。
Datetime
日期時間類型:就是將前面的date和time合併起來,表示的時間,使用8個位元組存儲數據,格式為YYYY-mm-dd HH:ii:ss,能表示的區間1000-01-01 00:00:00 到9999-12-12 23:59:59,其可以為0值:0000-00-00 00:00:00
Timestamp
時間戳類型:mysql中的時間戳只是表示從格林威治時間開始,但是其格式依然是:YYYY-mm-dd HH:ii:ss
Year
年類型:占用一個位元組來保存,能表示19002155年,但是year有兩種數據插入方式:099和四位數的具體年
mysql> create table t7(
-> d date,
-> t time,
-> dt datetime
-> );
mysql> insert into t7 values(now(),now(),now());
mysql> select * from t7;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2019-10-29 | 15:37:02 | 2019-10-29 15:37:02 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
枚舉enum
就是列舉出所有的選項
mysql> create table t8(
-> id int unsigned auto_increment primary key,
-> name char(15) not null,
-> age int, ,
-> gender enum('男','女')
-> )charset=utf8;
insert into t8 values(0,'老張',36,1);
mysql> select * from t8;
+----+------+------+--------+
| id | name | age | gender |
+----+------+------+--------+
| 1 | 老張 | 36 | 男 |
+----+------+------+--------+
修改表名
alter table t8 rename info;
rename table t7 to t777;
增加欄位
語法: alter table 表名 add 欄位名 列類型 [可選參數]
alter table t6 add name char(25) not null default '';
預設是添加在最後一列的
--添加在第一列
alter table t6 add name char(25) not null default '' first;
--添加在指定列
alter table t6 add name char(25) not null default '' after id;
刪除欄位
語法:alter table 表名 drop 欄位名
alter table t9 drop name;
修改欄位
修改列類型
語法:alter table 表名 modify 欄位名 列類型 [約束條件]
alter table t9 modify name1 char(20);
修改欄位名:
語法:alter table 表名 change 舊欄位名 新欄位名 新的列類型 [約束條件]
alter table t6 change sex gender enum('male', 'female')
刪除表
drop table 表名;
複製表結構
create table t99 like t7;