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個聚集函式,它們很高效一般比你在自己的客戶端中計算的要快得多。