跳转至

2. 数据类型

类型

  1. 数值类型
  2. 字符类型
  3. 枚举类型
  4. 日期时间类型

数值类型

int

整形 int(4个字节)
取值范围: 0~(2**32 -1) 42亿多

tinyint

微小整型(1个字节)
1. 有符号(signed默认): -128~+127
2. 无符号 (unsigned): 0~255
示例: age tinyint unsigned # 只能为正数

smallint

小整形 (2字节)

bigint

极大整形(8个字节)

float

(4个字节, 最多显示7个有效位)
字段名 float(m, n) m (最大为7)→ 总位数 n → 小数位数
示例: float(5, 2) 取值范围:(-999.99 ~ +999.99)

double

字段名 double(m, n) (占8个字节)

decimal(m, n)

  1. 存储空间(整数部分、小数部分分开存储)
    规则: 将9的倍数封装为4个字节

    余数 字节
    0 0
    1-2 1
    3-4 2
    5-6 3
    7-8 4

    示例

    decimal(19, 9)  
    整数部分: 10/9=1余1   4个字节+1字节 =  5  
    小数部分: 9/9=1余0    4个字节+0字节 = 4  
    总共: 9个字节  
    

练习与答案

  1. 新建库studb2, 并在库中创建表stuinfo, 要求
    id: 大整型
    name: 字符类型,宽度为15
    age: 微小整型, 不能为负数
    height: 浮点型,小数位为2位(float)
    money: 浮点型,小数位为4位(decimal)
  2. 查看表结构
  3. 查看表字符集和存储引擎
  4. 在表中插入1条完整记录
  5. 查询所有记录
  6. 在表中id\name\money三个字段插入2条记录
  7. 查询所有学生的编号、姓名、money

create table stuinfo(id bigint, name char(15), age tinyint unsigned, height float(5, 2), money decimal(10, 4));

desc stuinfo;

show create table stuinfo;

select * from stuinfo;

字符类型

char

定长 char(宽度)宽度取值范围(1-255)

varchar

变长 varchar(宽度) 宽度取值范围(1-65535)

char 和 varchar 的特点
1. char 浪费存储空间, 性能高
2. varchar 节省存储空间,相对性能低

text / longtext

(4G以内打可以一次性存入)

blob / longblob

字符类型的宽度和数值类型的宽度的区别

  1. 数值类型的宽度为显示宽度, 只用于select查询时显示,和占用存储无关,可用zerofill查看效果
  2. 字符类型的宽度超过后无法存储

枚举类型

  1. 单选enum 字段名 enum(值1, 值2, ...)
  2. 多选set 字段名 set(值1, 值2, ...)

插入记录时
多选
'study, python, mysql'

日期时间类型

  1. date: "YYYY-MM-DD"
  2. datetime: "YYYY-MM-DD HH:MM:SS"
  3. timestamp: "YYYY-MM-DD HH:MM:SS"
  4. time: "HH:MM:SS"

注意:
datetime 和 timestamp的区别
datetime:不给值默认返回NULL
timestamp: 不给值默认返回系统的当前时间

示例:
1. 创建一张表, 用户充值表

create table t2(  
    id int,  
    username varchar(20),  
    password varchar(20),  
    money int,  
    brithday date,  
    cztime timestamp  
);
2. 插入记录
insert into t2 values(1, '用户1', '123456', 500, '1995-05-20', '2018-08-30 9:40:30');  
insert into t2 values(2, '用户2', '123456', 600, '1992-02-20', now());  
insert into t2 values(3, '用户3', '123456', 800, '1990-03-03', date(now()));  
insert into t2 values(4, '用户4', '123456', 1000, '1994-4-1', '1999-9-9 0:0:0');  

日期时间函数

  1. now() 返回服务器当前的时间
  2. curdate() 返回当前的日期
  3. curtime() 返回当前的时间

  4. date('1999-09-09 09:09:09')
    从一个现有的日期时间里提取日期 → 返回 '1999-09-09'
    select date('1999-09-09 09:09:09');

  5. time('1999-09-09 09:09:09')
    从一个现有的日期时间里提取时间 → 返回 '09:09:09'
    select time('1999-09-09 09:09:09');

  6. year('1999-09-09 09:09:09')
    从一个现有的日期时间里提取年份 → 返回 '1999'
    select year(now());

  7. 练习

    1. 查找2018年8月30日用户充值的详细信息  
       select * from t2 where date(cztime) = '2018-08-30';  
    
    2. 查找2018年8月份所有用户的充值信息  
       select * from t2 where year(cztime) = '2018' and month(cztime) = '08';  
    
    3. 查找2018年08月30日 08:00 - 10:00 之间用户充值信息  
        报错:select * from t2 where date(cztime) = '2018-08-30' and '08:00:00' <= time(cztime) and time(cztime) <= '10:00:00';    
        正常:select * from t2 where date(cztime) = '2018-08-30' and time(cztime) > '08:00:00' and time(cztime) < '10:00:00';    
    
        总结: tiem(cztime) > '08:00:00'   这么写  
        select 字段名 from 表名 where 字段名 (now() - interval 时间间隔单位);  
    

日期时间的运算

日期时间的运算,时间间隔单位的表示方式 1 day 或 3 hour 或 1 minitue 或 1 year
1. 语法格式
select 字段名 from 表名 where 字段名 运算符(now()-interval 时间间隔单位);

时间间隔单位的表示方式
1day | 3 hour | 1 minitue | 2 year | 3 month

示例

1. 查询一天以内的充值记录  
    select * from t2 where cztime >= (now() - interval 1 day);  

2. 查询一年以前的充值记录  
    select * from t2 where cztime <= (now() - interval 1 year);  

3. 查询一天以前三天以内的充值记录  
    select * from t2 where cztime >= (now() - interval 3 day) and cztime <= (now() - interval 1 day);