1. 程式人生 > >MySQL中使用表別名與欄位別名

MySQL中使用表別名與欄位別名

MySQL 表別名(Alias) SQL 表別名 在 SQL 語句中,可以為表名稱及欄位(列)名稱指定別名(Alias),別名是 SQL 標準語法,幾乎所有的資料庫系統都支援。通過關鍵字 AS 來指定。 表別名語法: SELECT column FROM table AS table_alias 上述 SQL 執行後的效果,給人感覺是對 table_alias 表進行查詢,但實際上對單表做簡單的別名查詢通常是無意義的。一般是對一個表要當作多個表來操作,或者是對多個表進行操作時,才設定表別名。 下面是一個簡單的多表操作的例子: article 文章表: aid title content uid pubtime user 使用者表: uid username password email regdate 當查詢一篇文章的時候,一般會同時將對應的文章作者查詢出來,通常的 SQL 語句為: SELECT article.title,article.content,user.username FROM article, user WHERE article.aid=1 AND article.uid=user.uid 設定表別名後: SELECT a.title,a.content,u.username FROM article AS a, user AS u where a.aid=1 and a.uid=u.uid 上述兩條 SQL 語句查詢結果是一樣的 可以看出,使用表別名查詢,可以使 SQL 變得簡潔而更易書寫和閱讀,尤其在 SQL 比較複雜的情況下。除了使用別名來簡化 SQL 外,有些時候例如一個表做自身關聯時,必須要使用別名來當作兩個表進行關聯操作。 MySQL 欄位別名(列別名) SQL 欄位別名 同本文前文講述的表別名一樣,SQL(MySQL) 也支援對錶的欄位(列)設定別名。 欄位別名語法: SELECT column AS column_alias FROM table 欄位別名使用例子 欄位別名一個明顯的效果是可以自定義查詢資料返回的欄位名。 在查詢的時候,對 username 欄位使用別名: SELECT username AS name,email FROM user 當然如此簡單的定義欄位的別名是沒有太大實際意義的,欄位別名更多的意義是解決欄位名的重複,如一個表字段被查詢兩次或更多次時: SELECT username AS name,username,email FROM user 或者兩個及更多表進行查詢,有相同的返回欄位時: 兩個表都定義了 title 欄位且都需要返回該欄位資料時,就需要定義欄位別名(至少定義一個): SELECT a.title AS atitle,u.username,u.title AS utitle FROM article AS a, user AS u where a.uid=u.uid 可以看出,當查詢返回的欄位名稱相同時,可以通過定義別名來避免衝突,上面查詢的例子同時定義了欄位別名與表別名。 提示 通常,定義欄位別名的 AS 關鍵字可以省略,即下面兩句 SQL 效果一致: SELECT username AS name FROM user SELECT username name FROM user 但我們建議不要省略 AS 關鍵字。 別名(alias)是 SQL 的標準語法,幾乎所有的資料庫系統都支援。在處理一些複雜的查詢時,可以合理的定義表和欄位別名來使 SQL 語句看起來更加精簡易讀,也避免查詢返回相同欄位資料時的衝突。

有如下sql語句: 【案例1】    SELECT userName AS a,  userAddress AS b FROM TestTableWHEREalike’%am%’  該語句執行是會報錯,因為別名只是對欄位的一種引用,不能當作欄位一樣使用,如果真要把別名當欄位一樣使用,可以如下變通:    SELECT a, b    FROM(       SELECT userName AS a,  userAddress AS b FROM TestTable    ) AS tempTable     WHERE a like ‘%dd%’     如此,便可把別名當欄位一樣使用了 但是需要和足以紫色字型部分,該處要給內嵌的select查詢指定一個別名,否則會報錯

【案例2】    SELECT coutDay AS a, month1 AS b,  (select 信用天數 from PayDays where 自定義值 = month1) AS c,  (a+ c) AS ‘total’ FROM TestTable 變通為:    SELECT a, b, a + c AS  ‘total’     FROM(       SELECT coutDay AS a, month1 AS b,  (select 信用天數 from PayDays where 自定義值 = month1) AS c FROM TestTable    ) AS tempTable

【案例3】 下面的sql語句中中,灰色部分重複了兩次,第二個灰色部分有不能用第一個灰色區域的別名CountDays替換,一旦替換會出現語法錯誤。

SELECT  cCustCode As 客戶程式碼, cPayWay As 付款條件,   cPayCode As 付款方式, CASE WHEN cPayWay like ‘%月結%’ THEN (datediff(day, dOutDate, dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,dOutDate)+1, 0))) + (select 信用天數 from PayDays where 自定義值 = cPayWay)) ELSE (select 信用天數 from PayDays where 自定義值 = cPayWay) END As CountDays, Convert(Varchar(12),dOutDate, 102) As 出庫日期, Convert(Varchar(12),DateAdd(Day, Cast( (CASE WHEN cPayWay like ‘%月結%’ THEN (datediff(day, dOutDate, dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,dOutDate)+1, 0))) + (select 信用天數 from PayDays where 自定義值 = cPayWay)) ELSE (select 信用天數 from PayDays where 自定義值 = cPayWay) END) AS int), dOutDate), 102) AS  實際回款日期 FROM ODS.F_DISPATCHLIST_ALL where (isum-isnull(nSumARAmt,0))>10e-8

我們把第二個灰色部分提出來,改為

SELECT 客戶程式碼,付款條件,  付款方式,CountDays,出庫日期,Convert(Varchar(12),DateAdd(Day, Cast(CountDays)AS int), dOutDate), 102)AS  實際回款日期  FROM( SELECT  cCustCode As 客戶程式碼, cPayWay As 付款條件,   cPayCode As 付款方式, CASE WHEN cPayWay like ‘%月結%’ THEN (datediff(day, dOutDate, dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,dOutDate)+1, 0))) + (select 信用天數 from PayDays where 自定義值 = cPayWay)) ELSE (select 信用天數 from PayDays where 自定義值 = cPayWay) END As CountDays, Convert(Varchar(12),dOutDate, 102) As 出庫日期 FROM ODS.F_DISPATCHLIST_ALL where (isum-isnull(nSumARAmt,0))>10e-8  )