day44 数据库学习

---恢复内容开始---

  今天学习了数据库的建表语句、数据类型和约束

  一、建表语句

  create table  表名(

  字段名 数据类型[(长度) 约束条件]

  )

  []代表可选的

  为什么需要给数据分类?

  1、描述数据更加准确

  2、节省内存空间

  二、数据类型

    整数类型

    默认有符号的 设置为无符号的

      1、create table t2(age tinyint unsigned);

      2、建表后用alter修改

  对于整数类型而言长度不是数据所占的字节数 是显示数据时的宽度(字符数)

  默认情况下 存储的数值的十进制位数 小于所设置的显示宽度时 不会填充 没有任何效果

  加上zerofull 指定当存储的数值的十进制位数 小于所设置的显示宽度时 用0来填充

  当数据的十进制长度 大于显示宽度 可以正常显示

  主要记住 整型后面的长度的含义 有字符是不同的

    tinyint、smallint、mediumint、int、bigint

  总结:除了存储范围没啥区别

    都是整型

    默认有符号

    对于显示宽度 原理是相同的

    长度参数如果不指定 会有默认值

  严格模式

    什么是严格模式 对插入的数据严格要求 不在范围内直接报错 例如往tinyint中插入大于255的值将报错

    什么是非严格模式 不对插入的数据严格要求 不在范围内也可以保存 保存的当前类型最大支持的值

    5.6默认是非严格模式

    5.7以后默认严格模式

    查看SQL模式

      select @@sql_mode

      show variables like "sql_mode":

    修改SQL模式

      set @@sql_mode = "值";

    正常情况不需要改

    浮点类型

      float 4字节

      double 8字节

      decimal 不固定

      create table t9(num float(m,d))

      m 表示总长度 d表示小数部分的长度

      长度表示不是数据存储范围 而是字符长度

      10.12 总长为4  小数部分为2

      各个类型的最大长度

      float  (255,30)

      double  (255,30)

      decimal  (65,30)

      区别:

        float与double的精度不同 都是不准确的小数

        decimal 准确的小数 不会丢失精度

      具体使用哪种类型得根据使用场景判断

      float满足大部分使用场景

      decimal适合银行系统 科学研究等

      

      括号中m和d的值 可以限制数据存储范围 与整型不同

      重点:记住m和d的含义

    字符串类型

      常用两种

      char 定长字符串

      varchar 可变长度字符串

      注意字符串 长度指定的是数据的字符长度  与字节没关系

    

      create table t13(c1 char,c2 varchar(10));

      在创建时 varchar必须指定长度 char有默认值

      

      不同点:

        a char(3) b char(3)

        A  |B  |

        char类型在取数据时 就根据长度来获取 不关心真实数据长度

        无论这数据有多长 占用的空间是固定的 造成了一定空间浪费

        a varchar(30) b varchar(30)

        (1)A(1)B 

        varchar类型在取数据时 先获取数据长度 在根据长度获取真是数据 关心真是数据长度

        先存储长度需要一个字节 再存储真实数据 不会浪费空间

        但是 由于需要计算数据的长度 所以存取速度会比定长慢

         相同点:

        括号中的数字 都是表示存储最大字符长度

      char使用评率最高

      mysql会在存储数据时自动将数据末尾的空格去掉

      如果必须要存空格 需要修改sql_mode 增加 PAD_CHAR_TO_FULL__LENGTH 意思是把空格当作有效数据

      由于自动去除空格这个机制 在使用等于符号 和like是有区别

        select *from t1 where name = "yh        "; 会自动去除空格

        select *from t1 where name like "yh     ";不会自动去除空格

        like 用于模糊匹配  使用%表示0或任意个字符 使用_表示一个任意字符

    日期和时间

      year、time、date、datetime、timestamp

      timestamp特点是:可以给null 自动输入当前时间 当这条记录被修改了会自动更新当前时间

    枚举

      enum 可以指定一堆字符串的值 在插入数据时 数据必须是这堆字符串中的其中一个("男的","女的") 多选一

    集合

      set 可以指定一堆字符串的值 在插入数据时 数据必须是这堆字符串中的其中一个或多个("男的","女的") 多选多

    共同点:数据都是字符串类型

  3、约束

    是一种对数据的限制

      已经学习过的  数据类型 unsigned无符号 字符串长度 浮点的长度

    约束的作用是为了保证数据的正确性,完整性

    额外的约束:

      NOT NULL 非空约束 限制该字符的值不能为空

      UNIQUE 唯一性约束  限制该字段的值是唯一的不能出现重复

      DEFAULT  默认值约束  如果插入数据时没有指定该字段的值则使用默认值

      PRIMARY KEY 主键约束 如果插入数据时没有指定该字段的值则使用默认值

      FOREIGN KEY 外键约束 用来指向另一个表的主键

      

      每一个表都应该有一个主键 需要唯一标识  否则可能出现完全相同的两个数据 无法区分

      UNIQUE 不能重复 但是可以为空 这样也不能唯一标识

      UNIQUE NOT NULL 不能为空唯一 可以唯一标识一条数据 书写顺序无所谓

      UNIQUE NOT NULL 与 主键的区别

        UNIQUE NOT NULL 不能被其他表引用(不能作为其他表的外键)

        UNIQUE NOT NULL 约束一个表中可以有多个 但是主键只能有一个

      手动修改自动增长计数

      alter table 表名 auto_increment 新的值:

      注意:如果新的值小于当前的最大值 是无效的

      通常建一个表就要建一个主键 主键的类型通常是整型

      insert 语句

        insert into 表名 values(值1,值n,.....)

        要求值的顺序 个数 必须与表字段完全对应

      另一种写法

        insert into 表名(字段名1,字段名n,.....) values(值1,值n,.....)

        可以选择性的插入某些字段 要求值的顺序 必须与表名后面声明的字段一致      

      

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/xiaocaiyang/p/9996890.html