MySQL学习笔记(3)—— 数据库与表的基础操作

文章目录

  • 一、数据定义概述
  • 二、DDL——数据库相关操作
    • 1. MySQL中模式的定义与删除
    • 2. MySQL中数据库的定义与删除
  • 三、DDL——数据表相关操作
    • 1. MySQL存储引擎
    • 2. MySQL数据类型
    • 3. 表相关操作
      • (1)示例情境
      • (2)建表
      • (3)删除表
      • (4)增删改查字段
  • 四、DML——数据的增删改
    • 1. 插入数据
    • 2. 更新数据
    • 3. 删除数据
  • 五、数据完整性
    • 1. 实体完整性
    • 2. 域完整性
    • 3. 参照完整性
    • 4. 用户定义完整性

一、数据定义概述

  1. SQL标准提供若干种数据定义功能,但各个不同数据库系统所支持的有细微区别。大致包含以下几种
    MySQL学习笔记(3)—— 数据库与表的基础操作_第1张图片

    • 数据库(database)定义
    • 模式(schema)定义
    • 表(table)定义
    • 视图(view)定义
    • 索引(index)定义
  2. 层次化的数据库对象命名机制
    MySQL学习笔记(3)—— 数据库与表的基础操作_第2张图片

    • 一个关系数据库管理系统的实例(Instance)中可以建立多个数据库
    • 一个数据库中可以建立多个模式
    • 一个模式下通常包括多个表、视图和索引等数据库对象

二、DDL——数据库相关操作

1. MySQL中模式的定义与删除

  • 定义模式实际上定义了一个命名空间。 在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。
  • CREATE SCHEMA中可以接受CREATE TABLECREATE VIEWGRANT子句。
  • 注意:在MySQL中,定义schema相当于定义database,但在别的数据库中可能不同,参考:MySQL中CREATE DATABASE和CREATE SCHEMA区别
  1. 定义模式:CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
  2. 删除模式:DROP SCHEMA <模式名>
    • CASCADE(级联) :删除模式的同时把该模式中所有的数据库对象全部删除
    • RESTRICT(限制) :如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。仅当该模式中没有任何下属的对象时才能执行。
  3. 示例:
    1. 为用户WANG定义一个学生-课程模式S-T:CREATE SCHEMA “S-T” AUTHORIZATION WANG;
    2. CREATE SCHEMA AUTHORIZATION WANG; 该语句没有指定<模式名>,<模式名>隐含为<用户名>
    3. 为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TAB1:
      MySQL学习笔记(3)—— 数据库与表的基础操作_第3张图片

2. MySQL中数据库的定义与删除

  1. 创建数据库:create database 数据库名

  2. 删除数据库:drop database 数据库名

  3. 示例

    MySQL学习笔记(3)—— 数据库与表的基础操作_第4张图片

    • 查看现有的数据库:show databases;指令
    • 查看当前在哪个数据库下工作:select database();
    • 转到这个数据库下工作:use 数据库名;

三、DDL——数据表相关操作

1. MySQL存储引擎

  • 存储引擎:是如何存储数据、如何更新数据、如何查询数据、如何为存储的数据建立索引等一系列技术的实现方法。

  • 查看mysql支持的引擎

    • 命令:show engines

    • 部分引擎介绍
      MySQL学习笔记(3)—— 数据库与表的基础操作_第5张图片

  • 通常我们使用InnoDB引擎,因为事务功能对优化性能很重要

2. MySQL数据类型

  • 在创建数据表时,准确的定义字段的数据类型是非常重要的

  • MySQL支持多种数据类型,但大致可以分为3类(红色是常用的):

    • 数值类型

      MySQL学习笔记(3)—— 数据库与表的基础操作_第6张图片

    • 日期/时间类型
      MySQL学习笔记(3)—— 数据库与表的基础操作_第7张图片

    • 字符串(字符)类型
      MySQL学习笔记(3)—— 数据库与表的基础操作_第8张图片

3. 表相关操作

  • 在DDL中,对数据表的操作主要有3种:创建、修改和删除。

(1)示例情境

  • 为了便于后面举例子,先提供一个关系示例
  • 现有学生-课程模式 S-T如下:
    • 学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
      MySQL学习笔记(3)—— 数据库与表的基础操作_第9张图片

    • 课程表:Course(Cno,Cname,Cpno,Ccredit)
      MySQL学习笔记(3)—— 数据库与表的基础操作_第10张图片

    • 学生选课表:SC(Sno,Cno,Grade)
      MySQL学习笔记(3)—— 数据库与表的基础操作_第11张图片

