3.3 数据定义

思维导图:

 前言:

**核心概念**:
- 关系数据库支持**三级模式结构**:模式、外模式、内模式。
- 这些模式中包括了如:模式、表、视图和索引等基本对象。
- SQL的数据定义功能主要包括了模式定义、表定义、视图和索引的定义。

---

**1. SQL的数据定义语句**

**重点**:
- SQL标准**不提供**修改模式定义和修改视图定义的操作。要修改,需先删除后重建。
- 虽然SQL标准没有索引相关的语句,但为了查询效率,商用数据库通常提供索引机制和与数据库(有的系统称为目录)相关的语句。

---

**2. 数据库对象命名机制**:
- 早期数据库系统:所有数据库对象都属于一个数据库(只有一个命名空间)。
- 现代关系数据库:提供层次化的数据库对象命名机制。
  - 一个关系数据库系统实例中可建立多个数据库。
  - 一个数据库中可建立多个模式。
  - 一个模式下通常包括多个表、视图、索引等数据库对象。

**图3.3** 描述了数据库对象命名机制的层次结构,展示了从数据库系统实例到具体的表/视图/索引的层次关系。

---

**本节内容总结**:
- 了解如何定义模式、基本表和索引。
- 视图的定义及概念会在3.7节进行专门讨论。

通过这个笔记,读者可以快速理解和回顾3.3节的核心内容和重点。

 3.3.1 模式的定义与删除

**3.3.1 模式的定义与删除**

---

**1. 定义模式**
- **SQL模式定义语句**: 

  CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;


  如果不指定<模式名>,那么<模式名>默认为<用户名>。

- **权限要求**:
  - 调用该命令的用户需拥有数据库管理员权限。
  - 或者必须获得数据库管理员授予的`CREATE SCHEMA`权限。

- **例子**:
  - **例3.1**: 为用户WANG定义一个学生-课程模式S-T。

  CREATE SCHEMA "S-T" AUTHORIZATION WANG;


  - **例3.2**: 
 

 CREATE SCHEMA AUTHORIZATION WANG;


    此命令未指定模式名,所以默认模式名为用户名WANG。

- **模式内容**:
  - 定义模式相当于定义了一个命名空间。
  - 在这个空间里,可以进一步定义该模式包含的数据库对象,如基本表、视图、索引等。
  - 这些对象可以通过表3.3中的`CREATE`语句定义。

- **进一步的模式定义**:
  - `CREATE SCHEMA`可以接受`CREATE TABLE`, `CREATE VIEW`和`GRANT`子句。
  - 这意味着在创建模式的同时,可以在此模式里创建基本表、视图,并定义授权。
  - 结构为:

   CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句> <视图定义子句> <授权定义子句>];


  - **例3.3**:

    CREATE SCHEMA TEST AUTHORIZATION ZHANGCREATE TABLE TAB1 (COL1 SMALLINT,COL2 INT,COL3 CHAR(20),COL4 NUMERIC(10,3),COL5 DECIMAL(5,2));

---

**2. 删除模式**
- **SQL删除模式语句**: 

  DROP SCHEMA <模式名> <CASCADE | RESTRICT>;

- **选择 CASCADE 或 RESTRICT**:
  - **CASCADE**: 删除模式时,同时删除该模式中所有数据库对象。
  - **RESTRICT**: 如果模式中已定义了下属数据库对象(如表、视图等),则拒绝删除操作。只有当该模式中没有任何对象时,才能执行`DROP SCHEMA`。

- **例子**:
  - **例3.4**: 

    DROP SCHEMA ZHANG CASCADE;


    该命令删除了模式ZHANG,同时,表TAB1也被删除了。

---

这个笔记总结了模式的定义与删除的基本操作和相关的SQL命令,使读者能快速回顾和理解3.3.1节的内容。

 

 3.3.2 基本表的定义、删除与修改

**3.3.2 基本表的定义、删除与修改**

