SQL连接问题

SQL连接问题,sql,join,Sql,Join,我将连接多个具有相同列的表,是否仍有这样的设置,以便不需要特定的表前缀 或者我被困在使用select a._id,b._id…z._id?当然,对于SQL Server,您必须指定它,以便查询不会含糊不清-恐怕被困了 否。如果列具有相同的名称,则数据库软件需要能够以某种方式区分它们 在标准SQL中,必须为列添加前缀 不过,其他SQL方言可能提供此功能。例如,在Postgresql中: create table t1(id integer not null, t1 text not null);

我将连接多个具有相同列的表,是否仍有这样的设置,以便不需要特定的表前缀


或者我被困在使用select a._id,b._id…z._id?

当然,对于SQL Server,您必须指定它,以便查询不会含糊不清-恐怕被困了

否。如果列具有相同的名称,则数据库软件需要能够以某种方式区分它们

在标准SQL中,必须为列添加前缀

不过,其他SQL方言可能提供此功能。例如,在Postgresql中:

create table t1(id integer not null, t1 text not null);
create table t2(id integer not null, t2 text not null);

select id, t1, t2 from t1 join t2 using (id);

在这里,id不必加前缀,因为它在联接中使用。

通常,是的,您必须限定每个重复的列名。我假设你不想这样做来避免额外的打字;实现这一点的一种方法是使用表别名,即
从mylongtablename a、myotherlongtablename b中选择a.id、b.id…

如果列名的限定确实有那么大的问题,您可以通过在一个或多个表周围定义一个视图并使用别名作为表名来解决。但是,这只会使查询中的逻辑更难查看,因此我当然不推荐这样做

长话短说:处理额外的键入和列名前缀;它将使您的查询在将来更易于阅读和维护。

在某些RDBMS(如Oracle)中,您可以使用
加入。。。使用…
表单。 例如:

select id, col1, col2 from table1 a join table2 b using (id)
几乎相当于:

select a.id, col1, col2 from table1 a join table2 b on a.id = b.id
但是:

  • 加入。。。使用
    的行为不同于加入。。。在…上。 最重要的是,不能在using()中对列使用显式前缀

    在上面的示例中,您不能使用a.id或b.id。 所以,如果第三个表的列id是不相关的,那么它可能会变得更复杂 到表1和表2 id

  • 许多系统没有它(例如SQL Server),因此代码的可移植性较差

  • 许多人(包括我)更喜欢在列中使用显式表别名 为清晰起见,避免以后编辑查询时出错。 我只是在表格中使用简短的别名,并接受它


不,我不认为有任何方法可以停止使用您提到的列名或其前缀,一件事是您可以为列名添加别名,但这对您来说需要做更多的工作。检查最佳解决方法。

表别名的重要性(从整体上看)

1) 如果您必须一次又一次地引用表(或视图)(表别名),则可以方便地使用一种速记符号。它比每次键入完整的表名容易得多

e、 g

可以重新表述为

select a.col1 , a.Col2,b.Col1,c.Col2 
from  tableA a
join tableB  b
on a.id = b.id
join tableC c
on c.id = b.id
and c.id = a.id
2) 消除列名的歧义

3) 提高代码可重用性

4) 假设您有一个派生表,如

SELECT col1,col2
FROM (select *
      from mytable
      where col3 = 'somevalue') x
在这种情况下,必须使用别名

注意:-

列别名表示列的全名

e、 g.
从mytable中选择平均值(col1)

它的输出为

[No Column Name]
-----------------
30
可以美化

select avg(col1) "Average" from mytable

输出:

Avegare
-------------
30
但是,AS关键字是可选的


希望这能让您了解为什么我们应该使用表别名

您可以通过使用on而不是编写列名来节省在连接上键入的时间

SELECT a._id, b._id FROM table1 a JOIN table2 b
ON _id

在我看来,这就像是的候选人,例如:

SELECT *
FROM   employee NATURAL JOIN department
有关详细信息,请参阅本文“”

引述:

自然连接关键字指定 该属性的值将 这两个表之间是匹配的 姓名相符者;非常 极少数例外情况下,这些将是 pk/fk属性,它们必须 具有匹配的数据类型(和域) 还有

警告:根据您的RDBMS,自然连接语法可能受支持,也可能不受支持。 以下是一些确实支持它的人:


被困?没有它,您的查询将变得模棱两可,更难调试,其他人也更难遵循。如果我有足够多的表使键入变得困难,我会编写一些代码来为我生成SQL。除非您通过Twitter传递SQL,否则长度并不是一个真正的问题。在我看来,任何时候加入查询时,您都应该在查询中的所有字段前面加上它们来自的表别名。这大大提高了可读性和可维护性。当您在C/C++/C#/Java/etc中有2+个对象实例时,您必须参考特定的实例—SQL也一样。表别名一直都很好使用。这取决于您使用的RDBMS。你的问题没有具体说明。
SELECT a._id, b._id FROM table1 a JOIN table2 b
ON _id
SELECT *
FROM   employee NATURAL JOIN department