一、計算字段
儲存在資料庫表中的資料一般不是應用程式所需要的格式
例如:• 需要顯示公司名,同時還需要顯示公司的位址,但這兩個資訊儲存在不同的表列中。
• 列資料是大小寫混合的,但報表程式需要把所有資料按大寫表示出來。
• 物品訂單表儲存物品的**和數量,不儲存每個物品的總**(用**乘以數量即可)。但為列印發票,需要物品的總**。
• 需要根據表資料進行諸如總數、平均數的計算。
在上述每個例子中,儲存在表中的資料都不是應用程式所需要的。我們需要直接從資料庫中檢索出轉換、計算或格式化過的資料,而不是檢索出資料,然後再在客戶端應用程式中重新格式化。
這就是計算字段可以派上用場的地方了。計算欄位並不實際存在於資料庫表中。計算欄位是執行時在select語句內建立的。
字段(field)
基本上與列(column)的意思相同,經常互換使用,不過資料庫列一般稱為列,而術語字段通常與計算字段一起使用。
需要特別注意,只有資料庫知道select語句中哪些列是實際的表列,哪些列是計算字段。從客戶端(如應用程式)來看,計算欄位的資料與其他列的資料的返回方式相同。
在sql語句內可完成的許多轉換和格式化工作都可以直接在客戶端應用程式內完成。但一般來說,在資料庫伺服器上完成這些操作比在客戶端中完成要快得多。
二、拼接字段
拼接(concatenate)
將值聯結到一起(將乙個值附加到另乙個值)構成單個值。
把兩個列拼接起來。在sql中的select語句中,可使用乙個特殊的操作符來拼接兩個列。根據你所使用的dbms,此操作符可用加號(+)或兩個豎槓(||)表示。在mysql和mariadb中,必須使用特殊的函式。
說明:是+還是||?
access和sql server使用+號。db2、oracle、postgresql、sqlite和open office base使用||。詳細請參閱具體的dbms文件。
例如:vendors表包含**商名和位址資訊。假如要生成乙個**商報表,需要在格式化的名稱(位置)中列出**商的位置。
此報表需要乙個值,而表中資料儲存在兩個列vend_name和vend_country中。此外,需要用括號將vend_country括起來,這些東西都沒有儲存在資料庫表中。
select vend_name + ' (' + vend_country + ')' from vendors order by vend_name;
或者:select vend_name || ' (' || vend_country || ')' from vendors order by vend_name;
許多資料庫(不是所有)儲存填充為列寬的文字值,而實際上你要的結果不需要這些空格。為正確返回格式化的資料,必須去掉這些空格。這可以使用sql的rtrim()函式來完成
例如:select rtrim(vend_name) + ' (' + rtrim(vend_country) + ')' from vendors order by vend_name;
select rtrim(vend_name) || ' (' || rtrim(vend_country) || ')' from vendors order by vend_name;
rtrim()函式去掉值右邊的所有空格。通過使用rtrim(),各個列都進行了整理。
說明:trim函式
大多數dbms都支援rtrim()(正如剛才所見,它去掉字串右邊的空格)、ltrim()(去掉字串左邊的空格)以及trim()(去掉字串左右兩邊的空格)。
select語句可以很好地拼接位址字段。但是,這個新計算列的名字是什麼呢?實際上它沒有名字,它只是乙個值。如果僅在sql查詢工具中檢視一下結果,這樣沒有什麼不好。但是,乙個未命名的列不能用於客戶端應用中,因為客戶端沒有辦法引用它。
為了解決這個問題,sql支援列別名。別名(alias)是乙個欄位或值的替換名。別名用as關鍵字賦予。
例如:select rtrim(vend_name) + ' (' + rtrim(vend_country) + ')' as vend_title from vendors order by vend_name;
例如:select rtrim(vend_name) + ' (' + rtrim(vend_country) + ')' as vend_title from vendors order by vend_name;
select rtrim(vend_name) || ' (' || rtrim(vend_country) || ')' as vend_title from vendors order by vend_name;
select語句本身與以前使用的相同,只不過這裡的計算字段之後跟了文字as vend_title。它指示sql建立乙個包含指定計算結果的名為vend_title的計算字段。從輸出可以看到,結果與以前的相同,但現在列名為vend_title,任何客戶端應用都可以按名稱引用這個列,就像它是乙個實際的表列一樣。
說明:as通常可選
在很多dbms中,as關鍵字是可選的,不過最好使用它
別名還有其他用途。常見的用途包括在實際的表列名包含不合法的字元(如空格)時重新命名它,在原來的名字含混或容易誤解時擴充它。
注意:別名
別名的名字既可以是乙個單詞也可以是乙個字串。如果是後者,字串應該括在引號中。雖然這種做法是合法的,但不建議這麼去做。多單詞的名字可讀性高,不過會給客戶端應用帶來各種問題。因此,別名最常見的使用是將多個單詞的列名重新命名為乙個單詞的名字。
說明:匯出列
別名有時也稱為匯出列(derived column),不管怎麼叫,它們所代表的是相同的東西。
三、執行算術計算
計算欄位的另一常見用途是對檢索出的資料進行算術計算。
例如:orders表包含收到的所有訂單,orderitems表包含每個訂單中的各項物品。下面的sql語句檢索訂單號20008中的所有物品
select prod_id, quantity, item_price from orderitems where order_num = 20008;
例如:tem_price列包含訂單中每項物品的單價。如下彙總物品的**(單價乘以訂購數量)
select prod_id, quantity, item_price, quantity*item_price as expanded_price from orderitems where order_num = 20008;
輸出中顯示的expanded_price列是乙個計算字段,此計算為quantity*item_price。客戶端應用現在可以使用這個新計算列,就像使用其他列一樣。
表7-1 sql算術操作符
select語句為測試、檢驗函式和計算提供了很好的方法。雖然select通常用於從表中檢索資料,但是省略了from子句後就是簡單地訪問和處理表示式
SQL必知必會 建立計算字段 七
儲存在表中的資料都不是應用程式所需要的,我們需要直接從資料庫中檢索出轉換,計算或格式化過的資料,而不是檢索出資料,然後再在客戶端應用程式中重新格式化。與前面介紹的列不同,計算欄位並不實際存在於資料庫表中。注意 1 字段 基本上與列的意思相同,經常互換使用,不過資料庫列一般稱為列,而術語字段通常與計算...
SQL必知必會 建立計算字段
sql必知必會 讀書筆記 儲存在資料庫表中的資料一般不是應用程式所需要的格式,下面舉幾個例子。計算欄位是執行時在select語句內建立的。1.拼接字段 vendors表包含供用商名和位址資訊。假如要生成乙個 商報表,需要格式化的名稱中列出 商的位置。拼接 將值聯結在一起 將乙個值附加到另乙個值 構成...
sql必知必會學習記錄(七) 建立計算字段
拼接字段 在mysql的select語句中,可使用concat 函式來拼接兩個列。select concat vend name,vend country,from vendors order by vend name 在mysql 中,rtrim 函式可以去掉值右邊的所有空格。還支援ltrim 去...