(2)建表

  • 创建数据表,需要定义的信息主要包括:表名、字段名、字段类型
  1. SQL标准

    • 语法

      CREATE TABLE <表名>
      (<列名> <数据类型>[ <列级完整性约束条件> ] 
      [,<列名> <数据类型>[ <列级完整性约束条件>] ] …
      [,<表级完整性约束条件> ] );
      
    • 说明

      • <表名>:所要定义的基本表的名字
      • <列名>:组成该表的各个属性(列)
      • <列级完整性约束条件>:涉及相应属性列的完整性约束条件(如PRIMARY KEYUNIQUE
      • <表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件(如FOREIGN KEY
      • 如果完整性约束条件涉及到该表的多个属性列,则必须定义
        在表级上,否则既可以定义在列级也可以定义在表级。
    • 示例(这些都符合MySQL语法)

      • 建立“学生”表Student。学号是主码,姓名取值唯一

        CREATE TABLE Student 
        (Sno CHAR(9) PRIMARY KEY, 		/* 列级完整性约束条件:Sno是主码*/ 
        Sname CHAR(20) UNIQUE,			/* 列级完整性约束条件:Sname取唯一值*/
        Ssex CHAR(2),
        Sage SMALLINT,
        Sdept CHAR(20)
        );
        
      • 建立一个“课程”表Course

        CREATE TABLE Course
        (Cno CHAR(4) PRIMARY KEY,
        Cname CHAR(40), 
        Cpno CHAR(4), 		/*先修课*/
        Ccredit INT,
        /* Cpno是外码,被参照表是Course,被参照列是Cno(自己参照自己) */
        FOREIGN KEY (Cpno) REFERENCES Course(Cno) ); 	
        
      • 建立一个学生选课表SC

        CREATE TABLE SC
        (Sno CHAR(9), 
        Cno CHAR(4), 
        Grade INT,
        /* 主码由两个属性构成,必须作为表级完整性进行定义*/
        PRIMARY KEY (Sno,Cno), 
        /* 表级完整性约束条件,Sno是外码,被参照表是Student */
        FOREIGN KEY (Sno) REFERENCES Student(Sno),
        /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
        FOREIGN KEY (Cno) REFERENCES Course(Cno)
        );
        
  2. MySQL语法

    • 语法

      CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
      [(create_definition,…)] 
      [table_options] [select_statement]
      
    • 说明

      • TEMPORARY:表示创建临时表,在当前会话结束后将自动消失

      • IF NOT EXISTS:在建表前,先判断表是否存在,只有该表不存在时才创建

      • create_definition:建表语句的关键部分,用于定义表中各列的属性,放在括号里。这部分和SQL标准语法差不多

      • table_options:表的配置选项(如表的默认存储引擎、字符集)

      • select_statement:通过select语句建表 ,这一般是把查询结果作为表,用这个的话,create_definition部分不用写

    • 示例

      • 建立练习方式表

            create table contacts(
            	id int primary key,
            	name varchar(30),
            	phone varchar(20)
            )ENGINE=InnoDB default charset=utf8;
        
        • 表名:contacts
        • create_definition
          • id:int,是主键,可以自动增长
          • name :varchar(30)
          • phone:varchar(20)
        • table_optionsENGINE=InnoDB DEFAULT CHARSET=utf8;
        • 这里没用select_statement
      • 建立员工表

          create table employee(
          	id int not null auto_increment primary key,	 	# 非空、自动增长、主键
          	name varchar(30) comment '姓名',					# 注释'姓名' 	
          	sex varchar(1) comment '性别',
          	salary int comment '薪资(元)'
          );
        
        • auto_increment:Mysql数据库之auto_increment

        • NOT NULL:非空约束,也就是插入值的时候不能为空,而且值不能是空值

        • DEFAULT:默认值,如果插入记录的时候没有给字段赋值,则使用默认值,如:email VARCHAR(50) NOT NULL DEFAULT '[email protected]'

        • comment:MySQL 添加注释(comment)

(3)删除表

  1. SQL标准DROP TABLE <表名>[RESTRICT| CASCADE];
    • RESTRICT:删除表是有限制的。 欲删除的基本表不能被其他表的约束所引用,如果存在依赖该表的对象,则此表不能被删除
    • CASCADE:删除该表没有限制。在删除基本表的同时,相关的依赖对象一起删除
  2. MySQL语法DROP TABLE <表名>
    • MySQL中的删除规则不是在删除命令中给出,而是在外键约束中给出仅InnoDB引擎支持外键约束)。在存在约束关系的表发生修改或删除时,可以分别设置表行为,一共有四种
      • RESTRICT:同上
      • CASCADE:同上
      • NO ACTION:基本类似RESTRICT
      • SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。
    • 针对外键约束,请参考如下文章
      • 外键约束的相关语法:MySQL的外键约束FOREIGN KEY
      • 四种行为的说明1:MySQL外键更新删除设置cascade、set null、restrict、no action的区别
      • 四种行为的说明2:mysql级联删除-----Mysql 的 Cascade Restrict
    • 在Navicat工具中,在表右键选 “设计表” ,选项卡点击外键,可以看到定义的行为
      在这里插入图片描述

(4)增删改查字段

  1. 标准SQL

    • 语法
      ALTER TABLE <表名>
      [ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
      [ ADD <表级完整性约束>]
      [ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
      [ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
      [ALTER COLUMN <列名><数据类型> ] ;
      
      • ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件。不管基本表中原来是否已有数据,新增加的列一律为空值
      • DROP COLUMN子句用于删除表中的列
      • 如果指定了CASCADE短语,则自动删除引用了该列的其他对象
      • 如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列
      • DROP CONSTRAINT子句用于删除指定的完整性约束条件
      • ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型
    1. 示例

      /*向Student表增加“入学时间”列,其数据类型为日期型*/
      ALTER TABLE Student ADD S_entrance DATE;
      
      /*将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数*/
      ALTER TABLE Student ALTER COLUMN Sage INT;
      
      /*增加课程名称必须取唯一值的约束条件*/
      ALTER TABLE Course ADD UNIQUE(Cname);
      
  2. MySQL语法

    • 在选中数据库的情况下(use ...;)可以查看当前库中的表

      • 查看有哪些表:show tables;
      • 查看某个表的结构:desc 表名;
    • 对于已经存在的表,可以使用alter命令添加、修改、删除字段。

    • 示例

      #查看当前数据库中已存在的表
      show tables;
      
      #contacts表添加字段sex,类型为VARCHAR(1)
      ALTER TABLE contacts ADD sex CHAR(1);
      
      #修改字段sex的类型为tinyint
      ALTER TABLE contacts MODIFY sex int;	#int默认11位,也可以int(10)这样来指定长度 
      
      #删除字段sex
      ALTER TABLE contacts DROP COLUMN sex;
      

四、DML——数据的增删改

  • 写到这里考虑了一下,放出标准SQL写法起始没啥必要,所以后面就不写了,以下都是MySQL语法

1. 插入数据

  • 命令:

    //插入单条数据
    INSERT INTO table_name (field1, field2, ..., fieldN) VALUES (value1, value2, ..., valueN);
      
    //插入多条数据
    INSERT INTO table_name (field1, field2, ..., fieldN) VALUES (valueA1, valueA2, ..., valueAN), (valueB1, valueB2, ..., valueBN),, (valueN1, valueN2, ..., valueNN);
    
  • 注意:

    • 如果字段是字符型,值必须使用单引号或者双引号,如 ”value”
    • 如果值本身带单引号或双引号,需要转义
    • 如果所有列都要添加数据,insert into语句可以不指定列,即INSERT INTO table_name VALUES (value1, value2, ..., valueN);
  • 示例:

    insert into contacts(id,name,phone) values(1,'张三','123456789');
    
    mysql> select * from contacts;
    +----+------+-----------+
    | id | name | phone     |
    +----+------+-----------+
    |  1 | 张三  | 123456789 |
    +----+------+-----------+
    

2. 更新数据

  • 命令:UPDATE table_name SET field1=newValue1, field2=newValue2 [WHERE Clause]

  • 注意:

    • 可以同时更新一个或多个字段

    • 可以通过where子句来指定更新的范围,如果不带where,则更新数据表中的所有记录

3. 删除数据

  • 命令:DELETE FROM table_name [WHERE Clause]

  • 注意:可以通过where子句来指定删除的范围,如果不带where,则删除数据表中的所有记录

五、数据完整性

  • 数据完整性是指存储在数据库中的数据,应该保持一致性和可靠性。

  • 关系模型允许定义三类数据约束,它们是

    • 实体完整性
    • 参照完整性
    • 用户定义的完整性约束
  • 实体完整性和参照完整性约束由关系数据库系统自动支持

MySQL学习笔记(3)—— 数据库与表的基础操作_第12张图片

1. 实体完整性

  1. 实体完整性要求每张表都有唯一标识符,每张表中的主键字段不能为空且不能重复

  2. 说明:

    1. 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集

    2. 现实世界中的实体是可区分的,即它们具有某种唯一性标识

    3. 关系模型中以主码(候选码)作为唯一性标识

      • 候选码:若关系中的某一属性组的值能唯一地标识一个元组(代表一个实体),而其子集不能,则称该属性组为候选码
      • 主码:若一个关系有多个候选码,则选定其中一个为主码(Primary key)
      • 主属性:候选码的各个属性称为主属性(Prime attribute)
    4. 主属性不能取空值:主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第2点相矛盾,因此这个规则称为实体完整性

  3. 约束方法:唯一性约束、主键约束、标识列

    • 唯一性约束:用关键字 UNIQUE 实现字段的唯一性约束,从而保证实体的完整性

      • UNIQUE 意味着任何两条数据的同一个字段不能有相同值

      • 一个表中可以有多个 UNIQUE 约束

       #在创建表时添加唯一性约束
      create table person(
      id int not null auto_increment primary key comment '主键id',
      name varchar(30) comment '姓名',
      id_number varchar(18) unique comment '身份证号'		#注意unique约束
      );
      

2. 域完整性

  1. 域完整性是针对某一具体关系数据库的约束条件,它保证表中某些列不能输入无效的值
  2. 域完整性指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等。
  3. 约束方法:限制数据类型、检查约束、默认值、非空约束

3. 参照完整性

  1. 参照完整性要求关系中不允许引用不存在的实体

  2. 说明

    1. 关系间的引用

      • 在关系模型中实体及实体间的联系都是用关系来描述的,自然存在着关系与关系间的引用
      • 例如 专业 是一个实体,它包含专业名、办公室地点、成立时间等属性。对于另一个实体 学生 来说,我们说学生的专业是XXX,这就是两个实体间的引用关系
    2. 外码

      • 设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是R的外码(F不可是R的主码)
        在这里插入图片描述

      • 基本关系R称为参照关系(Referencing Relation)

      • 基本关系S称为被参照关系(Referenced Relation) 或目标关系(Target Relation)

    3. 关系R和S不一定是不同的关系,目标关系S的主码Ks 和参照关系的外码F必须定义在同一个(或一组)域上,外码并不一定要与相应的主码同名。

  3. 参照完整性规则

    • 若属性(属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为

      • 或者取空值
      • 或者等于S中某个元组的主码值
    • 例:

      • 学生实体:学生(学号,姓名,性别,专业号,年龄)

      • 专业实体:专业(专业号,专业名)

      • 学生实体中的外码专业号只能有两个取值:空值 表示此学生专业尚未分配;非空值 这时此值必须是专业关系中某个元组的 专业号 值,表示此学生不可能分配一个不存在的专业

  4. 约束方法:外键约束

    • 外键约束:定义了表之间的一致性关系,用于强制参照完整性。定义了对同一个表或其他表的列的引用这些列具有PRIMARY KEYUNIQUE约束

      #主表(学生表)
      create table stu(
       stu_no int not null primary key comment '学号',
       stu_name varchar(30) comment '姓名'
      );
      
      #从表(成绩表)
      create table sc(
       id int not null auto_increment primary key comment '主键id',
       stu_no int not null comment '学号',
       course varchar(30) comment '课程',
       grade int comment '成绩',
       foreign key(stu_no) references stu(stu_no)		# 定义外键约束
      )
      
    • 在插入数据时,必须先向主表插入,再向从表插入。删除数据时正好相反

4. 用户定义完整性

  1. 用户自定义完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求(比如某用户应用程序要求年龄属于 [14,40] )

  2. 关系模型应提供定义和检验这类完整性的机制(可以在DBMS中定义),以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能

  3. 约束方法:规则、存储过程、触发器

你可能感兴趣的:(MySQL)