1. 程式人生 > >SQL筆記(三)

SQL筆記(三)

本文章為系列文章,是學習《SLQ必知必會》(Ben Forta 著 人民郵電出版社出版)一書的筆記,因此文中大量引用了原書內容, 所以推薦想系統學習的同學閱讀原書。同時本文所涉及的相關知識及內容版權由《SLQ必知必會》(Ben Forta 著 人民郵電出版社出版)作者所有,如涉及作品內容、版權或其他問題,將在第一時間刪除。本文旨在研究學習使用,禁止用做商業用途。如有其他媒體、網站或個人從本網下載、連線或以其他形式的複製發表、使用所產生的版權等法律問題本站(本人)均不承擔責任。
部落格地址:http://blog.csdn.net/xiaoyuan511

七、建立計算欄位

計算欄位並不實際存在於資料庫中。計算欄位是執行時在SELECT語句內建立的。

欄位(field):基本上與列的意思相同,經常互換使用,不過資料庫列一般稱為列,而術語欄位通常與計算欄位一起使用。(只有資料庫知道SELECT語句中哪些列是實際的表列,哪些列是計算欄位。)

舉個實際的例子:一個一個報表需要一個值,表中有vend_name和vend_country兩列,同時需要用括號將vend_country括起來,但是這些東西並沒有儲存在表中,那麼該如何返回呢?

解決就是把兩個列拼接起來。在SQL的SELECT語句中可以用一個特殊的操作符來拼接兩個列。加號或者兩個豎。

拼接:將值連線到一起(將一個值附加到另一個值)構成單個值。例如:

SELECT vend_name + ‘(’ + vend_country + ‘)’ FROM Vendors ORDER BY vend_name;

或:

SELECT vend_name || ‘(’ || vend_country || ‘)’ FROM Vendors ORDER BY vend_name;

根據以上寫法返回的值會有空格的產生,但是很多時候我們並不需要這些空格,因此可以使用RTRIM()函式來完成。

SELECT vend_name || ‘(’ || RERIM(vend_country) || ‘)’ FROM Vendors ORDER BY vend_name;

RTRIM()會去掉值右邊的空格。

小技巧:RTRIM()回去掉右側的空格,LTRIM()會去掉左側的空格,而TRIM()則會去掉左右兩側的空格。

由上邊的例子可以知道,SELECT語句可以很好的拼接地址欄位,但是也可以看出他並沒有名字,那麼該如何使用呢?不要慌,SQL支援別名。也就是一個欄位或值的替換名。用AS關鍵字賦予。例如:

SELECT vend_name || ‘(’ || RERIM(vend_country) || ‘)’ AS vend_title FROM Vendors ORDER BY vend_name;

此時這個生成的新值他的欄位名就是vend_title。(注:別名可以是一個單詞也可以是一個字串,如果是字串的話應該括在一個括號裡,但是通常不建議這麼做,而是命名為一個單詞比較好。)

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

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

item_price列包含訂單中每項物品的單價。再乘以採購的數量的話,就可以按照下面方式寫出。

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

SQL中支援基本運演算法則:+ - * /

小提示:如何測試計算?

SELECT語句為測試、檢驗函式和計算提供了很好的方法。雖然SELECT通常用於從表中檢索資料,但是省略了FROM子句後就是簡單地訪問和處理表達式,例如”SELECT 3\2;“將返回6;”SELECT Trim(‘abc’);“將返回abc;”SELECT Now();*”使用Now()函式將返回當前的日期和時間。

八、使用函式處理資料

文字處理函式:

函式 說明
LEFT() 返回字串左邊的字元
RIGHT() 返回字串右邊的字元
LENGTH() 返回字串長度
LOWER() 將字串轉為小寫
UPPER() 將字串轉為大寫
LTRIM() 去掉字串左邊的空格
RTRIM() 去掉字串右邊的空格

日期和時間處理函式:

例如:檢索2012年所有的訂單:

SELECT order_num FROM Orders WHERE DATEPART(yy, order_date) = 2012;

在SQLite中有個小技巧:

SELECT order_num FROM Orders WHERE strftime(‘%Y’,order_date) = ‘2012’;

數值處理函式:

函式 說明
ABS() 返回一個數的絕對值
COS() 返回一個角度的餘弦
EXP() 返回一個數的指數值
PI() 返回圓周率
SIN() 返回一個角度的正弦
SQRT() 返回一個數的平方
TAN() 返回一個角度的正切

具體的函式支援請參閱所使用DBMS的相關文件。

九、彙總資料

以實際使用函式為主。相對於資料處理函式來說,聚集函式得到了相當一致的支援。

聚集函式列表如下:

函式 說明
AVG() 返回某列的平均值
COUNT() 返回某列的行數
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

因為這五個函式用法大致一樣,因此之舉AVG()一個例子:

SELECT AVG(prod_price) AS avg_price FROM Products WHERE vend_id = ‘DLL01’;

注意:AVG()只用於單個列,忽略列值為NULL的行。

聚集不同值:個人理解就是將要用於函式的列,只取其內部的不同值。例如:

SELECT AVG(DISTINCT prod_price) AS avg_price FROM Products WHERE vend_id = ‘DLL01’;

注意:DISTINCT不能用於count()。如果指定列名,則DISTINCT只能用於COUNT()。DISTINCT不能用於COUNT()。類似的,DISTINCT必須使用列名,不能用於計算或表示式。同樣,DISTINCT用於MAX()或MIN()是沒有意義的。

由上面可知,目前為止的所有聚集函式例子都只涉及單個函式。但是實際上,SELECT語句可根據需要包含多個聚集函式。如下:

SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS prod_max, AVG(prod_price) AS price_avg FROM Products;

SQL支援5個聚集函式,它們很高效一般比你在自己的客戶端中計算的要快得多。