初涉MySQL操作(一)

1 数据类型

1.1 整型

数据类型 存储范围 字节
TINYINT 有符号:-2^7到2^7;无符号:0到2^8-1 1
SMALLINT 有符号:-2^15到2^15-1;无符号:0到2^8-1 2
MEDEUMINT 有符号:-2^23到2^23-1;无符号:0到2^24-1 3
INT 有符号:-2^31到2^31-1;无符号:0到2^32-1 4
BIGINT 有符号:-2^63到2^63-1;无符号:0到2^64-1 8

UNSIGNED跟在数据类型后面,表示无符号类型

1.2 浮点型

数据类型 存储范围 说明
FLOAT[(M,D)] -3.402823466E+38至-1.175494351E-38、0和1.175494351E~3.402823466E+38 M是数字总位数,D是小数点后面额位数,若M和D省略根据硬件允许的限制来保存值。单精度大约精确到7位
DOUBLE[(M,D)] -1.7976931348623157E+308至-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308

1.3 日期时间型

类型 存储需求 说明
YEAR 1 1970年~2069年之间的一个日期
TIME 3 -8385959~8385959
DATE 3 1000年1月1日~9999年12月31日
DATETIME 8 1000年1月1日0点~9999年12月31日23点59分59秒
TIMESTAMP 4 1970年1月1日0点到2037年之间的一个值

1.4 字符型

列类型 存储需求
CHAR(M) M个字节,0<=M<=255,定长类型
VARCHAR(M) L+1个字节其中L<=M且0<=M<=65535,变长类型
TINYTEXT L+1个字节,其中L<2^8,变长类型
TEXT L+2个字节,其中L<2^16,变长类型
MEDIUMTEXT L+3个字节,其中L<2^24,变长类型
LONGTEXT L+4个字节,其中L<2^32,变长类型
ENUM(‘value1’,’value2’,……) 1或2个字节,取决于枚举值的个数(最多65535个个值)
SET(‘value1’,’value2’,……) 1、2、3、4或8个字节,取决于set成员的数目(最多64个成员)

2 操作数据表

数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础,关系型的数据库就是一张二维的表格,行称之为记录,列称之为字段,仅创建了数据库,但是没有创建表,仍然无法存储数据。

2.1 创建数据表

  • 创建数据表之前,必须先打开某个数据库

    USE database_name;

    这里写图片描述

  • 创建数据表

    CREATE TABLE [IF NOT EXISTS] table_name(
        column_name data_type,
        …………
    )

    这里写图片描述

2.2 查看数据表

SHOW TABLES [FROM db_name]
[LIKE 'patter' | WHERE expr]
  • [FROM db_name]查看其它数据库中的数据表
    这里写图片描述

查看数据表的结构

SHOW COLUMNS FROM tbl_name;

这里写图片描述

2.3 记录的插入与查询

  • 插入记录

    INSERT [INTO] tbl_name[(col_name,……)] VALUES(val,…)

    省略列名,所有的字段都要赋值:
    这里写图片描述
    给部分字段赋值:
    这里写图片描述

  • 查看记录

    SELECT expr,…… FROM tbl_name;

    这里写图片描述

3 约束

3.1 空值与非空

  • NULL,字段值可以为空
  • NOT NULL,字段值禁止为空
    创建一个数据表
    这里写图片描述
    字段username禁止为空,字段age可以为空
    这里写图片描述
    这里写图片描述

3.2 自动编号 AUTO_INCREMENT与主键PRIMARY KEY

  • 需要记录中某个字段的唯一性,可以使用AUTO_INCREMENT关键字

    • 自动编号,且必须与主键组合使用
    • 默认情况下,起始值为1,每次增量为1
    • 该字段类型必须是整型或字符型(小数部分是0)
    • 自动编号的字段必须定义为主键,否则提示错误
      这里写图片描述
  • 主键 PRIMARY KEY

    • 主键约束
    • 每张数据表只能存在一个主键
    • 主键保证记录的唯一性
    • 主键自动为NOT NULL
    • 将自动编号的字段定义为主键
      这里写图片描述
      创建的数据表字段属性
      这里写图片描述
      创建记录,并查看其自动编号字段记录
      这里写图片描述

备注:主键不一定与自动编号一起使用,但是自动编号必须与主键一起使用

3.3 唯一性约束 UNIQUE KEY

  • 唯一约束可保证记录的唯一性
  • 唯一约束的字段可以为空值(与PRIMARY KEY区分),但由于其唯一性,所以空值只能出现一个
  • 每张表可以有多个唯一约束字段(与PRIMARY KEY区分)
    创建表测试
    这里写图片描述
    这里写图片描述

3.4 默认约束 DEFAULT

默认约束是指当插入记录时,如果没有明确为字段赋值,则自动赋予默认值
这里写图片描述
这里写图片描述
注意ENUM类型
这里写图片描述
没有赋值的具有默认值的字段的记录被赋予默认值
这里写图片描述

3.5 外键约束FOREIGN KEY

  • 约束保证数据的完整性和一致性
  • 约束分为表级约束(针对两个及以上的字段使用)和列级约束(只针对一个字段使用)
  • 约束类型包括:
    • NOT NULL(非空约束)
    • PRIMARY KEY(主键约束)
    • DEFAULT(唯一约束)
    • FOREIGN(外键约束)

外键约束是为了保持数据的一致性和完整性,实现一对一一对多的关系

  1. 父表子表必须使用相同的存储引擎,而且禁止使用临时表;
  2. 数据表的存储引擎只能为InnoDB;
  3. 外键列参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同;而字符的长度则可以不同。
  4. 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将自动创建索引。

