2

私が一緒に働いている人の 1 人は、SQL エイリアスの使用について次のように述べています。エイリアスを作成するかしないか、皆さんはどう思いますか?

....

そのため、SQL をどのように記述すべきかについて、私は常に開発チームの中でも変わり者でした。学校でエイリアスの使い方を学びましたが、個人的には嫌いです。長いとステートメントが読めなくなる可能性があることがわかりました。どのテーブルが他のどのテーブルに結合しているかを知りたいです。「p」が何を意味するのかを理解するために、5-10 テーブル結合を検索する必要はありません。製品テーブル、人などですか?

個人的には、少しダブルクリック、ctrl+c、ctrl+v を使うのは難しくありません。完全なテーブル名を使用してください (もちろん、同じテーブルに 2 回参加する必要がある場合もあります。その場合、より奇妙なクエリでエイリアスを使用する必要があります)。私のスタイル

SELECT *
FROM
    People 
JOIN
    Orders ON People.PersonID = Orders.PersonID
JOIN
    OrderDetails ON Orders.OrderID = OrderDetails.OrderID
JOIN
    Products ON Products.ProductID = OrderDetails.ProductID
JOIN
    Country ON People.CountryID = Country.CountryID

VS

SELECT *
FROM
    People p
JOIN
    Orders o ON p.PersonID = o.PersonID
JOIN
    OrderDetails od ON o.OrderID = od.OrderID
JOIN
    Products pr ON pr.ProductID = od.ProductID
JOIN
    Country c ON p.CountryID = c.CountryID

個人的な好みですか?このクエリがより大きな結合であり、大きな選択ステートメントがあったかどうかを検討してください。

ほとんどの人は時間を節約するためにエイリアスを使用していると思いますが、エイリアスの方が読みやすいと思いますか? 古いSQLにアクセスして、結合がどのように機能するかをすぐに理解できますか?

更新:具体的には、名前を1文字に短縮すると、SQLステートメントが読めなくなる可能性があると主張しようとしています。テーブルを ShoeStackerCrazyProducts から ShowProducts に変更することは理にかなっていると思います。一方、それを sscp にショートすると、読み取り不能になります。考え?

4

8 に答える 8

2

これは主観的なものですが、テーブル名が長くなると、エイリアスの方がはるかに読みやすくなります。列名にも修飾子が必要であることを忘れないでください。そのため、すぐに CamelCasedTableNames.WithDelimiters の長いリストになってしまう可能性があります。

いくつかのレガシーテーブルを手なずける現実世界の例:

SELECT count(*) as c, a.Attributeid, property as AttributeName, 
    a.Subattributeid, SubProperty as SubAttributeName 
    FROM prodAttribute a 
    INNER JOIN phAttributeDisplayOrder o 
        ON a.attributeID = o.AttributeID 
    INNER JOIN lstphysicalproperties y 
        ON a.attributeid = y.physicalpropertyid 
    INNER JOIN (select * from tblsubPhysicalProperties where deleted is null) z 
        ON a.attributeid = z.propertyid 
            AND a.subAttributeID = z.subpropertynumbering 
    GROUP BY o.ranking, a.attributeid, property, a.subattributeid, SubProperty 
    ORDER BY o.ranking, a.attributeid, a.subattributeid

完全修飾名がなければ、それは十分に悪いことです。

今日書いていたら、1 文字のエイリアスを避けるかもしれませんが、この短いクエリではそれほど重要ではありません。

于 2010-10-04T20:22:30.990 に答える
2

個人的には、単一のテーブル クエリであっても、常にエイリアスを使用します。また、列名が一意であり、エイリアスが厳密に必要でない場合でも、すべての列参照でそのエイリアスを使用することを習慣にしています。エイリアスに意味がある限り (たとえば、Products を A ではなく pr にエイリアスするなど)、読みやすさが損なわれることはあまりありません。

参照:このトピックに関するBrent Ozar のブログ エントリ。

これに関連して、すべてのテーブル参照 (dbo.Products と Products など) には、それが既定のスキーマであっても常にスキーマ名を含めます。

于 2010-10-04T20:33:47.570 に答える
1

SQL IDE が IntelliSense をサポートすることは、より一般的です。

  • SQL Server Management Studio 2008 は (ただし、2008 以降のインスタンスに対してのみ)
  • オラクルの PLSQL 開発者
  • RedGate の SqlPrompt

...これにより、エイリアスの操作が非常に簡単になります。

