表别名是不好的做法吗?

Ben*_*cka 24 best-practices stored-procedures naming-convention

我记得在为信息服务硕士学生开设的 DBMS 课程中学习过这样做。为了节省一些输入,您可以输入:

SELECT t1.id, t2.stuff 
FROM 
              someTable    t1 
   INNER JOIN otherTable   t2 
      ON t1.id=t2.id
;
Run Code Online (Sandbox Code Playgroud)

但是......为什么这在存储过程等中是可以接受的?似乎它所做的只是损害了语句的可读性,同时节省了极少的时间。这样做是否有任何功能或逻辑原因?它似乎增加了歧义而不是消除它;我可以看到使用这种格式的唯一可接受的原因是,如果您添加了一个语义上有意义的别名——例如FROM someTable idsTable——当表名不够描述时。

表别名是不好的做法还是只是滥用有用的系统?

Nic*_*mas 39

表别名是一种常见且有用的做法。

  • 在查询中的任何位置引用列时,它可以节省您的击键次数
  • 当您引用许多表时,它提高了 SQL 的可读性。别名让您可以为这些表指定一个简短的名称,并说明它们的使用方式。
  • 当您将一个表连接到自身或多次连接到同一个表时,它甚至是必需的。这样查询优化器就知道当您提到一列时您正在引用哪个表。

以下报告摘录很好地说明了上述所有要点:

INSERT INTO reporting.txns_extract
SELECT 
    -- 30+ columns snipped
    -- 
    -- Would you want to type out full table names for each 
    -- column here?
FROM 
    -- ... and in the JOIN conditions here?
                billing.financial_transactions  ft_cdi   -- alias required here
    INNER JOIN  
                billing.cash_application_links  cal
            ON  ft_cdi.key_num = cal.applied_ft_key_num
    INNER JOIN  
                billing.financial_transactions  ft_pmt   -- alias required here
            ON  cal.owner_key_num = ft_pmt.key_num
    LEFT OUTER JOIN
                billing.invoice_lines           invl
            ON  ft_cdi.key_num = invl.invoice_key_num
    LEFT OUTER JOIN
                billing.charges                 chrg
            ON  invl.creator_key_num = chrg.key_num
    LEFT OUTER JOIN
                billing.customer_services       cs
            ON  chrg.cs_key_num = cs.key_num
    INNER JOIN
                billing.billers                 bil
            ON  ft_cdi.biller_account_key_num = bil.biller_account_key_num
    INNER JOIN
                billing.formal_entities         fe
            ON  bil.frml_key_num = fe.key_num
WHERE
    -- ... and in the WHERE conditions here?
        ft_cdi.transaction_type <> 'Payment'   -- alias tells me this table is not for payments
    AND ft_cdi.status = 'Approved'
    AND ft_pmt.transaction_type =  'Payment'   -- alias tells me this table is for payments
    AND ft_pmt.status = 'Approved'
    AND ft_cdi.last_user_date >   ft_last_user_date_begin
    AND ft_cdi.last_user_date <=  ft_last_user_date_end
;
Run Code Online (Sandbox Code Playgroud)

  • 我衷心推荐有意义的别名。看到一个带有有意义的别名而不是 t1、t2... 或 a、b、b、c、d、e 的示例真是太好了。 ,账户 c,计费 d,客户 e。 (7认同)
  • 我认为在每个列引用上使用别名也很重要,以便更容易维护。确定只有一张表有名为 xyzjunk 的字段,但是是哪一张呢?当您编写复杂的报告查询时,始终知道您的字段是从哪里形成的会很有帮助。 (4认同)
  • 对于编写和阅读了大量 SQL 的人来说,别名更具可读性。对于新的数据库开发人员来说,它们的可读性较差,但我认为这是他们迟早必须清除的障碍。 (2认同)

Jas*_*son 12

我认为使用别名有助于查询的可读性,如果表名很长或彼此非常相似,以至于有人快速阅读它可能会误认为它们。你觉得这...

SELECT Really_long_table_name.ID,
       Even_longer_table_name_than_before.Name,
       Even_longer_table_name_than_before.Description,
       Even_longer_table_name_than_before.State
FROM   Really_long_table_name
       INNER JOIN Even_longer_table_name_than_before
               ON Really_long_table_name.ID = Even_longer_table_name_than_before.ID
WHERE  Really_long_table_name.Department = 'Whatever' 
Run Code Online (Sandbox Code Playgroud)

比这更具可读性吗?

SELECT a.ID,
       b.Name,
       b.Description,
       b.State
FROM   Really_long_table_name a
       INNER JOIN Even_longer_table_name_than_before b
               ON a.ID = b.ID
WHERE  a.Department = 'Whatever' 
Run Code Online (Sandbox Code Playgroud)

根据您用作表别名的内容,它可以使查询更易于人们阅读和理解。

  • 我总是想追捕并杀死那些没有为他们的表设置别名的开发人员(不是字面上的)。第一个例子让我眼睛流血。不知何故,当他们这样做时,他们不会编写他们的代码,这样我也可以在不滚动的情况下查看它(就像你所做的那样)。 (2认同)

Der*_*ney 5

表别名(为了更短的表名)是不错的做法。

我通常在表名很长时使用它,然后只使用有意义的别名:

SELECT tTable.stuff FROM track_table tTable;
Run Code Online (Sandbox Code Playgroud)

如果要提高可读性,可以使用AS关键字:

SELECT tTable.stuff FROM track_table AS tTable;
Run Code Online (Sandbox Code Playgroud)

但是,当您习惯了语法时,就不需要了。