什麼是 SQL 計算欄位,如何創建 SQL 計算欄位

来源:https://www.cnblogs.com/vin-c/archive/2022/05/12/16260971.html
-Advertisement-
Play Games

本文介紹什麼是計算欄位,如何創建計算欄位,我們用例子說明瞭計算欄位在字元串拼接和算術計算中的用途。以及如何從應用程式中使用別名引用它們。 一、計算欄位 存儲在資料庫表中的數據一般不是應用程式所需要的格式,下麵舉幾個例子。 需要顯示公司名,同時還需要顯示公司的地址,但這兩個信息存儲在不同的表列中。 城 ...


目錄

本文介紹什麼是計算欄位,如何創建計算欄位,我們用例子說明瞭計算欄位在字元串拼接和算術計算中的用途。以及如何從應用程式中使用別名引用它們。

一、計算欄位

存儲在資料庫表中的數據一般不是應用程式所需要的格式,下麵舉幾個例子。

  • 需要顯示公司名,同時還需要顯示公司的地址,但這兩個信息存儲在不同的表列中。
  • 城市、州和郵政編碼存儲在不同的列中(應該這樣),但郵件標簽列印程式需要把它們作為一個有恰當格式的欄位檢索出來。
  • 列數據是大小寫混合的,但報表程式需要把所有數據按大寫表示出來。
  • 物品訂單表存儲物品的價格和數量,不存儲每個物品的總價格(用價格乘以數量即可)。但為列印發票,需要物品的總價格。
  • 需要根據表數據進行諸如總數、平均數的計算。

在上述每個例子中,存儲在表中的數據都不是應用程式所需要的。我們需要直接從資料庫中檢索出轉換、計算或格式化過的數據,而不是檢索出數據,然後再在客戶端應用程式中重新格式化。

這就是計算欄位可以派上用場的地方了。計算欄位並不實際存在於資料庫表中。計算欄位是運行時在 SELECT 語句內創建的。

欄位(field)

基本上與列(column)的意思相同,經常互換使用,不過資料庫列一般稱為列,而欄位這個術語通常在計算欄位這種場合下使用。

需要特別註意,只有資料庫知道 SELECT 語句中哪些列是實際的表列,哪些列是計算欄位。從客戶端(如應用程式)來看,計算欄位的數據與其他列的數據的返回方式相同。

提示:客戶端與伺服器的格式

在 SQL 語句內可完成的許多轉換和格式化工作都可以直接在客戶端應用程式內完成。但一般來說,在資料庫伺服器上完成這些操作比在客戶端中完成要快得多。

二、拼接欄位

為了說明如何使用計算欄位,我們來舉一個簡單例子,創建由兩列組成的標題。

Vendors 表包含供應商名和地址信息。假如要生成一個供應商報表,需要在格式化的名稱(位置)中列出供應商的位置。

此報表需要一個值,而表中數據存儲在兩個列 vend_namevend_country 中。此外,需要用括弧將 vend_country 括起來,這些東西都沒有存儲在資料庫表中。

這個返回供應商名稱和地址的 SELECT 語句很簡單,但我們是如何創建這個組合值的呢?

拼接(concatenate)

將值聯結到一起(將一個值附加到另一個值)構成單個值。

解決辦法是把兩個列拼接起來。在 SQL 中的 SELECT 語句中,可使用一個特殊的操作符來拼接兩個列。根據你所使用的 DBMS,此操作符可用加號(+)或兩個豎杠(||)表示。

在 MySQL 和 MariaDB 中,必須使用特殊的函數。

說明:是 + 還是 ||

SQL Server 使用 + 號。DB2、Oracle、PostgreSQL 和 SQLite 使用 ||。詳細請參閱具體的 DBMS 文檔。

下麵是使用加號的例子(多數 DBMS 使用這種語法):

SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;

輸出:

