第7課 SQL入門之創建計算字段

文章目錄

  • 7.1 計算字段
  • 7.2 拼接字段
    • 使用別名
  • 7.3 執行算術計算

這一課介紹什么是計算字段,如何創建計算字段,以及如何從應用程序中使用別名引用它們。

7.1 計算字段

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

  • 需要顯示公司名,同時還需要顯示公司的地址,但這兩個信息存儲在不同的表列中。
  • 城市、州和郵政編碼存儲在不同的列中(應該這樣),但郵件標簽打印程序需要把它們作為一個有恰當格式的字段檢索出來。
  • 列數據是大小寫混合的,但報表程序需要把所有數據按大寫表示出來。
  • 物品訂單表存儲物品的價格和數量,不存儲每個物品的總價格(用價格乘以數量即可)。但為打印發票,需要物品的總價格。
  • 需要根據表數據進行諸如總數、平均數的計算。
    在上述每個例子中,存儲在表中的數據都不是應用程序所需要的。我們需要直接從數據庫中檢索出轉換、計算或格式化過的數據,而不是檢索出數據,然后再在客戶端應用程序中重新格式化。
    這就是計算字段可以派上用場的地方了。與前幾課介紹的列不同,計算字段并不實際存在于數據庫表中。計算字段是運行時在SELECT語句內創建的。

字段(field)

基本上與列(column)的意思相同,經常互換使用,不過數據庫列一般稱為列,而術語字段通常與計算字段一起使用。

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

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

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

7.2 拼接字段

為了說明如何使用計算字段,我們來舉一個簡單例子,創建由兩列組成的標題。
Vendors表包含供應商名和地址信息。假如要生成一個供應商報表,需要在格式化的名稱(位置)中列出供應商的位置。
此報表需要一個值,而表中數據存儲在兩個列vend_name和vend_country中。此外,需要用括號將vend_country括起來,這些東西都沒有存儲在數據庫表中。這個返回供應商名稱和地址的SELECT語句很簡單,但我們是如何創建這個組合值的呢?

拼接(concatenate)

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

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

說明:是+還是||?

Access和SQL Server使用+號。DB2、Oracle、PostgreSQL、SQLite和Open Office
Base使用||。詳細請參閱具體的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 ?????)

分析▼
上面兩個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()(去掉字符串左右兩邊的空格)。

使用別名

從前面的輸出可以看到,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(vend_name, ' (', 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),不管怎么叫,它們所代表的是相同的東西。

7.3 執行算術計算

計算字段的另一常見用途是對檢索出的數據進行算術計算。舉個例子,Orders表包含收到的所有訂單,OrderItems表包含每個訂單中的各項物品。下面的SQL語句檢索訂單號20008中的所有物品:
輸入▼

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

輸出▼

prod_idquantityitem_price
RGAN0154.9900
BR03511.9900
BNBG01103.4900
BNBG02103.4900
BNBG03103.4900

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

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

輸出▼

prod_idquantityitem_priceexpanded_price
RGAN0154.990024.9500
BR03511.990059.9500
BNBG01103.490034.9000
BNBG02103.490034.9000
BNBG03103.490034.9000

分析▼
輸出中顯示的expanded_price列是一個計算字段,此計算為quantity*item_price。客戶端應用現在可以使用這個新計算列,就像使用其他列一樣。
SQL支持表7-1中列出的基本算術操作符。此外,圓括號可用來區分優先順序。關于優先順序的介紹,請參閱第5課。
表7-1 SQL算術操作符

操 作 符說  明
+
-
*
/