---

**1. 定义基本表**

- **概述**:创建模式后,即构建了一个数据库命名空间。首先要在这个空间中定义的是数据库基本表。
  
- **定义语句**:

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

- **完整性约束条件**:
  - 存入系统的数据字典中。
  - 当操作表数据时,关系数据库管理系统会自动检查该操作是否违反约束。
  - 约束可以定义在列级或表级。涉及多个属性列的需定义在表级。

- **例子**:

  - **例3.5**:定义“学生”表Student

  CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, /* Sno是主码 */Sname CHAR(20) UNIQUE,  /* Sname取唯一值 */Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20));

  - **例3.6**:定义“课程”表Course
   

   CREATE TABLE Course (Cno CHAR(4) PRIMARY KEY,    /* Cno是主码 */Cname CHAR(40) NOT NULL,   /* Cname不能取空值 */Cpno CHAR(4),              /* 先修课 */Credit SMALLINT,FOREIGN KEY(Cpno) REFERENCES Course(Cno)  /* Cpno是外码,被参照表是Course,被参照列是Cno */);

  - **例3.7**:定义学生选课表SC
 

 CREATE TABLE SC (Sno CHAR(9),Cno CHAR(4),Grade SMALLINT,PRIMARY KEY (Sno, Cno),   /* 主码由Sno和Cno构成 */FOREIGN KEY(Sno) REFERENCES Student(Sno),  /* Sno是外码,被参照表是Student */FOREIGN KEY(Cno) REFERENCES Course(Cno)    /* Cno是外码,被参照表是Course */);

---

**[注意]**:后续部分关于“删除与修改”的内容似乎被删减了。请提供相关部分的内容,以便为您整理笔记。

**2. 数据类型**

---

关系模型中的**域**是一个核心概念。每个属性都来源于一个特定的域,且其取值必须位于该域之中。在SQL语言中,这个域的概念由**数据类型**实现。定义表的属性时,需要明确其数据类型及长度。尽管SQL标准支持众多数据类型,但不同的关系数据库管理系统(RDBMS)所支持的数据类型可能会有所不同。

**表3.4 常用数据类型及其描述**

---

**选择合适的数据类型**:决定一个属性的数据类型需要考虑其实际应用情境:

1. **取值范围**:需要确认该属性可能的最大和最小值。
2. **所需运算**:考虑该属性会进行哪些运算。例如,年龄属性可能需要算术运算,如计算平均年龄,因此选择整数类型更为合适。

**示例**:考虑年龄属性(Sage)。尽管可以选择CHAR(3)作为数据类型,但由于需要进行算术运算,CHAR类型不适合。考虑到人的年龄大约在百岁以内,选择短整数(SMALLINT)作为其数据类型更为合适。

 3.模式与表

**3. 模式与表**

---

在关系数据库中,**模式**是定义数据库结构的一种方式,而**基本表**是模式中的具体结构。每个基本表都属于某一个模式。下面是模式和表的定义及关联方式的简要笔记:

1. **定义方式**:
    - 每个基本表都属于特定的模式。
    - 一个模式可以包含多个基本表。

2. **表所属模式的定义方法**:
    - **方法一**:在表名中明确标明模式名。
       

    CREATE TABLE "S-T".Student(…);CREATE TABLE "S-T".Course(…);CREATE TABLE "S-T".SC(…);


    - **方法二**:在创建模式时一并定义表。
    - **方法三**:先设置默认模式,再创建表,这样在定义表时就不需要再明确指定模式名。

3. **搜索路径**:
    - 当创建基本表时没有指定模式,系统会根据**搜索路径**确定该表所属的模式。
    - 搜索路径包含一系列模式名,RDBMS会选用其中第一个存在的模式名作为表的模式名。
    - 如果所有搜索路径中的模式名都不存在,系统会报错。
    - 查看当前搜索路径:
 

 SHOW search_path;


    - 默认搜索路径是 `$user, PUBLIC`。这意味着系统首先会查找与用户名相同的模式,若不存在,再使用`PUBLIC`模式。
    - 数据库管理员可以修改默认搜索路径。例如,为了默认使用"S-T"模式,可以执行以下操作:
     

  SET search path TO "S-T", PUBLIC;CREATE TABLE Student (…);