-----------------------------------------------------------
Bear Emporium                                (USA        )
Bears R Us                                   (USA        )
Doll House Inc.                              (USA        )
Fun and Games                                (England    )
Furball Inc.                                 (USA        )
Jouets et ours                               (France     )

下麵是相同的語句,但使用的是 || 語法:

SELECT vend_name || '(' || vend_country || ')'
FROM Vendors
ORDER BY vend_name;

輸出:

-----------------------------------------------------------
Bear Emporium                                (USA        )
Bears R Us                                   (USA        )
Doll House Inc.                              (USA        )
Fun and Games                                (England    )
Furball Inc.                                 (USA        )
Jouets et ours                               (France     )

下麵是使用 MySQL 或 MariaDB 時需要使用的語句:

SELECT Concat(vend_name, ' (', vend_country, ')')
FROM Vendors
ORDER BY vend_name;

上面兩個 SELECT 語句拼接以下元素:

  • 存儲在 vend_name 列中的名字;
  • 包含一個空格和一個左圓括弧的字元串;
  • 存儲在 vend_country 列中的國家;
  • 包含一個右圓括弧的字元串。

從上述輸出中可以看到,SELECT 語句返回包含上述四個元素的一個列(計算欄位)。

再看看上述 SELECT 語句返回的輸出。結合成一個計算欄位的兩個列用空格填充。許多資料庫(不是所有)保存填充為列寬的文本值,而實際上你要的結果不需要這些空格。

為正確返回格式化的數據,必須去掉這些空格。這可以使用 SQL 的 RTRIM() 函數來完成,如下所示:

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name;

輸出:

-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

下麵是相同的語句,但使用的是 ||

SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
FROM Vendors
ORDER BY vend_name;

輸出:

-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

RTRIM() 函數去掉值右邊的所有空格。通過使用 RTRIM(),各個列都進行了整理。

說明:TRIM 函數

大多數 DBMS 都支持 RTRIM()(正如剛纔所見,它去掉字元串右邊的空格)、LTRIM()(去掉字元串左邊的空格)以及 TRIM()(去掉字元串左右兩邊的空格)。

2.1 使用別名

從前面的輸出可以看到,SELECT 語句可以很好地拼接地址欄位。但是,這個新計算列的名字是什麼呢?實際上它沒有名字,它只是一個值。

如果僅在 SQL 查詢工具中查看一下結果,這樣沒有什麼不好。但是,一個未命名的列不能用於客戶端應用中,因為客戶端沒有辦法引用它。

為瞭解決這個問題,SQL 支持列別名。別名(alias)是一個欄位或值的替換名。別名用 AS 關鍵字賦予。請看下麵的 SELECT 語句:

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
 AS vend_title
FROM Vendors
ORDER BY vend_name;

輸出:

vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

下麵是相同的語句,但使用的是 || 語法:

SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
 AS vend_title
FROM Vendors
ORDER BY vend_name;

下麵是 MySQL 和 MariaDB 中使用的語句:

