web-dev-qa-db-ja.com

テーブルのエイリアスは悪い習慣ですか?

マスターオブインフォメーションサービスの学生向けのDBMSコースでこれを学ぶことを覚えています。入力を節約するために、次のように入力できます。

SELECT t1.id, t2.stuff 
FROM 
              someTable    t1 
   INNER JOIN otherTable   t2 
      ON t1.id=t2.id
;

しかし...なぜこれがストアドプロシージャなどで受け入れられるのでしょうか。非常にわずかな時間を節約しながら、ステートメントの読みやすさを損なうだけのようです。これを行う機能的または論理的な理由はありますか?削除するのではなく、あいまいさを追加するようです。この形式を使用するために私が見ることができる唯一の許容できる理由は、意味的に意味のあるエイリアスを追加しているかどうかです。たとえば、FROM someTable idsTable-テーブル名が十分に説明的でない場合。

テーブルのエイリアシングは悪い習慣ですか、それとも有用なシステムの誤用ですか?

21
Ben Brocka

テーブルのエイリアスは、一般的で役立つプラクティスです。

  • キーストロークを節約できますクエリ内の任意の場所で列を参照する場合。
  • 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
;
39
Nick Chammas

エイリアスを使用すると、テーブル名が長い場合や、テーブル名が互いに類似している場合に、テーブルをすばやく読んだ人がそれらを間違える可能性がある場合に、クエリが読みやすくなると思います。これは...

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' 

これより読みやすいですか?

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' 

テーブルエイリアスとして何を使用するかに応じて、クエリをより簡単に読んで理解してもらうことができます。

12
Jason

テーブルのエイリアス(テーブル名を短くするため)は悪い習慣ではありません。

私は通常、テーブル名が長いときに使用し、意味のあるエイリアスのみを使用します。

SELECT tTable.stuff FROM track_table tTable;

読みやすくする場合は、ASキーワードを使用できます。

SELECT tTable.stuff FROM track_table AS tTable;

ただし、構文に慣れれば必要ありません。

5
Derek Downey

これを使用して、クエリの可読性を大幅に向上させることができます。短いエイリアスを使用するのではなく、エイリアスを使用して、参加するデータを記述します。たとえば、

SELECT
    transaction.unique_id,
    authorisingUser.name AS authorising_user_name,
    requestingUser.name AS requesting_user_name
FROM transactions AS transaction
JOIN users AS authorisingUser
    ON authorisingUser.user_id = txn.authorising_user_id
JOIN users AS requestingUser
    ON requestingUser.user_id = txn.request_user_id

非常に短いエイリアス(at1など)を使用すると、エイリアスの意味を調べるためにエイリアスを検索する必要があるため、クエリが読みにくくなる可能性がありますが、適切な名前のエイリアスを使用できます多くの場合、テーブル名を使用するよりもクエリを読みやすくします。

0
Justin