数字类型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 旧表名;