首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解SQL别名

理解SQL别名
EN

Stack Overflow用户
提问于 2018-07-30 11:53:34
回答 4查看 141关注 0票数 1

我对SQL很陌生。我读过一本书,书名为“Sams Teach Yourself /SQL in 10分钟”。我发现它很有趣,很容易理解。有一些关于别名的信息,但当我开始做练习时,我偶然发现了一个别名,我不知道它的用途。

这里是cite http://www.sql-ex.ru/,这里是数据库模式1,以防万一。我正在计算机公司的数据库中工作,即1号数据库。任务是:

将寻找生产个人电脑但不生产笔记本电脑的制造商。

以下是解决方案之一:

代码语言:javascript
复制
SELECT DISTINCT maker
           FROM Product AS pcproduct
          WHERE type = 'PC' 
            AND NOT EXISTS (SELECT maker
                              FROM Product
                             WHERE type = 'laptop' 
                               AND maker = pcproduct.maker
                           );

问题是:为什么需要将产品化名为pc_product,并在子查询中进行比较'maker = pc_product.maker‘?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-30 13:47:09

您将访问表两次,一次在主查询中,一次在子查询中。

在主要查询中,您会说:查看每条记录。如果类型不等于“PC”,则拒绝它。如果您在表中找到同一台带有“膝上型电脑”类型的制造商的记录,请不予理会。

为了请求相同的maker,必须将主查询记录的制造者与子查询的记录进行比较。这两个表都来自同一个表,因此where product.maker = product.maker将是模糊的。(或者更确切地说,DBMS会假设您在谈论子查询记录,因为表达式在子查询中。因此,where product.maker = product.maker是正确的,您将只检查表中是否至少有一台膝上型计算机,而不管制造商是谁。)

因此,当在查询中两次处理同一个表时,至少给它们一个别名,以便区分一个记录和另一个记录。

无论如何,对于给定的查询,我还将表达式中的另一列限定为可读性:

代码语言:javascript
复制
AND product.maker = pcproduct.maker

甚至是

代码语言:javascript
复制
 FROM Product laptopproduct
WHERE type = 'laptop' 
  AND laptopproduct.maker = pcproduct.maker

在一个侧面:查询寻找的制造商生产个人电脑,但没有笔记本电脑。我更愿意用聚合的方式来要求这个:

代码语言:javascript
复制
select maker
from product
group by maker
having sum(type = 'PC') > 0
   and sum(type = 'laptop') = 0;
票数 2
EN

Stack Overflow用户

发布于 2018-07-30 12:01:38

因为在内部查询中有列,它们的名称与外部查询中的列完全相同(因为您在那里使用相同的表)。

由于外部查询列在内部查询中是可用的,因此必须有一个区别,即您希望在没有别名的情况下,在内部查询maker = maker中写入哪一列,这将始终是正确的。

票数 3
EN

Stack Overflow用户

发布于 2018-07-30 12:21:32

该查询可理解为:

给我的制造商,有‘个人电脑’类型的产品,但在‘笔记本’类型的产品不存在的制造商。

当在多个表中使用相同的列名时,有时需要包含表名或别名。

这样优化器就可以知道从哪个表中使用了该列。

并不是某些聪明的人工智能能猜到

WHERE x = x

实际上意味着

WHERE table1.x = table2.x

但更多的情况是,使用较短的别名。

以增加可读性并使SQL更加简洁。

例如。以下两个查询是等价的。

没有别名:

代码语言:javascript
复制
SELECT myawesometableone.id, mysecondevenmoreawesometable.id, 
       mysecondevenmoreawesometable.col1
FROM myawesometableone
JOIN mysecondevenmoreawesometable on mysecondevenmoreawesometable.one_id = myawesometableone.id

加上别名:

代码语言:javascript
复制
SELECT t1.id, t2.id, t2.col1
FROM myawesometableone AS t1
JOIN mysecondevenmoreawesometable AS t2 on t2.one_id = t1.id

您认为哪一种SQL更好看?

至于为什么在存在的内部使用maker = pc_product.maker呢?

存在的语法就是这样工作的。

在现有查询和外部查询之间建立一个链接。

在这种情况下,这个链接就是“制造者”栏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51593399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档