SELECT Concat(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;

輸出:

prod_id        quantity        item_price
----------     -----------     ---------------------
RGAN01         5               4.9900
BR03           5               11.9900
BNBG01         10              3.4900
BNBG02         10              3.4900
BNBG03         10              3.4900

item_price 列包含訂單中每項物品的單價。如下彙總物品的價格(單價乘以訂購數量):

SELECT prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

輸出:

prod_id        quantity        item_price       expanded_price
----------     -----------     ------------     -----------------
RGAN01         5               4.9900           24.9500
BR03           5               11.9900          59.9500
BNBG01         10              3.4900           34.9000
BNBG02         10              3.4900           34.9000
BNBG03         10              3.4900           34.9000

輸出中顯示的 expanded_price 列是一個計算欄位,此計算為 quantity*item_price。客戶端應用現在可以使用這個新計算列,就像使用其他列一樣。

SQL 支持表 1 中列出的基本算術操作符。此外,圓括弧可用來區分優先順序。關於優先順序的介紹,請參閱 如何使用 SQL AND、OR、IN 和 NOT 過濾返回的數據

表 1 SQL 算術操作符

操作符 說明
+
-
*
/

提示:如何測試計算

SELECT 語句為測試、檢驗函數和計算提供了很好的方法。

雖然 SELECT 通常用於從表中檢索數據,但是省略了 FROM 子句後就是簡單地訪問和處理表達式,例如 SELECT 3 * 2; 將返回 6SELECT Trim(' abc '); 將返回 abcSELECT Curdate(); 使用 Curdate() 函數返回當前日期和時間。

現在你明白了,可以根據需要使用 SELECT 語句進行檢驗。

四、小結

本文介紹了計算欄位以及如何創建計算欄位。我們用例子說明瞭計算欄位在字元串拼接和算術計算中的用途。此外,還講述瞭如何創建和使用別名,以便應用程式能引用計算欄位。

原文鏈接:https://www.developerastrid.com/sql/sql-calculated-fields/

(完)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 、通過雲開發平臺快速創建初始化應用 1.創建相關應用模版請參考鏈接:5分鐘站點生成神器——Docusaurus 2.完成創建後就可以在github中查看到新增的Docusaurus倉庫 二 、 本地編寫個人博客 1.將應用模版克隆到本地 ● 首先假定你已經安裝了Git、node,沒有安裝請移步n ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 實現呼吸燈的效果:D1為長亮LED,D2為呼吸燈,通過PWM的方式實現D2亮→滅→亮→滅……的漸變效果,一次變化 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 前情提要: 該方法只適用於Windows10以上版本,Ubuntu直接可在微軟商店安裝 在這個網頁docs.microsoft.com/zh-cn/windo… 可以設置完成前5部,然後根據下麵具體操作。 ps:1.在連接中我們要打開powers ...
  • 五一5天小假期的結束大家休息好了嗎?上班了狀態回整的怎麼樣呢?阿裡云云發平臺給大家帶福利了呢,通過玩游戲把獎品帶回家。 雲開發平臺兩周年,0門檻部署上線4款熱門游戲,游戲暢玩還有AirPods耳機、筋膜槍等8種獎品任你挑啦!4款游戲只需要完成2個就可以抽獎呢,100%中獎;還額外有故事有獎徵集的板塊 ...
  • 一、引言 SQL Server有一些很好用的功能,只不過由於個人原因沒用過或者不記得怎麼用,導致需要花點時間用其它方式來實現。 二、好用小知識 2.1、FORMAT函數 1)時間格式化,如將當前日期格式化為2022-05-12: SELECT FORMAT(GETDATE(),'yyyy-MM-dd ...
  • 一、引言 A表數據同步至B表的場景很常見,比如一個公司有總部及分廠,它們使用相同的系統,只是賬套不同。此時,一些基礎數據如物料信息,只需要總部錄入即可,然後間隔一定時間同步至分廠,避免了重覆工作。 二、測試數據 CREATE TABLE StudentA ( ID VARCHAR(32), Name ...
  • 本文介紹什麼是 SQL 的聚集函數,如何利用它們彙總表的數據。這些函數很高效,它們返回結果一般比你在自己的客戶端應用程式中計算要快得多。 一、聚集函數 我們經常需要彙總數據而不用把它們實際檢索出來,為此 SQL 提供了專門的函數。使用這些函數,SQL 查詢可用於檢索數據,以便分析和報表生成。這種類型 ...
  • 本文介紹什麼是函數,DBMS 支持何種函數,以及如何使用這些函數;還將講解為什麼 SQL 函數的使用可能會帶來問題。 一、函數 與大多數其他電腦語言一樣,SQL 也可以用函數來處理數據。函數一般是在數據上執行的,為數據的轉換和處理提供了方便。 SQL 如何創建計算欄位 中用來去掉字元串尾的空格的 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...