數據分析系列——SQL 必知必會(三)

數據分析系列——SQL 必知必會(三)

此篇繼續學習SQL的進階操作

第七章 創建計算欄位

7.1 計算欄位

為什麼需要計算欄位:存儲在表中的數據不是應用程序所需要的,需要直接從資料庫中檢索出轉換、計算或格式化過的數據,而不是先檢索出數據,然後再在客戶端應用程序中重新格式化

7.2 拼接欄位

含 接到一起構成單個值

Access 和 SQL Sever版:

SELECT vend_name + ( + vend_country + )

FROM Vendors

ORDER BY vend_name;

DB2、Oracle、SQLite等:

SELECT vend_name || ( || vend_country || )

FROM Vendors

ORDER BY vend_name;

MySQL 和 MariaDB:

SELECT Concat(vend_name, ( , vend_country , ))

FROM Vendors

ORDER BY vend_name;

以上版本,在SELECT輸出時,結合成一個計算欄位的兩個列用空格填充;為正確返回格式化數據,需要去掉這些空格,對應的代碼為:

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()去掉字元串右邊的空格,LTRIM()去掉字元串左邊的空格,TRIM()去掉字元串左右兩邊的空格

使用別名,使計算欄位在客戶端也可以使用

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 Concat(vend_name, ( , vend_country , )) AS vend_title

FROM Vendors

ORDER BY vend_name;

7.3 執行算數計算

SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price

FROM OrderItems

WHERE order_number=2008;

註:SQL支持的基本算數操作符「+,-,*,/」

第八章 使用數據處理函數

8.1 函數

使用函數的困境:實現同一個功能,每一個DBMS都有自己特定的函數;只有少數幾個函數被所有主要的DBMS等同地支持,因此,SQL函數可移植性較低。

8.2 使用函數

文本處理函數:大多數SQL實現支持的函數

(1)UPPER():將文本轉化成大寫

SELECT vend_name , UPPER(vend_name) AS vend_name_upcase

FROM Vendors

ORDER BY vend_name;

(2)SOUNDEX():返回字元串的SOUNDEX值,將文本轉換為描述其語音表示的子母數字模式

SELECT cust_name, cust_contact

FROM Customers

WHERE cust_contact = Michael Green;

說明:此語句返回結果為空,因為Customers表中的聯繫名為Michelle Green,使用下面的代碼將成功查找內容

SELECT cust_name, cust_contact

FROM Customers

WHERE SOUNDEX(cust_contact) = SOUNDEX(Michael Green);

(3)其他文本處理函數

LEFT():返回字元串左邊的字元

LENGTH():返回字元串的長度

LOWER():將字元串轉換為小寫

日期和時間處理函數:可移植性最差

目標:檢索2012年的所有訂單

SQL Server

SELECT order_num

FROM Orders

WHERE DATEPART(yy, order_date) = 2012;

ACCESS

SELECT order_num

FROM Orders

WHERE DATEPART(yyyy, order_date) = 2012;

PostgreSQL

SELECT order_num

FROM Orders

WHERE DATE_PART(year, order_date) = 2012;

Oracle

SELECT order_num

FROM Orders

WHERE to_number(to_char( order_date,yyyy)) = 2012;

另一種方法:

SELECT order_num

FROM Orders

WHERE order_date BETWEEN to_date(01-01-2012) AND to_date(31-12-2012)

MYSQL:

SELECT order_num

FROM Orders

WHERE YEAR(order_date) = 2012;

SQLite

SELECT order_num

FROM Orders

WHERE strftime(%Y, order_date) = 2012;

數值處理函數:一致性、統一性較高

ABS():返回一個數的絕對值

COS():餘弦

EXP():指數

PI():圓周率

SIN():正弦

SQRT():平方根

TSN():正切

本章小結:函數的具體應用應結合DBMS,靈活使用

第九章 匯總數據

9.1 聚集函數

功能:確定表中行數;獲得表中某些行的和;找出表列的最大值、最小值、平均值

特點:聚集函數在各SQL實現中得到相當一致的支持

5個聚集函數:AVG(),COUNT(),MAX(),MIN(),SUM()

AVG():對表中的行數計數並計算其列值之和,求平均值

SELECT AVG(prod_price) AS avg_price

FROM Products;

SELECT AVG(prod_price) AS avg_price

FROM Products

WHERE vend_id = DLL01;

注:AVG()函數忽略列值為NULL的行

COUNT():確定表中行的數目或者符合特定條件的行的數目

(1)COUNT(*):對中行的數目進行計數,不管表列中包含的是空值還是非空值

SELECT COUNT(*) AS num_cust

FROM Customers;

(2)指定列名的計數:忽略指定列的值為空的行

SELECT COUNT(cust_email) AS num_cust

FROM Customers;

MAX/MIN():返回列中的最大(小)值

SELECT MAX(prod_price) AS max_price

FROM Products;

註:MAX、MIN函數忽略值為NULL的行;當用於文本數據時,MAX()返回按該列排序後的最後一行,MIN()返回最前面的行

SUM():返回指定列值的和,忽略列值為NULL的行

SELECT SUM(quantity) AS items_ordered

FROM OrderItems

WHERE order_num =20005;

SELECT SUM(quantity*item_price) AS total_price

FROM OrderItems

WHERE order_num =20005;

9.2 聚集不同值

SELECT AVG(DISTINCT prod_price) AS avg_price

FROM Products

WHERE vend_id = DLL01;

註:DISTINCT不能用於COUNT(*),必須使用列名,不能用於計算或表達式

9.3 組合聚集函數

包含多個聚集函數

SELECT COUNT(*) AS num_items,

MIN(prod_price) AS price_min,

Max(prod_price) AS price_max,

AVG(prod_price) AS price_avg,

FROM Products;

待續......


推薦閱讀:

一個優秀的商業分析師是如何煉成的
ch4 概率
數據分析五步驟
Kaggle競賽--泰坦尼克號生存預測
「大數據殺熟」?商家對數據的使用可能遠超出你的想像

TAG:資料庫 | 數據分析 | SQL |