《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.9 SQL中的列命名

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

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

3.9 SQL中的列命名

在关系模型中:(a)所有关系的所有属性都有名称(即不允许有匿名属性);(b)在相关的关系中属性名称都是唯一的(即不允许有重复属性名)。在SQL中,有时会执行类似的规则,但并不总是执行。具体说,规则在表恰好是通过CREATE TABLE和CREATE VIEW定义的表变量的当前值时被执行,但是对于表是某些表达式的返回结果的情况则不执行。注10强烈建议:只要有必要(且可能),就要使用AS子句给列取恰当的列名,否则就会根本没有名字或者会有不唯一的名字。下面是些示例:

SELECT DISTINCT SNAME , 'Supplier' AS TAG 
FROM   S

SELECT DISTINCT SNAME , 2 * STATUS AS DOUBLE_STATUS 
FROM   S

SELECT MAX ( WEIGHT ) AS MBW 
FROM   P
WHERE  COLOR = 'Blue'

CREATE VIEW SDS AS
     ( SELECT DISTINCT SNAME , 2 * STATUS AS DOUBLE_STATUS
       FROM   S ) ;

SELECT DISTINCT S.CITY AS SCITY , P.CITY AS PCITY 
FROM   S , SP , P
WHERE  S.SNO = SP.SNO 
AND    SP.PNO = P.PNO

SELECT TEMP.*
FROM ( SELECT * FROM S JOIN P ON S.CITY > P.CITY ) AS TEMP
     ( SNO , SNAME , STATUS , SCITY ,
       PNO , PNAME , COLOR , WEIGHT , PCITY )

当然,如果不用引用匿名列或非唯一命名列,前面的建议也可以忽略。比如,第3个示例在某些场合(可能在WHERE或HAVING子句中)可以安全缩写为:

SELECT MAX ( WEIGHT ) 
FROM   P
WHERE  COLOR = 'Blue'

更重要的是,这个建议在用VALUES表达式指定表时根本不使用。然而,这是可以变通的。比如下面的示例就是合法的。

SELECT TEMP.*
FROM ( VALUES ( 'S1' , 'Smith' , 20 , 'London' ) ,
              ( 'S2' , 'Jones' , 10 , 'Paris'  ) ,
              ( 'S3' , 'Blake' , 30 , 'Paris'  ) ,
              ( 'S4' , 'Clark' , 20 , 'London' ) ,
              ( 'S5' , 'Adams' , 30 , 'Athens' ) )
       AS TEMP ( SNO , SNAME , STATUS , CITY )

解释:我把VALUES表达式套在括号中(也因此使其成为子查询),附加了一个AS子句,并指定了列名以及AS子句中的“相关名称”(参见第12章)。
重要提醒:关系代数的运算符在很多方面依赖于正确的属性命名。比如,(在第6章中会看到)关系UNION运算要求其运算元具有相同的标题(也就是相同的属性名),而结果也具有相同的标题。此种模式的好处之一就是避免了位置依赖所导致的复杂性(在SQL中存在)!因此,为了关系化地使用SQL,应该对那些关系运算在SQL中的类比项也应用相同的规则。强烈建议:作为执行此规则的前置条件,如果SQL中的两列表示“同种类型的信息”,无论如何也要尽可能给它们同一名称(作为例子,这也是为什么suppliers-and-parts数据库示例中两个供应商编号列都叫SNO,而不是在一个表中叫SNO,在另一个表中叫SNR)。相反的,如果两个列代表不同类型的信息,那么给它们不同的名称通常是个好主意。
唯一会导致无法适用前面建议的情况是,两个列在同一个表中,表示同种类型的信息。比如,考虑一个SQL表EMP包含了代表员工编号的列和代表经理编号的列,其中经理编号本身也是员工编号。这两个列必须使用不同的名称,即ENO和MNO。结果是,有时不得不做列重命名,如下例所示(注意在第3行中的声明“ENO AS MNO”):

( SELECT ENO , MNO FROM EMP ) AS TEMP1
  NATURAL JOIN
( SELECT ENO AS MNO , ... FROM EMP ) AS TEMP2
/* “...” 为EMP表中除ENO和MNO之外的列 */

如果原先就没有对列恰当命名,而你又想关系化地使用SQL,那么就必须做此类重命名了(比如,你面对的是别人定义的数据库,这无疑是实践中的常见情况)。此种情况下你可以考虑如下策略:
为数据库中的每个表T定义与表T相同(除了要对某些列的重命名之外)的视图V。
确保所有视图定义都遵循前述列命名规则。
对视图而不是底层的基表进行运算。
不幸的是,要想完全忽略“SQL中的列具有排序位置”这一事实是不可能的。(当然,就是因为这一事实SQL才能处理匿名列和重复列名。)尤其要注意,SQL中的列在不需要排序的时候仍然具有排序位置(即当它们都正确命名的情况);此点特别适用于基表中的列和视图。强烈建议:不要编写依赖于位置的SQL代码。SQL强调要用这种定位的例子包括(但可能不限于):
SELECT *(参见第12章);
FROM子句,在指定多个表时;
显式JOIN运算(参见第6章);
UNION、INTERSECT和EXCEPT运算,在没有指定CORRESPONDING时(参见第6章);
在范围变量定义中指定的列名列表中(参见第12章);
在CREATE VIEW中指定的列名列表(参见第9章);
没有指定列名列表的INSERT(参见第5章);
VALUES表达式;
行赋值和比较;
ALL和ANY比较,在比较元的度大于1时(参见第11章)。

相关文章
|
13天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
30天前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
90 0
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
78 6
|
2天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
9天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
9天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
35 3
|
12天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
45 0
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
21天前
|
数据库 SQL 索引
什么是数据库 SQL Execution Plan
什么是数据库 SQL Execution Plan
11 0
|
1月前
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移

热门文章

最新文章