數字類型mysql
1. 實際使用中,對於整數類型,通常使用 int
就足夠了。sql
2. 整數類型後面能夠加上 unsigned
例如 int unsigned
表示只取正整數。數據庫
3. 當須要存很是精確的小數時,推薦使用 decimal
類型,由於當 float
存的小數位過長時,會自動進行四捨五入。ide
整數類型編碼
tinyintcode
用途:小整數值 大小:1個字節 範圍(有符號):(-128,127) 範圍(無符號):(0,255)
smallint索引
用途:大整數值 大小:2個字節 範圍(有符號):(-32768,32767) 範圍(無符號):(0,65535)
mediumintutf-8
用途:大整數值 大小:3個字節 範圍(有符號):(-8388608,8388607) 範圍(無符號):(0,16777215)
intci
用途:大整數值 大小:4個字節 範圍(有符號):(-2147483648,2147483647) 範圍(無符號):(0,4294967295)
bigintrem
用途:極大整數值 大小:8個字節 範圍(有符號):(-9233372036854775808,9233372036854775807) 範圍(無符號):(0,18446744073709551615)
浮點型
float
用途:單精度浮點數值 大小:4個字節 範圍(有符號):(-3.402823466E+38,-1.175494351E-38),0,(1.175494351E-38,3.402823466E+38) 範圍(無符號):0,(1.175494351E-38,3.402823466E+38)
double
用途:雙精度浮點數值 大小:8個字節 範圍(有符號):(-1.7976931348623157E+308,-2.2250738585072014E-308),0,(2.2250738585072014E-308,1.7976931348623157E+308) 範圍(無符號):0,(2.2250738585072014E-308,1.7976931348623157E+308)
decimal
用途:小數值 大小:當decimal(m,d)中,m>d,大小爲m+2,不然大小爲d+2 範圍(有符號):取決於m和d的值 範圍(無符號):取決於m和d的值
字符串類型
若是不能肯定字符串的長度是多少,通常建議使用 varchar(255)
。
char(數值)
不管插入的字符串長度是多少,永遠固定的佔用設置的長度。
用途:存儲字符串 字符長度範圍:0-255(一箇中文是一個字符,是utf8編碼的3個字節) 存儲特色:定長、浪費空間、存取速度快 ***存儲時會向右填充空格來補全設置的長度 例如:char(5) 當存小於5的字符串時,自動在字符串右邊填充空格使其長度變爲5,查詢時會自動移除填充的空格
varchar(數值)
根據插入的字符串長度,縮減所佔用的空間,可是會多佔用一個字節用來保存字符串的大小。
用途:存儲字符串 字符長度範圍:0-65535(若是大於21845會提示用其餘類型,mysql行最大限制爲65535字節,字符編碼爲utf-8) 存儲特色:變長、精準、節省空間,存取速度慢 ***存儲時輸入的真實數據內容,輸入什麼存什麼 存儲時,會在真實數據前加1-2bytes的前綴,用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用) 若是真實的數據<255bytes則須要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字爲255) 若是真實的數據>255bytes則須要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字爲65535) *** 當存儲的數據超過設定的長度時,mysql默認會將數據按照最大長度截取存儲,而後給出一個 warning ,
時間日期類型
1. 實際使用通常選擇 datetime
類型。
2. 單獨插入時間時,須要以字符串的形式,按照對應的格式插入。
3. 插入年份時,儘可能使用4位值。
** 4. datetime
和 timestamp
的區別:
datetime 的日期範圍是1001——9999年,timestamp 的日期範圍是1970——2038年; datetime 的存儲與時區無關,timestamp 的存儲與時區有關,顯示的值也依賴於時區; datetime 使用8字節的存儲空間,timestamp 的存儲空間爲4字節,所以,timestamp 比 datetime 的空間利用率更高; datetime 的默認值爲(null),timestamp 的字段默認不爲空(not null),默認值爲當前時間(current_timestamp)。
year
用途:記錄年份 範圍:YYYY(1901,2155)
date
用途:記錄年月日 範圍:YYYY-MM-DD(1000-01-01,9999-12-31)
time
用途:記錄時分秒 範圍:HH:MM:SS('-838:59:59','838:59:59')
datetime
用途:記錄年月日時分秒 範圍:YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)
timestamp
用途:記錄年月日時分秒 範圍:YYYY-MM-DD HH:MM:SS(1970-01-01 00:00:00/2037 年某時)
枚舉類型
enum
用途:在給定的範圍內選擇一個值,例如 enum('值1','值2','值3') *** 若是插入的數據不在給定的範圍內,會報錯
集合類型
set
用途:在給定的範圍可選擇多個值,例如 enum('值1','值2','值3') 例如:插入('值1,值2') /('值2,值3') /('值1,值3') /('值1,值2,值3') 當插入的數據不在給定的範圍內,會給出警告,而且不在範圍內的值不會被插入 例如:插入('值1,值2,值3,值4') # 只會保存 值1,值2,值3
not null
做用:標識該字段不能爲空,若是沒有給該字段插入數據,則報錯
default
做用:給字段設定默認值,若是該字段沒有插入數據則會自動填入設置的默認值
primary key
做用:用來惟一的約束該字段裏面的數據,不能重複,不能爲空,一張表中最多隻能有一個主鍵;主鍵所在的列一般是整數類型。 當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操做,獲得一個新的不一樣值,一般和主鍵搭配使用,做爲邏輯主鍵
auto_increment
1. 自增加字段必須是整數;
2. 一張表最多隻能有一個自增加。
做用:標識該字段的值自動增加(整數類型,並且爲主鍵)
foreign key
做用:當定義外鍵後,要求外鍵列數據必須在主表的主鍵列存在或爲null
unique key
做用:標識該字段的值是惟一的,若是該字段插入的數據已存在,則會報錯
unsigned
做用:標識整數類型爲無符號類型,即不爲負數
zerofill
做用:通常跟在整數類型以後,當輸入的整數不足設置的長度時,在數據的左側用0填充到設定的長度
create table 表名( 字段名1 列類型 [(寬度) 約束條件], # 寫完一個字段必須加逗號 字段名2 列類型 [(寬度) 約束條件], 字段名3 列類型 [(寬度) 約束條件], ... ... 字段名n 列類型 [(寬度) 約束條件] # 最後一個字段不能加逗號 ) charset utf8 ; # 最後以分號結尾
實例:
有一個商店shop的數據,記錄客戶及購物狀況,有如下三個表組成: 商品goods(商品編號goods_id,商品名goods_name, 單價unitprice, 商品類別category, 供應商provider) 客戶customer(客戶號customer_id,姓名name,住址address,郵箱email,性別sex,身份證card_id) 購買purchase(購買訂單號order_id,客戶號customer_ id,商品號goods_ id,購買數量nums) 要求: 每一個表的主外鍵 客戶的姓名不能爲空值 郵箱不能重複 客戶的性別(男,女)
# 建立 shop 數據庫,字符編碼爲utf8 mysql> create database shop charset utf8; Query OK, 1 row affected (0.01 sec) # 進入 shop 數據庫 mysql> use shop; Database changed # 建立 goods 數據表 mysql> create table goods( -> goods_id int unsigned auto_increment primary key, -> goods_name varchar(32) not null default '', -> unitprice decimal(5,2) not null default 0, -> category varchar(32) not null default '', -> provider varchar(32) not null default '' -> )charset utf8; Query OK, 0 rows affected (0.03 sec) # 建立 customer 數據表 mysql> create table customer( -> customer_id int unsigned auto_increment primary key, -> address varchar(256) not null default '', -> email varchar(32) unique key not null default '', -> gender enum('男','女') not null, -> card_id char(18) unique key not null default '' -> )charset utf8; Query OK, 0 rows affected (0.03 sec) # 建立 purchase 數據表 mysql> create table purchase( -> order_id int unsigned auto_increment primary key, -> customer_id int unsigned, -> goods_id int unsigned, -> nums int default 0, -> foreign key (customer_id) references customer(customer_id), -> foreign key (goods_id) references goods(goods_id) -> )charset utf8; Query OK, 0 rows affected (0.02 sec) # 查看當前數據庫下的數據表 mysql> show tables; +----------------+ | Tables_in_shop | +----------------+ | customer | | goods | | purchase | +----------------+ 3 rows in set (0.00 sec)
修改表名
alter table 表名 rename 新表名;
增長字段
直接增長字段(位置始終在最後)
# 增長一條 alter table 表名 add 字段名 列類型 [(寬度) 約束條件]; # 增長多條 alter table 表名 add 字段名1 列類型 [(寬度) 約束條件], add 字段名2 列類型 [(寬度) 約束條件], ...... add 字段名n 列類型 [(寬度) 約束條件];
指定位置增長字段
# 新增字段爲表的第一個字段 alter table 表名 add 字段名 列類型 [(寬度) 約束條件] first; # 新增字段到特定字段以後 alter table 表名 add 字段名 列類型 [(寬度) 約束條件] after 已存在的字段名;
修改字段
# modify alter table 表名 modify 原字段名 新列類型 [(寬度) 約束條件]; # change alter table 表名 change 原字段名 新字段名 新列類型 [(寬度) 約束條件];
刪除表
drop table 表名;
刪除字段
alter table 表名 drop 字段名;
查看數據庫下的表
mysql> show tables; +----------------+ | Tables_in_shop | +----------------+ | customer | | goods | | purchase | +----------------+ 3 rows in set (0.00 sec)
查看錶信息
# 1.查看錶建立信息 mysql> show create table goods\G *************************** 1. row *************************** Table: goods Create Table: CREATE TABLE `goods` ( `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `goods_name` varchar(32) NOT NULL DEFAULT '', `unitprice` decimal(5,2) NOT NULL DEFAULT '0.00', `category` varchar(32) NOT NULL DEFAULT '', `provider` varchar(32) NOT NULL DEFAULT '', PRIMARY KEY (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) # 2. 查看錶建立信息 mysql> show create table goods; +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | goods | CREATE TABLE `goods` ( `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `goods_name` varchar(32) NOT NULL DEFAULT '', `unitprice` decimal(5,2) NOT NULL DEFAULT '0.00', `category` varchar(32) NOT NULL DEFAULT '', `provider` varchar(32) NOT NULL DEFAULT '', PRIMARY KEY (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
複製表結構+數據
# 複製時,不會複製 key(主鍵,外鍵,索引) create table 新表名 select * from 舊錶名;
複製表結構
# 1. create table 新表名 select * from 舊錶名 where 1=2; # (能夠任意設置設置一個不成立的條件) # 2. create table 新表名 like 舊錶名;