表的创建(列的类型定义)

数据表操作

​ 表是一种很重要的数据库对象,是组成数据库的基本元素,由若干个字段组成,主要用来实现存储数据记录。表的操作包括创建表、查询表、修改表 和 删除表。

如何创建一张简单表?

ID(class_id)名称(class_name)班主任(class_teacher)
101六年级一班马老师
102六年级二班潘老师
create database school;
use school;
create table class(class_id int,class_name varchar(128),class_teacher varchar(64));
insert into class values(101,'六年级一班','马老师');
insert into class values(102,'六年级二班','潘老师');
select * from class;
select * from class where class_id=101;#查询表class中id=101的全部记录

1、表的创建

  • CREATE TABLE 命令语法比较多,其主要是由表创建定义(create-definition)、表选项(table-options)和分区选项(partition-options)所组成的。

    • CREATE TABLE<表名>([<列名1><类型1>,...,<列名n><类型n>])[表选项][分区选项]
  • 表定义选项:由列名(col_name)、列的定义(column_definition,或者类型定义)以及可能的空值说明、完整性约束或表索引组成

    • 举例

      use school;
      create table class4(class_id int PRIMARY KEY,class_name varchar(128) NOT NULL,class_teacher varchar(64)UNIQUE);
      
  • 列名:字段必须填写描述信息、字段命名使用完整名称、采用字段的名字必须是易于理解,一般不超过三个英文单词

2、列的类型定义

整形

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/80c1f838742c40809d29ec911c2d12c2.png

  • 类型名称后面的小括号:表示 显示宽度,并不是占用字节数,一般配合zerofill使用,数字位数不够,用’0’补充

  • UNSIGNED(无符号)

    • use school;
      create table class(class_id integer(5) zerofill,...,);#指定zerofill之后,自动转换为int unsigned
      create table class1(class_id integer(5) unsigned,...,);
      
  • AUTO_INCREMENT:表示自增、从1开始,每一行加1。一个表中最多由 一个AUTO_INCREMENT列。并且该列应该定义为NOT NULL。

    • use school;
      create table clss8(id integer auto_increment PRIMARY KEY, name varchar(128),...)
      create table clss8(id integer auto_increment UNIQUE, name varchar(128),...)
      #两个表中,id都具有自增长属性
      

浮点类型和定点数

在这里插入图片描述

  • ​ MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。对于decimal,M是最大位数(精度),范围是1到65。可不指定,默认值是10。D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。
  • DECIMAL默认为(10,0);
  • 当我们需要存储小数,并有精度要求时,通常会使用DECIMAL字段类型

日期和时间类型

在这里插入图片描述

YEAR类型表示年,DATE类型表示日期,TIME类型表示时间,DATETIME和TIMESTAMP表示日期和时间

  • 超出有效范围会报错

  • 插入日期时间、可以用“: - _ /”任意一个来分割

  • use test;
    create table date_example(e_date date,e_datetime datetime,e_timestamp timestamp,e_time time,e_year year);#创建表 dt_example
    insert into date_example values('2020_5-9','2020/5:9 15:01:00','20200509150100','15:01:00','2011');
    
  • 也可以使用mysql自身函数来实现

    • CURDATE() - 获取当前的DATE,可直接插入DATE类型中

      NOW() - 获得当前的DATETIME,可直接插入DATETIME 和 TIMESTAMP类型中。

      TIME() - 获取参数给定时间串中时分秒,可直接插入TIME类型中

      YEAR() - 获取参数给定时间串中的年份,可直接插入YEAR类型中

      MONTH()、DAY()、HOUR()、MINUTE()、SECOND()获取时间串中的月、日、时、分、秒

    • use test;
      insert into date_example values(CURDATE(),NOW(),NOW(),time(NOW()),YEAR(NOW()));
      

字符串类型

CHAR类型和VARCHAR类型 长度不是字节
  • 两个类型都在创建时指定了最大长度:字符串类型(MaxLength);

  • CHAR类型是固定的,0~255之间的任意值,无论存储的字节达不到指定值,占用字节数都是 MAX

  • VARCHAR类型是可变的,0~65535之间的任意值,如果存储的字节达不到指定值,那么就占用当前用的字节数;如果字符串尾部要保留空格,必须选择varchar

  • use test;
    create table char_example(e_char char(5),v_char varchar(5));
    insert into char_example values('12345','12345');
    insert into char_example values('1 2  ','12   ');#char会屏蔽后面隐藏的空格,varchar不会
    select concat('(',e_char,')'),concat('(',v_char,')') from char_example;#让char屏蔽的空格原形必露,根本就没有
    
