SQL Prompt根據數據庫的對象名稱、語法和代碼片斷自動進行檢索,爲用戶提供合適的代碼選擇。自動腳本設置使代碼簡單易讀--當開發者不大熟悉腳本時尤爲有用。SQL Prompt安裝便可使用,能大幅提升編碼效率。此外,用戶還可根據須要進行自定義,使之以預想的方式工做。數據庫
本文探索了表別名的做用,解釋了什麼時候須要表別名,而且說明了它們的通常用途,對別名的合理命名的必要性,以及SQL Prompt如何處理它們。編輯器
表別名的主要目的(除了須要使用別名的狀況以外)是使SQL查詢更易於閱讀和理解。不,這不是我輸入的錯誤。別名並無使鍵入SQL查詢變得更加容易和快捷。若是您使用的是SQL Prompt,則尤爲如此,由於它會爲您完成全部鍵入操做。ide
若是啓用其「分配別名」選項,則在您輸入SQL語句時,SQL Prompt會自動建議一個或兩個字符的別名,只是由於它必須提供某些內容但不能提供含義。這樣作不是由於簡短的無心義的名稱更好。這僅意味着數據庫開發人員應改進默認別名以提供含義。函數
在哪裏可使用表別名?工具
在標準SQL中,僅在SELECT語句中使用別名。 能夠說,您只能在具備FROM子句的語句中使用它們,由於SQL Server的語法容許它在UPDATE和DELETE語句中使用FROM子句。 使用表別名時,您只是爲表引用的實例提供了特定的名稱,而不是實際的表。只有該引用纔是別名。編碼
我是否老是須要限定列名?spa
在SQL中,若是列名自己是模棱兩可的,則只須要使用對錶源的引用來限定列名,由於列名自己可能來自FROM子句中的一個或多個表源。在SQL Server中,使用合格的列名不管如何都會使解析器更輕鬆,並使查詢更易於閱讀。orm
可是,若是沒有JOIN子句,則在列名中添加任何種類的表限定符(不管是否帶別名)都是徹底多餘的,不該使用。對象
我是否老是須要使用表別名?blog
要使一列符合其表的資格,一般沒必要使用表別名(在ANSI SQL中也稱爲關聯名)。您能夠只使用提供該列的表源的名稱。
僅當引用不具備名稱的表源(例如派生表或行集函數)或使用命名錶源(例如表,視圖或表-)時,才必須使用別名值函數,在同一查詢中不止一次。通常而言,若是表源已經有了合適的名稱,那麼爲何要提供另外一個名稱呢?一般,您這樣作只是爲了使查詢的意圖更加清晰。若是沒有,那麼它就會成爲障礙。
何時須要別名?
須要使用別名的緣由之一是基表的名稱中包含非法字符。您可能看起來很生氣,說您永遠不會屈服於此,可是另外一方面,在表名限定符的開頭使用「@」是不合法的,所以表變量是一個問題。例如,若是不爲表變量提供別名,則必須提供方括號定界符以經過其全名引用它。固然,若是表中確實包含非法字符,則表別名可使您免於討厭的方括號。
您還必須使用表別名來限定一列,而不是依賴於表名(若是該表位於在JOIN中被兩次使用的表中)。 例如:
SELECT Object_Schema_Name(TablesEtc.object_id) + '.' + TablesEtc.name AS TableName, Constraints.name + ' (' + RTrim(Constraints.type) + ')' COLLATE DATABASE_DEFAULT AS [Constraint] FROM sys.objects AS TablesEtc INNER JOIN sys.objects AS Constraints ON Constraints.parent_object_id = TablesEtc.object_id WHERE TablesEtc.is_ms_shipped=0 ORDER BY TableName
sys.objects與sys.objects結合在一塊兒,所以若是不使用別名就沒法正常工做。 經過爲他們選擇有意義的名稱,咱們還能夠避免錯誤。
若是要加入表源(例如查詢),則須要提供一個名稱。不存在默認名稱。在這裏,咱們將從多行值建立兩個表源,而後將它們聯接。
SELECT numbers.number, Coalesce(Names.NameForFrequency,'frequently') AS HowManyTimes FROM (VALUES(0),(1),(2),(3),(4),(5)) AS numbers(number) LEFT OUTER join (VALUES(0,'never'),(1,'once'),(2,'twice'),(3,'thrice')) AS Names(number,NameForFrequency) ON numbers.number=Names.number
在第一個示例中,咱們使用了AS關鍵字來代表咱們正在引入別名。它是可選的,所以您能夠省略它,但這是一個很差的作法,由於它會使您的意圖變得不太清楚。
SQL Prompt如何處理別名
啓用了「分配別名」選項(「SQL Prompt」>「選項」>「插入的代碼」>「別名」)後,SQL Prompt將自動爲表源分配別名。可是,它沒法猜想SQL背後的故事,所以它不能爲您提供有意義的別名,只能提供縮寫。除非您提供當前的命名約定做爲自定義別名,不然它將盡量使用表或視圖名稱的首字母生成別名。若是該初始字符已被使用,它將使用兩個字符。
若是您很不幸地被困在「tibbling」約定中(全部表都帶有tbl前綴),則能夠告訴SQL Prompt忽略它們(經過將它們添加到「Prefixes to ignore」列表中)。 若是名稱帶有下劃線或連字符,或者由兩個CamelCase單詞組成(例如CustomerAccounts),則在生成兩個字母的別名時,SQL Prompt會將其考慮在內。
不然,當在自聯接中使用SQL Prompt時,SQL Prompt會爲同一表建立其餘別名。這是咱們以前看到的相同代碼,用於獲取表的名稱及其約束,但帶有SQL Prompt的別名建議。它消除了歧義,可是在閱讀此版本時,您是否會如此自信,以確保該ON子句正確無誤,甚至能夠理解您打算提供的內容和方式?
SELECT Object_Schema_Name(O.object_id) + '.' + O.name AS TableName, O2.name + ' (' + RTrim(O2.type) + ')' COLLATE DATABASE_DEFAULT AS [Constraint] FROM sys.objects AS O INNER JOIN sys.objects AS O2 ON O2.parent_object_id = O.object_id WHERE O.is_ms_shipped = 0 ORDER BY TableName;
當SQL Prompt分配別名時,它將在當前查詢編輯器窗口中記住該別名,正如您在處理查詢併爲其添加子句時,從建議框中爲您提供的建議中看到的那樣。
若是現有代碼使用聯接而且不使用表別名,則SQL Prompt將使用綠色曲線在表引用下劃線,表示違反了其ST010代碼分析樣式規則。就我的而言,我更喜歡禁用此規則,除非遵循一種樣式指南,該指南要求涉及多個表源的每一個SELECT都使用別名做爲限定符。更直接地,Prompt還強調了違反MI003的不合格列名。
若是添加表別名,而後運行Format SQL命令,它將自動使用別名來限定相關的列名(若是啓用了「限定對象名」操做)。
將自定義別名添加到SQL Prompt
您能夠根據已創建的命名約定爲表或視圖指定用戶定義的別名。與其餘提示選項分開,SQL Prompt當前不支持自定義別名的導入或導出,所以您必須一次鍵入一個。
要添加用戶定義的別名,請在「選項」窗口的「別名」窗口的頭部。在「自定義別名」標題下,單擊「新建」,而後輸入對象的名稱及其別名,而後單擊「保存」。
即便您能夠提供有意義的自定義別名,它們的添加長度也可能足以阻止它們適合「建議」框中建議的「ON表達式」。 在如下屏幕截圖中,我使用了一個愚蠢的別名TheTablesAsListedInTheSystemViews,只是爲了說明個人意思。 它溢出了建議框。
在這種狀況下,一種更簡單的解決方案是在查詢或例程完成後但保存以前,使用搜索和替換來更改Prompt提供的默認值。
總結
表別名有時是必不可少的,一般對於幫助闡明更復雜的SQL查詢的目的頗有用。 可是,它們並不是始終都是必需的,若是沒有JOIN,則在FROM子句中使用它們不會有任何好處。
使用SQL Prompt,我選擇更改建議的簡短別名,以提供更多解釋性的含義。它沒有怨恨,而是根據我選擇的自定義別名爲我提供建議。這將節省大量的單調鍵入,對此我深表感謝。