**总结**:模式为数据库提供了一个组织和管理的结构,而基本表是模式中的具体实体。在实际操作中,可以使用不同的方法来指定表所属的模式,其中最常见的是通过设置搜索路径。

 

**4. 修改基本表**

---

关系数据库的应用环境和需求可能随时间发生变化,因此经常需要对已存在的基本表进行修改。SQL提供了`ALTER TABLE`语句来实现这些更改。以下是如何修改基本表的详细笔记:

1. **ALTER TABLE语句格式**:

   ALTER TABLE <表名>[ADD [COLUMN] <新列名> <数据类型> [完整性约束]][ADD <表级完整性约束>][DROP [COLUMN] <列名> [CASCADE | RESTRICT]][DROP CONSTRAINT <完整性约束名> [RESTRICT | CASCADE]][ALTER COLUMN <列名> <数据类型>];

2. **修改操作的说明**:
    - **ADD子句**:用于添加新的列、新的列级完整性约束条件,以及新的表级完整性约束条件。
    - **DROP COLUMN子句**:删除表中的列。`CASCADE`选项会自动删除引用了该列的其他对象,如视图。`RESTRICT`选项则在该列被其他对象引用时拒绝删除。
    - **DROP CONSTRAINT子句**:删除指定的完整性约束条件。
    - **ALTER COLUMN子句**:修改原有的列定义,这可以是修改列名或数据类型。

3. **示例**:
    - **例3.8**:向Student表中添加一个新列“入学时间”,数据类型为日期。
   

   ALTER TABLE Student ADD S_entrance DATE;


        新增的列默认值为空。
        
    - **例3.9**:将Student表的Sage列数据类型从字符型更改为整数型。
     

    ALTER TABLE Student ALTER COLUMN Sage INT;


        
    - **例3.10**:在Course表上添加一个约束,确保课程名称(Cname)是唯一的。
       

  ALTER TABLE Course ADD UNIQUE(Cname);

**总结**:`ALTER TABLE`语句为数据库开发者提供了强大的工具,以满足不断变化的应用需求。使用此语句可以添加、删除或修改表结构,从而确保数据结构的灵活性和适应性。

 

 

**5. 删除基本表**

---

删除不再需要的基本表是数据库维护的常见任务。`DROP TABLE`语句在SQL中负责执行此操作。以下是此主题的详细笔记:

1. **DROP TABLE语句格式**:

  DROP TABLE <表名> [RESTRICT | CASCADE];

2. **删除操作的说明**:
    - **RESTRICT**:有条件地删除基本表。基本表不应被其他表的约束(如`CHECK`, `FOREIGN KEY`等)、视图、触发器、存储过程或函数等引用。存在这些依赖关系时,表不能被删除。
    - **CASCADE**:无条件地删除基本表。在删除基本表时,所有依赖的对象,如视图,都将一同被删除。
    - 默认行为是`RESTRICT`。

3. **示例与注意事项**:
    - **例3.11**:删除`Student`表并级联删除相关对象。
   

    DROP TABLE Student CASCADE;


        执行此操作时需特别小心,因为删除基本表不仅会删除表中的数据和表的定义,还会删除与其相关的索引、触发器等。如果被其他表引用,那些表可能也会被删除。
    - **例3.12**:如果基本表上有视图,使用`RESTRICT`时不能删除表;使用`CASCADE`时,表和视图都会被删除。
     

     CREATE VIEW IS_Student ASSELECT Sno, Sname, Sage FROM Student WHERE Sdept = 'IS';DROP TABLE Student RESTRICT;  // ErrorDROP TABLE Student CASCADE;  // Deletes both table and view