TEXT类型 字节而不是长度

-

  • 无需指定长度、允许的长度是实际存储的字节数、例如一个中文字符是占用两个字节。

  • use test;
    create table text_example(e_text tinytext, v_char varchar(255));#e_text可存储255字节、v_char可存储255字符
    insert into char_example values(90个中文字符,90个中文字符);#插入失败、utfmb4用三个字节表示一个中文
    insert into char_example values(80个中文字符,90个中文字符);#插入成功
    
  • 实战练习

    • 创建一个用户信息表,用来存储用户的如下信息:姓名,手机号码,家庭地址,个人简介,性别,年龄,身份证号。数据库表名可定义为userinfo, 同时增加一个列id 用来作为每一条记录的唯一标识,并设为主键,自加!

    • use test;
      create table userinfo(
      id int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT'主键',
      name varchar(64) DEFAULT NULL COMMENT'姓名',
      mobile char(11) DEFAULT NULL COMMENT'手机号码',
      address varchar(128) DEFAULT NULL COMMENT '居住地址',
      description text DEFAULT NULL COMMENT '个人简介,不知道具体范围,不常更新用text',
      sex char(1) DEFAULT NULL COMMENT '性别-男或女',
      age tinyint unsigned DEFAULT 0 COMMENT '年龄',
      idno char(18) DEFAULT NULL COMMENT '身份证号码'
      );
      
      
ENUM
  • ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定

    • 属性名 ENUM(‘值1’, ‘值2’, … , ‘值n’);

      eg:

      Enum('男', '女', '选择保密') #'男' = 1,'女' = 2,'选择保密' = 3
      
      use test;
      create table enum_exampl(e_enum enum('男', '女', '选择保密'));#创建表
      insert into enum_example values('男');
      insert into enum_example values(1);#也可以用数值来表示,也可以用enum选项中的值
      select e_enum+0 from enum_example;#查询enum选项对应的整数值
      
  • 如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个值,如果不加NOT NULL,默认值就是NULL。

SET(它的值使用二进制中1来表示的)
  • SET类型的值可以取列表中的一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是由64个元素构成的组合。

  • 再创建表时,SET类型的取值范围就以列表的形式指定了

    • 属性名 SET(‘值1’, ‘值2’, … , ‘值n’);

      use test;
      create table set_example(interest set('足球','追剧','篮球','撩妹'));#创建表
      insert into set_example values('足球,撩妹');#插入记录,必须时enum选项中的值
      insert into set_example values(9);#插入相应位效果等同,9 => 1001 选择1,4
      select interest+0 from set_example;#以整数的方式查询
      select * inserest from set_example;#输出中文
      

二进制类型

二进制文件和文本数据在mysql中的最大区别在于:

  • 二进制类型存储原始的二进制数据(如图片,视频,exe文件等),文本类型(TEXT)用来存储字符字符串(如由英文字符、中文字符或其他语言字符组成的字符串)。
  • 二进制类型没有字符集,并且排序和比较基于列值字节的数值。而TEXT类型有字符集,并且根据字符集的校对规则对值进行排序和比较

在这里插入图片描述

BINARY 和 VARBINARY类型

类型(MaxLength)

  • BINARY类型长度是固定的,不足的用“\0”补全 max 255

  • VARBINARY类型是可变的,在最大值范围内使用多少就分配多少。max 65535

  • use test;
    create table bin_example(e_bin binary(5),e_varbin varbinary(5));
    insert into bin_example values('ab','ab');
    insert into bin_example values(b'0110000101100010',b'0110000101100011');#就是ab
    select * from bin_example;
    
BIT 类型

BIT (MaxLength);

MaxLength 的最大值 为 64;BIT(4)存储的数据是0~15.

  • 插入数据时,使用b’位串’的方式插入相应值!

  • 查询时,可以使用bin()、oct()、hex()函数将字段的值转换成相应的二进制、八进制和十六进制

  • use test;
    create table bit_example(b bit(8));
    insert into bit_example values(b'10110111');
    insert into bit_example values('a');
    select bin(b) from bit_example;#以二进制的方式显示字段值
    
BOLB类型
  • blob不设置长度,当不知道属性的最大长度时,适合用blob,能用varbinary的地方不用blob;
  • 按查询速度:binary最快 varbinary次之 blob最慢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值