Is table aliasing a bad practice?
Table aliasing is a common and helpful practice.
- It saves you keystrokes when referencing columns anywhere in your query.
- It improves the readability of your SQL when you are referencing many tables. Aliases let you give those tables a short name plus a little meaning to how they are being used.
- It is even required when you join a table to itself or when you join to the same table multiple times. This is so the query optimizer knows which table you are referencing when you mention a column.
The following reporting extract illustrates all of the above points nicely:
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
;
I think using aliases helps the readability of a query if the table names are long or so similar to each other that someone reading it quickly might mistake them. Do you think that this...
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'
is more readable than this?
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'
Depending on what you use as table aliases, it can make the query much simpler for a person to read and understand.
Table aliasing (for the sake of shorter table names) isn't bad practice.
I normally use it when the tablenames are long and then only use the alias that makes sense:
SELECT tTable.stuff FROM track_table tTable;
If you want to improve readability, you can use the AS
keyword:
SELECT tTable.stuff FROM track_table AS tTable;
But, as you get used to the syntax, it's not needed.