とはいえ、テーブル エイリアスを使用することは主観的ではないと思います。

  1. 修飾する必要があるすべての列参照に対して、テーブル名 (特に TSQL の 3 つまたは 4 つの名前の構文) を書き直す必要があるのは誰でしょうか? これは、作業を減らすのではなく、作業を増やすだけであり、タイプミスの可能性を高めます。
  2. すべての列参照は修飾する必要があります。SELECT *実際にすべての列を使用しない限り、避けるべきです。列参照にテーブル エイリアスを含めることで、列がどこから来たのかが明確になり、列が変更された場合やテーブルから消えた場合のエラーを信頼できます。「誤った列 'id'」に関するエラーが発生した場合は、それを追跡する必要があります。テーブル エイリアスを含めることで、問題のデバッグに必要な作業量を最小限に抑えることができます。
  3. 1 つのクエリで同じテーブルの複数のインスタンスを使用する場合は、テーブル エイリアスが必要です。

結論

SQL を維持する機能は、テーブル エイリアスを使用することではるかに簡単になります。

于 2010-10-04T20:37:20.047 に答える
1

複数のデータベースにわたってロジックを実行している場合、3 つの部分からなる名前が必要な場合、エイリアスは非常に便利です。また、それらの有用性は、DB/スキーマ/テーブル名の長さとエイリアスの思慮深さに正比例します。

私の環境では、同じクエリで複数の DB を使用して多くの作業を行っており、特に次のような長い DB 名がある場合、エイリアスは非常に重要です。

CustomerNameDataClaimsDetail
CustomerNameDataClaimsHeader

これらの DB には次のようなテーブルがあります。

ClaimsDetailNew
ClaimsDetailLoad

CustomerNameDataClaimsDetail.dbo.ClaimsDetailNewその場合、またはそのようなものにエイリアスすることは非常に理にかなっていますCDN

于 2010-10-04T20:25:46.863 に答える
1

テーブルに同じ名前が付けられていても、データベースが異なる場合は、エイリアスを作成する必要があります。これは、同じ名前のテーブルでも名前が異なるスキーマでも発生します。

SELECT * FROM
DB1.dbo.Table1
JOIN DB2.dbo.Table1 ON DB1.dbo.Table1.field = DB2.dbo.Table1.field

どこで動作しません

SELECT * FROM
DB1.dbo.Table1 T1
JOIN DB2.dbo.Table1 T2 ON T1.field = T2.field

動作します。

また、自己結合を使用すると、エイリアスが強制されます。

于 2010-10-04T20:31:00.263 に答える
1

私は SqlPrompt (RedGate) を使用しています。これはすべてのコピー/貼り付けを行いますが、今でも常にエイリアスを使用しています。私がしない(そして我慢できない) ことは、エイリアスにアルファベットを使用することです。つまり、最初に書く表は「a」、2 番目の表は「b」というように続きます。小さなクエリには、テーブルの最初の文字を使用します。クエリが長い場合は、テーブル名全体を使用します。

もちろん、私はスキーマを使用しているため、完全修飾オブジェクト名は、与えられた例よりもずっと長くなる傾向があります。

于 2010-10-04T20:23:21.857 に答える
1

エイリアスのほうがいいです。Product と People がある場合は、別の略語を使用してください。たとえば、製品は Pd、人は pl です。

さらに、内部クエリがある場合、エイリアスは重要です。

于 2010-10-04T20:24:00.897 に答える
1

複数のテーブルが関係する場合は、常にエイリアスを使用します。

これにより、特に複合キーを持つテーブルがかなりあるため、JOIN がはるかに読みやすくなると思います。常にテーブル名を入力する必要がある場合は、手間がかかり、読みにくくなります。

select *
from TableWithLongName
inner join AnotherTableWithLongName on TableWithLongName.Column1 = AnotherTableWithLongName.Column1 and TableWithLongName.Column2 = AnotherTableWithLongName.Column2

...これより:

select *
from TableWithLongName t
inner join AnotherTableWithLongName a on t.Column1 = a.Column1 and t.Column2 = a.Column2

さらに、実際のアプリでは通常SELECT *を実行せず、選択する列を指定します。2 つ以上のテーブルを結合する場合は、列の前にテーブル名を付ける必要があります。

繰り返しますが、救助へのエイリアス...私はこれを好むので:

select t.Column1, t.Column2, a.Column1, a.Column2
from ...

...そしてそうではありません:

select TableWithLongName.Column1, TableWithLongName.Column2, AnotherTableWithLongName.Column1, AnotherTableWithLongName.Column2
from ...

別名の付け方について:
テーブルが 2 つまたは 3 つしかない場合は、ほとんどの場合、1 文字の別名を使用します。まったく異なる名前のテーブルが 2 つしかない場合、"o" は "Orders" を意味し、"p" は "Products" を意味することを覚えるのはそれほど難しくありません。
短いエイリアス (「People」の「p1」や「Products」の「p2」など) が混乱を招く可能性がある場合は、長いエイリアスを使用しますが、名前全体 (「peo」や「pro」など) は使用しません。

于 2010-10-04T21:15:50.033 に答える