备注:
1. 子表:具有外键列的表;父表:子表所参照的表
2. 存储引擎:MySQL中的数据用各种不同的技术存储在文件(或者内存)中。每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。InnoDB :5.5版本后MySQL的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定
3. 临时表:名称以井号 (#) 开头,临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内,如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。

  • 编辑数据表的默认存储引擎,在MySQL文件夹中找到my.ini配置文件,打开找到配置存储引擎的行,如果不是INNODB,则修改

    default-storage-engine=INNODB

    修改后必须重启MySQL

  • 创建一个课程数据表和学生数据表,使学生数据表为子表,课程数据表为附表:
    创建课程数据表
    这里写图片描述
    创建学生数据表
    这里写图片描述
    设置外键:

    FOREIGN KEY (外键列名) REFERENCES 参照表名 (参照列名)
  • 创建索引:
    父表和子表中创建了主键,主键会自动创建索引,同时在外键字段上也已经自动创建了索引
    查看是否创建了索引:

    //表格形式
    SHOW INDEXES FROM lesson;
    //列表形式
    SHOW INDEXES FROM lesson\G;

    这里写图片描述
    这里写图片描述

3.5.1 外键约束的参照操作

在创建外键的时候,还可以写上针对于外键约束的参照操作:

  • CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
  • SET NULL:从父表删除货更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
  • RESTRICT:拒绝对父表的删除或更新操作
  • NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同

它们实际上指出了在进行外键约束的创建以后,更新父表的时候,子表是否也进行相应的操作。
首先再创建一个students1的数据表,使用CASCADE关键字,设置子表在父表删除记录时要进行的更新操作。
这里写图片描述

  • 在设置外键时使用ON 操作名(如ON DELETE)来指明什么更新操作,之后跟参照操作关键字。
  • 在两个数据表中插入记录,注意必须先在父表中插入记录,这样在子表中插入记录时外键列才能参考父表的参照列。
    这里写图片描述
    但是在子表的外键列中无法插入参照列中不存在的值:
    这里写图片描述
  • 删除父表中的一条记录,同时子表中的相应记录也会被删除:
    这里写图片描述

3.6 表级约束和列级约束

  • 对一个数据列建立的约束,称为列级约束
  • 对多个数据列建立的约束,称为表级约束
  • 列级约束既可以在列定义时声明,也可以在列定义后声明
  • 表级约束只能在列定义后声明
  • NOT NULL和DEFAULTE不存在标记约束

4 修改数据表

4.1 添加/删除列

  • 添加单列

    ALTER TABLE tbl_name ADD [COLUMN] col_name
    column_definition [FIRST | AFTER col_name]

    [FIRST|AFTER col_name]指出了插入的列的位置,如果省略则插入到所有列的最后
    这里写图片描述

  • 添加多列

    ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,……)

    添加多列时不能指定添加的位置,所添加的所有列依次在所有列后面。

  • 删除(多)列

    ALTER TABLE tbl_name DROP [COLUMN] col_name,……

    这里写图片描述
    也可以删除一(多)列同时添加一(多)列,操作之间用逗号隔开。

4.2 添加/删除约束

  • 添加主键约束

    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
    PRIMARY KEY [index_type](index_col_name,……)

    这里写图片描述
    CONSTRAINT用于给约束起名字。
    这里写图片描述

  • 删除主键约束

    ALTER TABLE tbl_name DROP PRIMARY KEY

    任何数据表最多只有一个主键约束

  • 添加唯一性约束

    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type](index_col_name,……)

    与主键约束不同的是,可以添加多个唯一性约束
    这里写图片描述

  • 删除唯一约束

    ALTER TABLE tbl_name DROP {INDEX|KEY} index_name

    这里写图片描述
    删除唯一约束用索引的原因在于 unique字段会被默认创建为索引,一张表可以有多个唯一约束,每个唯一约束字段都有索引功能。只有指定了索引的名字(也是字段名),才能确定是删除哪个字段的唯一约束。删除索引的同时也删除了唯一性约束,所以唯一性约束和索引是一一对应的。

  • 添加外键约束

    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,……) reference_definition

    这里写图片描述

  • 删除外键约束

    ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol

    这里写图片描述

  • 添加/删除默认约束

    ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

    这里写图片描述
    这里写图片描述

4.3 修改列定义和更名数据表

  • 修改列定义是指修改字段的数据类型或位置

    ALTER TABLE tbl_name MODIY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

    注意如果不需要修改数据类型,也要原样输入在对应位置
    这里写图片描述
    修改数据类型的时候,注意可能造成数据的丢失

  • 修改列名称

    ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]

    可以看到该命令也可以修改列定义
    这里写图片描述

  • 修改数据表名称

    • 方法一:

      ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
    • 方法二:

      RENAME TABLE tbl_name TO new_tbl_name[,tbl_name2 TO new_tbl_name2,……]

    这里写图片描述
    注意,应尽量少使用数据列和数据表的更名,当我们以后创建了索引,或者使用过视图或存储过程的话,表名或列名曾经被引用的情况下,将它们进行修改可能会导致视图或存储过程无法正常的工作


5 小结

  • 数据类型:整型、浮点型、字符型、日期时间型
  • 操作数据表
    • 创建数据表
    • 查看数据表:查看数据表的字段,查看数据表的创建,查看数据表的索引等
    • 插入记录
    • 查询记录
  • 约束
    • 按功能划分:NOT NULL , PRIMARY KEY , UNIQUE KEY , DEFAULT , FOREIGN KEY
    • 按数据列的数目划分为:表级约束 , 列级约束
  • 修改数据表
    • 针对字段的操作:添加/删除字段,修改列定义,修改列名称等
    • 针对约束的操作:添加/删除各种约束
    • 针对数据表的操作:数据表更名(两种方法)

你可能感兴趣的:(MySQL)