4. **不同数据库产品的处理差异**:
    - 不同的数据库系统在执行`DROP TABLE`操作时的处理策略可能会有所不同。
    - 对比`SQL2011`标准与`Kingbase ES`, `Oracle 12c`, 和`MS SQL Server 2012`:
        - **索引**:删除基本表后,所有三种数据库都会自动删除该表的索引。
        - **视图**:`Oracle 12c`和`SQL Server 2012`在删除基本表后保留视图,但它们将失效。`Kingbase ES`根据是否使用`RESTRICT`或`CASCADE`来决定是否删除视图。
        - **存储过程和函数**:三种数据库产品在删除基本表后都不会删除与之相关的存储过程和函数,但它们将失效。

5. **总结**:在删除基本表时,需要了解数据库产品的特定行为和处理策略。虽然SQL提供了标准化的语言和指令,但具体的执行和实现可能因数据库系统而异。在进行任何操作之前,建议备份数据库并了解可能的副作用。

 

 

 

 

 总结:

**数据定义:重点、难点、易错点及使用技巧**

---

### 1. 重点:

- **数据结构定义**:使用`CREATE`语句创建数据库、表、视图、索引等。
- **数据约束**:理解并应用主键 (`PRIMARY KEY`)、外键 (`FOREIGN KEY`)、唯一约束 (`UNIQUE`)、检查约束 (`CHECK`) 等。
- **修改结构**:使用`ALTER`语句来更改现有的数据库结构。
- **删除结构**:使用`DROP`语句删除数据库、表、视图等。

### 2. 难点:

- **约束的理解与应用**:如何正确地使用和区分不同的数据约束,特别是外键约束和`ON DELETE`、`ON UPDATE`的级联操作。
- **规范化**:如何进行数据库设计的规范化以减少数据冗余和避免更新异常。
- **视图与基本表的关系**:如何处理视图与基本表之间的依赖关系,特别是在修改或删除时。

### 3. 易错点:

- **忘记约束**:创建表时忽略某些重要的约束条件,例如唯一约束或非空约束。
- **数据类型不匹配**:定义列或变量时选择了错误的数据类型。
- **删除操作**:使用`DROP`或`DELETE`语句时不小心删除了重要的数据或结构。
- **修改列的属性**:使用`ALTER`语句修改列属性时可能导致数据丢失或类型不匹配。

### 4. 使用技巧:

- **逐步设计**:在设计数据库结构时,先从大的框架开始,逐步细化。这样可以确保整体结构的一致性。
- **经常备份**:在进行任何结构性修改前,如使用`DROP`或`ALTER`语句,务必备份数据。
- **利用工具**:使用数据库设计工具或ER图工具帮助理解和设计数据库结构。
- **测试与验证**:在应用更改到生产环境之前,首先在测试环境中进行测试,确保操作没有问题。
- **文档化**:为数据库设计和每个表、视图、索引等编写详细的文档。这有助于后续的维护和团队协作。
- **理解SQL标准与特定的数据库差异**:不同的数据库系统在处理某些SQL操作时可能有所不同,所以了解和掌握这些差异是很重要的。

总的来说,数据定义是数据库设计和维护的基石,需要深入理解并小心操作,避免可能的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132128.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】WebUI自动化—Selenium的下载和安装、基本用法、项目实战(16)

文章目录 一.介绍二.下载安装selenium三.安装浏览器驱动四.QuickStart—自动访问百度五.Selenium基本用法1.定位节点1.1.单个元素定位1.2.多个元素定位 2.控制浏览器2.1.设置浏览器窗口大小、位置2.2.浏览器前进、刷新、后退、关闭3.3.等待3.4.Frame3.5.多窗口3.6.元素定位不到…

【opencv】windows10下opencv4.8.0-cuda C++版本源码编译教程

