マスターオブインフォメーションサービスの学生向けのDBMSコースでこれを学ぶことを覚えています。入力を節約するために、次のように入力できます。
SELECT t1.id, t2.stuff
FROM
someTable t1
INNER JOIN otherTable t2
ON t1.id=t2.id
;
しかし...なぜこれがストアドプロシージャなどで受け入れられるのでしょうか。非常にわずかな時間を節約しながら、ステートメントの読みやすさを損なうだけのようです。これを行う機能的または論理的な理由はありますか?削除するのではなく、あいまいさを追加するようです。この形式を使用するために私が見ることができる唯一の許容できる理由は、意味的に意味のあるエイリアスを追加しているかどうかです。たとえば、FROM someTable idsTable
-テーブル名が十分に説明的でない場合。
テーブルのエイリアシングは悪い習慣ですか、それとも有用なシステムの誤用ですか?
テーブルのエイリアスは、一般的で役立つプラクティスです。
次のレポートの抜粋は、上記のすべてのポイントを適切に示しています。
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
;
エイリアスを使用すると、テーブル名が長い場合や、テーブル名が互いに類似している場合に、テーブルをすばやく読んだ人がそれらを間違える可能性がある場合に、クエリが読みやすくなると思います。これは...
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'
テーブルエイリアスとして何を使用するかに応じて、クエリをより簡単に読んで理解してもらうことができます。
テーブルのエイリアス(テーブル名を短くするため)は悪い習慣ではありません。
私は通常、テーブル名が長いときに使用し、意味のあるエイリアスのみを使用します。
SELECT tTable.stuff FROM track_table tTable;
読みやすくする場合は、AS
キーワードを使用できます。
SELECT tTable.stuff FROM track_table AS tTable;
ただし、構文に慣れれば必要ありません。
これを使用して、クエリの可読性を大幅に向上させることができます。短いエイリアスを使用するのではなく、エイリアスを使用して、参加するデータを記述します。たとえば、
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
非常に短いエイリアス(a
やt1
など)を使用すると、エイリアスの意味を調べるためにエイリアスを検索する必要があるため、クエリが読みにくくなる可能性がありますが、適切な名前のエイリアスを使用できます多くの場合、テーブル名を使用するよりもクエリを読みやすくします。