《SQL与关系数据库理论——如何编写健壮的SQL代码》一一2.5 标量类型vs.非标量类型...

本文探讨了SQL和关系数据库理论中的标量类型与非标量类型概念,强调了标量类型(如整数)和非标量类型(如元组和关系)的区分,并通过 Tutorial D 示例解释了关系变量的定义及其类型生成器的用法。关系模型并不严格依赖于标量与非标量的区分,但在理解和编程中非常有用。同时,文中指出元组和关系的物理存储方式对用户是透明的,确保了物理数据独立性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第2章 ,第2.5节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 标量类型vs.非标量类型

通常,都会认为类型不是标量的就是非标量的。换言之,如果一个类型没有用户可见的分量,那么它就是标量的;否则它就是非标量的。某个类型T的值、变量、属性、运算符、参数及表达式是否是标量的,取决于类型T本身是否是标量的。例如:

  • 整数类型是标量类型,因此,整数类型的值、变量等也都是标量的,即它们没有用户可见分量。
  • 元组和关系类型是非标量的(相关的用户可见分量是对应的属性)。因此,元组和关系值、变量等也都是非标量的。

必须强调,这些概念是相当不严格的。实际上,我们已经看到数据值原子性的概念本就没有什么绝对的含义,那么“标量”本身也只不过是同一概念的另一名称罢了。因此,在任何正式意义上,关系模型都不会依赖于标量与非标量的区别。然而,在本书中要非正式地依赖它。我发现它直观上非常有用。具体说,对于既不是元组也不是关系的类型,使用术语标量;而对于元组或关系类型,使用术语非标量。注12
旁注:你有时会听到另一个表示“标量”的术语是封装(encapsulation)。然而要小心,这个术语也被(尤其在对象上下文中)用来指对代码和数据(更准确地是运算符定义和数据表示定义)的物理捆绑或打包。但是若使用了后面这种意义,就混淆了模型和实现,显然用户并不关心也不必关心代码和数据到底是物理绑定在一起的还是分离的。
我们来看一个例子。下面是Tutorial D对于基关系变量 S(supplier)的定义。注意,为了简化,我将所有的属性都定义为某种系统定义类型:

1.     VAR S BASE
2.         RELATION { SNO CHAR , SNAME CHAR , STATUS INTEGER , CITY CHAR }
3.       
### Oracle 数据库标量数据类型 #### 定义 在 Oracle 数据库中,标量(SCALAR)数据类型表示单个值而不是一组或多组值。这些类型用于定义表列以及 PL/SQL 变量、常量和参数。合法的标量类型不仅限于数据库列所使用的标准 SQL 类型,还包括一些特定于 Oracle 的扩展[^1]。 常见的标量数据类型有: - **NUMBER(p,s)**:存储固定或浮点数。 - **VARCHAR2(size)** 和 **CHAR(size)**:分别用于可变长度字符串和定长字符数据。 - **DATE**:日期时间戳信息。 - **RAW(size)** 和 **LONG RAW**:原始字节数据。 - **BLOB**, **CLOB**, **NCLOB**: 大对象 (Large Object),其中 BLOB 表示二进制大对象而 CLOB 则指字符大对象。 - **BOOLEAN** (仅限 PL/SQL): 布尔逻辑值 true 或 false[^3]。 #### 使用方法 ##### 创建表格时使用标量类型 当创建新表时,可以通过指定相应的标量类型来设置每一列的数据格式。例如: ```sql CREATE TABLE employees ( id NUMBER PRIMARY KEY, name VARCHAR2(50), hire_date DATE, salary NUMBER(8, 2) ); ``` 上述语句定义了一个名为 `employees` 的表,其中包括四个字段——员工编号 (`id`) 是一个数字;姓名 (`name`) 是最多包含 50 个字符的字符串;入职日期 (`hire_date`) 存储为日期;薪水 (`salary`) 被设定成具有两位小数精度的数值。 ##### 在 PL/SQL 中声明变量 除了应用于表结构外,在编写 PL/SQL 程序单元如过程、函数或触发器期间也可以利用这些基本数据类型来进行局部变量声明: ```plsql DECLARE v_employee_id EMPLOYEES.ID%TYPE; -- 绑定到现有表列类型 v_first_name VARCHAR2(30); -- 明确给出大小限制 BEGIN SELECT e.id INTO v_employee_id FROM employees e WHERE rownum = 1; END; / ``` 这段代码展示了如何基于已存在的表列类型 `%TYPE` 来声明一个新的同名但不同作用域内的变量 `v_employee_id`, 同时也直接设定了另一个字符串类型的本地变量 `v_first_name`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值