【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程前言准备工具cuda/cudnncmakeopencv4.8.0opencv_contrib CMake编译VS2019编…

【Spring Boot从入门到实战】RabbitMQ消息队列 —— RabbitMQ入门

💠一名热衷于分享知识的程序员 💠乐于在CSDN上与广大开发者交流学习。 💠希望通过每一次学习,让更多读者了解我 💠也希望能结识更多志同道合的朋友。 💠将继续努力,不断提升自己的专业技能,创造更多价值。🌿欢迎来到@"衍生星球"的CSDN博文🌿 🍁本…

antd Form shouldUpdate 关联展示 form 数组赋值

form 数组中嵌套数值更新 注意&#xff1a;数组是引用类型 项目需求&#xff0c;表单中包含多个产品信息&#xff0c;使用form.list 数组嵌套&#xff0c;提货方式如果是邮寄展示地址&#xff0c;如果是自提&#xff0c;需要在该条目中增加两项 代码如下&#xff1a;// An hi…

在Linux怎么用vim实现把一个文件里面的文本复制到另一个文件里面

2023年10月9日&#xff0c;周一下午 我昨天遇到了这个问题&#xff0c;但在网上没找到图文并茂的博客&#xff0c;于是我自己摸索出解决办法后&#xff0c;决定写一篇图文并茂的博客。 情景 假设现在我要用vim把file_transfer.cpp的内容复制到file_transfer.hpp里面 第一步 …

如何判断直流回馈老化测试负载是否合格?

直流回馈老化测试负载的合格与否&#xff0c;可以通过测试负载在长时间工作过程中&#xff0c;其输出电流应保持稳定。监测负载输出电流的波动情况来判断&#xff0c;波动范围越小越好。 测试负载在工作过程中会产生热量&#xff0c;因此需要关注其温度升高情况&#xff0c;负载…

知识付费H5页面+后端+全功能制作源码系统

罗峰今天给大家要分享的是知识付费H5页面制作的源码系统&#xff0c;H5也是一种响应式界面&#xff0c;能自动兼容所有的打开设备屏幕&#xff0c;使得页面在不同尺寸的手机、平板等设备上打开时&#xff0c;界面也会自动兼容适应。这也是大部分用户选择H5页面的原因&#xff0…

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输…

语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆

文章目录 mask图像介绍步骤代码 mask图像介绍 根据 mask 图像来画分割对象的外接椭圆是一种常见的图像分割任务。Mask 图像通常是一个二值图像&#xff0c;其中包含了感兴趣对象的像素。通常情况下&#xff0c;白色像素表示对象&#xff0c;黑色像素表示背景。 步骤 以下是一…

Linux知识点 -- 网络基础 -- 数据链路层

Linux知识点 – 网络基础 – 数据链路层 文章目录 Linux知识点 -- 网络基础 -- 数据链路层一、数据链路层1.以太网2.以太网帧格式3.重谈局域网原理4.MAC地址5.MTU6.查看硬件地址和MTU的命令7.ARP协议 二、其他重要协议或技术1.DNS&#xff08;Domain Name System&#xff09;2.…

MySQL 面试知识脑图 初高级知识点

脑图下载地址&#xff1a;https://mm.edrawsoft.cn/mobile-share/index.html?uuid18b10870122586-src&share_type1 sql_mode 基本语法及校验规则 ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作&#xff0c;如果在SELECT中的列&#xff0c;没有在GROUP BY中出现&#xff…

什么是指标体系,怎么搭建一套完整的指标体系?(附PDF素材)

什么是指标体系&#xff0c;怎么搭建一套完整的指标体系&#xff1f;数字化转型过程中&#xff0c;这个问题一直困扰着数据分析师。主要体现在&#xff1a; 各部门根据业务需求&#xff0c;都有一部分量化指标&#xff0c;但不够全面&#xff0c;对企业整体数据分析应用能力提…