MySQL常用数据类型
创建表时需要指定表中的字段,字段需要指定数据类型
create table demo (
name varchar(12) PRIMARY key, # varchar 类型,长度 12
)
unsigned
:无符号类型,不分正负
默认为有符号数据类型;例
# 有符号int类型
create table db_1(id int(1))
# 无符号int类型
create table db_2(id int(1) unsigned)
类型 | 数值类型 | 说明 |
---|---|---|
数值类型 | bit(M) | 位类型;M 指定位数,范围:1 ~ 64,默认为 1 |
整数类型 | tinyint[unsigned](1字节) | 带符号位范围-128 ~ 127,无符号 0~255,默认有符号 |
smallint[unsigned](2字节) | 带符号位范围 - 2^15~ 2^15 - 1,无符号 0 ~ 2^16 -1,默认有符号 | |
mediumint[unsigned](3字节) | 带符号位范围 - 2^23~ 2^23 - 1,无符号 0 ~ 2^24 -1,默认有符号 | |
int[unsigned](4字节) | 整型;带符号位范围 - 2^31~ 2^31 - 1,无符号 0 ~ 2^32 -1,默认有符号 | |
bigint[unsigned](8字节) | 长整型;带符号位范围 - 2^63~ 2^63 - 1,无符号 0 ~ 2^64 -1,默认有符号 | |
小数类型 | float[unsigned] | 4个字节,单精度 |
double[unsigned] | 比float精度更大的小数,双精度,8字节 | |
decimal(M, D) [unsigned] | 定点数:M 指定长度,D表示小数点位数 | |
字符串 | char(size):char(20) | 固定长度字符串,0 ~ 255 |
字符串 | varchar(size):varchar(20) | 可变长字符串,0 ~ 2^16-1 |
文本 | tinytext | 短文本类型,0 ~ 2^8 - 1(256B) |
text | 文本类型,0 ~ 2^16 - 1(64K) | |
mediumtext | 中等文本类型,0 ~ 2^24 - 1(16M) | |
longtext | 长文本类型,0 ~ 2^32 - 1(4G) | |
clob | 字符大对象,存储较大文本 | |
二进制 | blob | 二进制大对象;0 ~ 2^16-1;存储图片、视频等流媒体信息 |
longblob | 0 ~ 2^32 -1 | |
时间日期 | data | 日期类型(YYYY-MM-DD ),3字节 |
year | 年,1字节 | |
time | 时间类型(HH:mm:ss ),3字节 | |
datetime | 日期时间类型(YYYY-MM-DD HH:mm:ss ),8字节 | |
TimeStamp | 时间戳,自动记录insert、update操作的时间;4字节 |
bit
字段显示的时候按照位的方式,即二进制
M:指定位数,默认为 1,范围 1 ~ 64
create table db_1(num bit(8))
-- 表示 bit 类型 8 位,即一个字节,范围 0 ~ 255
不常使用
float
:单精度double
:双精度decimal[M, D] [unsigned]
M
:总位数,D
:小数点后位数
char(size)
: 0 ~ 255 字符
char
占用空间是固定的
varachar(size)
size
:指定字符数
text
:存放文本时使用,可视为 varchar
,但不能有默认值
mediumtext
: 0 ~ 2^24 - 1longtext
0 ~ 2^32 - 1CLOB:文本大对象
BLOB:字符大对象
很少使用
date
、datetime
、timestamp
create table `time`(
a date, # 年月日
b DATETIME, # 年月日 时分秒
c timestamp # 时间戳
not null # 不允许为空
default current_timestamp # 默认当前时间
on update current_timestamp # 更新该行数据时自动更新为当前时间
)
insert into time(a,b) values('2021-10-01','2022-10-07 15:30:30') # 不指定时间戳默认为当前时间
-- 表中数据:
# 2021-10-01 -- date
# 2022-10-07 15:30:30 -- datetime
# 2021-11-26 16:00:56 -- timestamp,默认为操作时间
格式:create table table_name (字段名 数据类型)
字段名 和 数据类型 必须定义,其他可默认
CREATE TABLE `table_name` (
`empno` mediumint(8) unsigned NOT NULL DEFAULT '0' comment '员工编号',
`ename` varchar(20) NOT NULL DEFAULT '',
`mgr` mediumint(8) unsigned DEFAULT NULL,
`hiredate` date NOT NULL,
`comm` decimal(7,2) DEFAULT 0.00,
`deptno` mediumint(8) unsigned NOT NULL DEFAULT '0'
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; # 存储引擎类型 InnoDB,默认字符集 utf8mp4
-- 将查询结果创建为表
create table `table_name` as select ... ;
_
连接,
隔开;最后一句不加comment
:字段注释mediumint(8)
:数据类型,长度最大 8 位unsigned
:数值类型无符号,无正负default
:默认值,不添加数据时默认使用not unll
:非空约束,该字段不允许为空engine
:存储引擎,决定表的格式charset
:字符集not null
:不允许为空primary key
:主键,不允许为空,不允许重复unique
:唯一约束,不允许重复primary key
foreign key
unique
-- 主键约束,唯一且不为空;指定在字段后
字段名 字段类型 primary key
-- 复合主键;定义在所有字段之后(也可指定单列主键)
create table tab1(
id int,
`name` varchar(10),
primary key(id,`name`) -- id 、 name 设为复合主键, 两列都不为空且不能同时相同
)
innodb
才支持外键主从表外键关联字段 操作顺序要求
create table tab1(
id int primary key, -- 主表中定义主键
`name` varchar(10) not null default '' -- 不允许为空,默认值为''
)
# 外键约束
create table tab2(
id int,
`name` varchar(10),
class_id int,
foreign key(class_id) references tab1(id) -- class_id 字段外键连接 ab1 表中的 id 字段
)
/*
外键约束成功后,添加在class_id字段的数据必须在id字段中存在,或者添加 null
若id字段中有记录在class_id字段使用,必须取消外键或删除class_id中相关记录才能删除该记录
*/
唯一性约束,不允许重复
null
null
null
不被当作具体值字段指定 unique not null
约束则效果类似于主键约束
同张表可以有多个 unique
约束
可以将字段联合约束
-- 唯一约束,不允许重复,没有非空约束时可以为null
字段名 字段类型 unique
-- 联合约束
create table demo(
name varchar(12),
age int,
unique (name, age) -- 不允许 name age 字段同时相同
)
非空约束,该字段不允许为 null
用于强制行数据必须满足的条件
列名 数据类型 check(check条件)
-- 示例 check
create table tab(
id int primary key, -- 主键约束
`name` varchar(32) not null, -- 该字段不允许为空
sex char(3) check(sex in ('男',"女")), -- 检查性别只能为 男 或 女
salary double check(salary > 2000) -- 检查工资必须大于2000
)
字段名 整型 primary key auto increment -- 基本语法
-- 示例自增长
create table tab(
-- 主键约束,自增长
id int primary key auto_increment,
-- 该字段不允许为空
`name` varchar(32) not null,
)
-- 插入数据 null 或 不给数据 则按上条记录值自增长 + 1
-- 插入 id = 1
insert into tab values(null,'张三');
-- 插入 id = 5
insert into tab values(5,'张三');
-- 插入 id = 6
insert into tab values(null,'张三')
-- 修改自增长默认值从100开始
alter table tab auto_increment = 100
-- 查看 表结构(表中所有的列及数据类型等)
desc tablename;
-- 显示建表语句
show create table `table_name`;
drop table table_name;
alter table
语句:修改表结构
修改表结构常用的语法格式:ALTER TABLE <表名> [修改选项]
add
,
分隔rename
:修改表名change
:修改字段名
modify
:修改字段类型、约束,
分隔drop
,
分隔# 添加字段
-- 指定位置添加字段:first-首位,after-指定字段后
-- 单个字段
alter table demo
add `info` varchar(50) not null default '' after `age`;
-- 多个字段
alter table demo
add `info` varchar(50) not null after age,
add `hobby` varchar(12) default '' first
-- 多个字段,追加在最后;不可添加约束,不能指定位置
alter table demo add(`hobby` varchar(1), `info` varchar(50));
# 修改字段数据类型或大小、约束条件
alter table demo
modify`hobby` char(6),
modify`info` varchar(20);
# 修改字段名
alter table tablename
change `info` `infomation` varchar(32)
not null default '';
# 修改表名为 newTableName
alter table tablename Rename table tableName to newTableName
# 删除字段 info、hobby
alter table demo drop `info`, drop `hobby`;
# 修改表的字符集
alter table tablename character set 字符集;
insert into ... values( ... )
insert into 表名(字段, ...) values (数据, ...);
insert into 表名 (全部字段) values(数据);
insert into 表名 values(数据);
inset into 表名 values(), () .... ;
-- 根据指定字段添加数据
insert into `table_name`(`col1`, `col2`) values ('data1', 'data2');
-- 全部字段添加数据
insert into `table_name` values();
delete
delete from ... where ...
where
语句表示删除表中所有数据truncate
(慎重使用)
truncate table table_name
-- delete:删除数据
delete from `table_name` where 限定条件
-- 删除名字为张三的人的所有记录
delete from `user` where name = '张三'
update ... set ... where ...
set
:指定要修改的字段值set 字段名 = 数据, 字段名 = 数据 ... where ...
where
字句修改全部记录-- update:修改数据
update `table_name` set 修改内容 where 限定条件;
-- 将名字为 张三 的人薪水改为50,名字改为 李四
update `user` set salary = 50, name = '李四' where name = '张三'
-- 将 emp 表的结构复制给表 emp1,不含数据
create table emp1 like emp
-- 将从 emp 表查询的结果插入表 emp1:两张表结构必须相同,否则无法插入数据
insert into emp1 select * from emp
-- 查询表自身的所有记录并添加到表自身
insert into `table_name` select * from `table_name`
distinct
去重后的数据
-- 将查询结果创建为一张表
create table newEmp [as] select * from emp;
-- 创建表使用约束不允许字段数据重复
create table demo (
name varchar(12) primary key, # 主键约束,不允许重复、不允许为空
age int unique, # 唯一约束,不允许重复
sex char(1) not null default '男' # 非空约束,不允许为空;默认为 男
)