我对SQL很陌生。我读过一本书,书名为“Sams Teach Yourself /SQL in 10分钟”。我发现它很有趣,很容易理解。有一些关于别名的信息,但当我开始做练习时,我偶然发现了一个别名,我不知道它的用途。
这里是cite http://www.sql-ex.ru/,这里是数据库模式1,以防万一。我正在计算机公司的数据库中工作,即1号数据库。任务是:
将寻找生产个人电脑但不生产笔记本电脑的制造商。
以下是解决方案之一:
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‘?
发布于 2018-07-30 13:47:09
您将访问表两次,一次在主查询中,一次在子查询中。
在主要查询中,您会说:查看每条记录。如果类型不等于“PC”,则拒绝它。如果您在表中找到同一台带有“膝上型电脑”类型的制造商的记录,请不予理会。
为了请求相同的maker,必须将主查询记录的制造者与子查询的记录进行比较。这两个表都来自同一个表,因此where product.maker = product.maker将是模糊的。(或者更确切地说,DBMS会假设您在谈论子查询记录,因为表达式在子查询中。因此,where product.maker = product.maker是正确的,您将只检查表中是否至少有一台膝上型计算机,而不管制造商是谁。)
因此,当在查询中两次处理同一个表时,至少给它们一个别名,以便区分一个记录和另一个记录。
无论如何,对于给定的查询,我还将表达式中的另一列限定为可读性:
AND product.maker = pcproduct.maker甚至是
FROM Product laptopproduct
WHERE type = 'laptop'
AND laptopproduct.maker = pcproduct.maker在一个侧面:查询寻找的制造商生产个人电脑,但没有笔记本电脑。我更愿意用聚合的方式来要求这个:
select maker
from product
group by maker
having sum(type = 'PC') > 0
and sum(type = 'laptop') = 0;发布于 2018-07-30 12:01:38
因为在内部查询中有列,它们的名称与外部查询中的列完全相同(因为您在那里使用相同的表)。
由于外部查询列在内部查询中是可用的,因此必须有一个区别,即您希望在没有别名的情况下,在内部查询maker = maker中写入哪一列,这将始终是正确的。
发布于 2018-07-30 12:21:32
该查询可理解为:
给我的制造商,有‘个人电脑’类型的产品,但在‘笔记本’类型的产品不存在的制造商。
当在多个表中使用相同的列名时,有时需要包含表名或别名。
这样优化器就可以知道从哪个表中使用了该列。
并不是某些聪明的人工智能能猜到
WHERE x = x
实际上意味着
WHERE table1.x = table2.x
但更多的情况是,使用较短的别名。
以增加可读性并使SQL更加简洁。
例如。以下两个查询是等价的。
没有别名:
SELECT myawesometableone.id, mysecondevenmoreawesometable.id,
mysecondevenmoreawesometable.col1
FROM myawesometableone
JOIN mysecondevenmoreawesometable on mysecondevenmoreawesometable.one_id = myawesometableone.id加上别名:
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呢?
存在的语法就是这样工作的。
在现有查询和外部查询之间建立一个链接。
在这种情况下,这个链接就是“制造者”栏。
https://stackoverflow.com/questions/51593399
复制相似问题