提示:如何測試計算 SELECT語句為測試、檢驗函數和計算提供了很好的方法。雖然SELECT通常用于從表中檢索數據,但是省略了FROM子句后就是簡單地訪問和處理表達式,例如SELECT 3 * 2;將返回6,SELECT Trim(’ abc ');將返回abc,SELECT Now();使用Now()函數返回當前日期和時間。現在你明白了,可以根據需要使用SELECT語句進行檢驗。


上一篇:第6課 SQL入門之用通配符進行過濾

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207517.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端Excel導出實用方案(完整源碼,可直接應用)

目錄 前言: 技術選型: 主要功能點: 核心代碼: 完整代碼: 開發文檔 前言: 在前后端分離開發為主流的時代,很多時候,excel導出已不再由后端主導,而是把導出的操作移…

關于鎖的粒度問題——面試

鎖的粒度劃分主要有三種:表級鎖、頁級鎖和行鎖 1.表級鎖: 對整張表加鎖,粒度最大,加鎖的并發度最低,會導致其他事務無法訪問該表,只有當前事務提交或者回滾后才能釋放鎖。表級鎖適用于對表進行全表操作的場…

DeepIn,UOS統信專業版安裝運行Java,JavaFx程序

因為要適配國產統信UOS系統,要求JavaFx程序能簡便雙擊運行,由于網上UOS開發相關文章少,多數文章沒用,因此花了不少時間,踩了不少坑,下面記錄一些遇到的問題,我的程序環境是jdk1.8,為…

【K8s】Kubernetes CRD 介紹(控制器)

文章目錄 CRD 概述1. 操作CRD1.1 創建 CRD1.2 操作 CRD 2. 其他筆記2.1 Kubectl 發現機制2.2 校驗 CR2.3 簡稱和屬性 3. 架構設計3.1 控制器概覽 參考 CRD 概述 CR(Custom Resource)其實就是在 Kubernetes 中定義一個自己的資源類型,是一個具…

如何為 3D 模型制作紋理的最佳方法

在線工具推薦: 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 您可以通過不同的方式為 3D 模型創建 3D 紋理。下面我們將介紹為 3D …

《opencv實用探索·十四》VideoCapture播放視頻和視像頭調用

1、VideoCapture播放視頻 #include <opencv2/opencv.hpp> #include <iostream>using namespace std; using namespace cv;int main() {// 定義相關VideoCapture對象VideoCapture capture;// 打開視頻文件capture.open("1.avi");// 判斷視頻流讀取是否正…

Python os模塊及用法

os 模塊代表了程序所在的操作系統&#xff0c;主要用于獲取程序運行所在操作系統的相關信息。 在 Python 的交互式解釋器中先導入 os 模塊&#xff0c;然后輸入 os.__all__ 命令&#xff08;__all__ 變量代表了該模塊開放的公開接口&#xff09;&#xff0c;即可看到該模塊所包…

Linux DataEase數據可視化分析工具本地部署與遠程訪問

文章目錄 前言1. 安裝DataEase2. 本地訪問測試3. 安裝 cpolar內網穿透軟件4. 配置DataEase公網訪問地址5. 公網遠程訪問Data Ease6. 固定Data Ease公網地址 前言 DataEase 是開源的數據可視化分析工具&#xff0c;幫助用戶快速分析數據并洞察業務趨勢&#xff0c;從而實現業務…

ExecutorService介紹

參考&#xff1a;https://blog.csdn.net/fwt336/article/details/81530581 前言 在開發中為了提高系統的響應速度和處理能力會使用到多線程&#xff0c;但線程的創建和釋放&#xff0c;需要占用不小的內存和資源。如果每次需要使用線程時&#xff0c;都new 一個Thread的話&…

【LeetCode】2723. 兩個 Promise 對象相加

兩個 Promise 對象相加 題目題解 題目 給定兩個 promise 對象 promise1 和 promise2&#xff0c;返回一個新的 promise。promise1 和 promise2 都會被解析為一個數字。返回的 Promise 應該解析為這兩個數字的和。 示例 1&#xff1a; 輸入&#xff1a; promise1 new Promise…

geoserver根據屬性字段值設置不同的顏色

<?xml version"1.0" encoding"UTF-8"?> <StyledLayerDescriptor xmlns"http://www.opengis.net/sld" xmlns:xlink"http://www.w3.org/1999/xlink" xmlns:ogc"http://www.opengis.net/ogc" xmlns:xsi"http:/…

中國聚羥基脂肪酸酯(PHA)市場評估與投資戰略報告(2024版)

內容簡介&#xff1a; PHA英文名稱為 Polyhydroxyalkanoates&#xff0c;是近20多年迅速發展起來的&#xff0c;很多天然原料合成的一種聚酯。PHA是生物基生物降解材料&#xff0c;具有良好的生物相容性和可加工性。防止水汽的穿透是保鮮包裝中的重要指標&#xff0c;PHA 有良…

os.walk()遍歷文件夾/文件

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

P3 Qt 控件 —— pushButton

前言 &#x1f3ac; 個人主頁&#xff1a;ChenPi &#x1f43b;推薦專欄1: 《C_ChenPi的博客-CSDN博客》??? &#x1f525; 推薦專欄2: 《Linux C應用編程&#xff08;概念類&#xff09;_ChenPi的博客-CSDN博客》??? &#x1f33a;本篇簡介 &#xff1a;這一章我們學一…

Python evalml 庫:自動化機器學習的新前景

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在機器學習領域&#xff0c;evalml 庫嶄露頭角&#xff0c;為開發者提供了一個強大而高效的自動化機器學習框架。本文將深入介紹 evalml 的核心功能、使用方法以及在實際項目中的應用。通過詳實的示例代碼&#…

前端高頻面試題大全-面試必看

內容較多&#xff0c;建議查看目錄&#xff0c;方便食用 高頻 React和Vue的區別 通常解法&#xff1a;vue是采用指令結合vue-loader實現構件用戶界面的漸進式框架&#xff0c;React是采用JSX構件用戶界面的組件化開發 詳細解法&#xff1a;在渲染界面的時候DOM操作是昂貴的&…

【Linux系統編程】項目自動化構建工具make/Makefile

介紹&#xff1a; make和Makefile是用于編譯和構建C/C程序的工具和文件。Makefile是一個文本文件&#xff0c;其中包含了編譯和構建程序所需的規則和指令。它告訴make工具如何根據源代碼文件生成可執行文件&#xff0c;里面保存的是依賴關系和依賴方法。make是一個命令行工具&a…

智匯恒星科技|控樂屋.全宅智能冠軍代言來啦, 智慧家居千億藍海

隨著5G、大數據、云計算、物聯網等技術的發展&#xff0c;智能化正覆蓋人們生活的方方面面&#xff0c;全屋智能的出現為“一鍵式”智能家居生活享受提供無限可能。近年來智能家居行業總體規模增長迅速&#xff0c;數據顯示&#xff0c;2022年中國智能家居行業市場規模約為6200…

Java內部類

文章目錄 什么是 Java 中的內部類&#xff1f;有哪些類型的內部類&#xff1f;匿名內部類局部內部類&#xff08;定義在方法中的類&#xff09;局部內部類靜態內部類 Java 類中不僅可以定義變量和方法&#xff0c;還可以定義類&#xff0c;這樣定義在類內部的類就被稱為內部類。…

Java期末復習題之封裝

點擊返回標題->23年Java期末復習-CSDN博客 第1題. 定義一個類Person,定義name和age私有屬性&#xff0c;定義有參的構造方法對name和age進行初始化。在測試類中創建該類的2個對象&#xff0c;姓名、年齡分別為lili、19和lucy、20&#xff0c;在屏幕打印出2個對象的姓名和年齡…