SQL基礎教程之數據處理
來自專欄小數據,大世界4 人贊了文章
資料庫就是專門處理處理數據、與數據打交道的一個工具。數據中的數據不僅只有數值型的數據、還有文本型數據、日期型的數據、等等還有其他類型的數據。
今天我們就來說說如何對SQL中數據做一下簡單的處理。這節課包含以下內容:計算欄位處理數據、函數處理數據、如何對數據進行分組以及如何對數據進行匯總。下面我們就開始吧!
一、計算欄位處理數據
(1)計算欄位是什麼?對於計算欄位,我個人的理解是:根據實際工作的需要,我們將SQL中列數據進行相應處理(運算、拼接),得到我們想要的欄位。這裡的欄位,可以理解為SQL中的列,但是它並不實際存在,而是我們創建的。
(2)如何創建計算欄位?計算欄位一般通過SELECT語句的方法創建的。比如下面這段代碼:
上面world表中,我們如何獲得每個國家的人均GDP呢?
SELECT name,gdp/population FROM world
結果:
通過上面的代碼,我們就創建一個人均GDP的計算欄位(gdp/population)
(3)計算欄位常用類型
1、拼接欄位:在實際工作中,我們需要將2個欄位拼接在一起。比如,有這樣一個表:客戶名稱、客戶地址兩列。在檢索數據時,需要將這兩列數據同時檢索出來,那麼拼接欄位的用處就顯現出來了。
需要拼接欄位,不同的資料庫有不同的操作符。Oracle 和 DB2 使用 "||"進行拼接,而Access和SQL Serve 使用「+」進行拼接,而MySql 和MariaDB使用「Concat」函數進行拼接。這裡我們使用MySql進行舉例,其他的拼接方式,有興趣的小夥伴,可以自己試試。
SELECT name,CONCAT(name," ",continent) FROM world
這裡將國家名和所在洲用一個「空格」符號聯結起來。
結果:
2、使用「別名」。如上面那段代碼,使用SELECT語句用CONCAT操作符創建一個計算欄位,如果只是看一下結果,這沒有什麼問題,但是如果要在資料庫客戶端調用這個創建的計算欄位,那就沒有辦法了。
這時我們可以在創建計算欄位時,使用AS語句為計算欄位創建一個別名。比如下面這段代碼:
SELECT name,CONCAT(name," ",continent) AS detail FROM world
結果:
上面這段代碼用「國家名」+「洲名」創建了一個名為「detail」的別名。
3、計算欄位。計算欄位是指SQL中檢索出的數據進行數學運算而創建的欄位。比如我們想知道每個國家人均GDP是多少?這個時候,計算欄位就派上用場了。
SELECT name, gdp/population AS gdp_personFROM world
結果:
上面的欄位「gdp_person」就是通過使用算術運算創建的「人均GDP」.
SQL中能進行的算術運算符包括:+(加)、-(減)、*(乘)、/(除)
二、函數處理數據
在介紹使用函數處理數據前,我們先介紹一下使用函數可能出現的問題。我們這裡主要介紹4種函數:文本函數、日期函數、數值處理函數。前兩種函數,各種主流的資料庫實現方式存在很大差異,這就導致在使用函數處理數據時,SQL語句的可移植性非常差。這點大家一定要謹記。
(一)文本函數:這裡我們介紹幾種常用的文本處理函數:
LEFT(string,n)--返回字元串左邊一定長度n的字元
RIGHT(string,n)--返回字元串右邊一定長度n的字元
LENGTH(string)--返回字元長的長度
LOWER(string)--將字元串轉為小寫
UPPER(string)--將字元串轉為大寫
LTRIM(string)--去掉字元串左邊的空格
RTRIM(string)--去掉字元串右邊的空格
TRIM(string)--去掉字元串所有的空格
SOUNDEX(string)--將字元串轉化為其發音的一種演算法
SELECT cust_name,cust_contact FROM customers WHERE SOUNDEX(cust_name) = soundex(『Manuli』);
上例中將「cust_name」的發音與「Manuli」進行比較。
上面的函數都比較簡單,這裡我就不一一舉例,有興趣的小夥伴們可以自己試試看哦!
(二)日期處理函數
日期處理函數在SQL具有重要的地位,可遺憾的是,這些函數的可移植性是最差的。
下面我列舉一些在MySql中常用的函數:
- 獲得當前日期+時間(date + time)函數:NOW()
SELECT NOW()
結果:
- 獲得當前日期(date)函數:CURDATE()
SELECT CURDATE()
結果:
- 獲得當前時間(time)函數:CURTIME()
SELECT CURTIME()
結果:
這裡我們只列舉這幾個日期函數,需要了解更多函數的小夥伴們,可以自己查看MySql的專業資料,這裡就不一一列舉了。
(三)數值處理函數
數值處理函數是所有資料庫最統一、一致的函數。常見的函數有以下幾個:
- ABS--返回絕對值
- PI--返回圓周率
- SQRT--返回一個數的平方根
- COS--返回餘弦
- SIN--返回正弦
以上是幾個常見的數值處理函數,有興趣的小夥伴可以查詢其他專業資料。
三、數據匯總
在工作中,我們不是總是需要將數據檢索出來,我需要數據的匯總情況。比如,我們想知道一個總共有多少個客戶在購買?再比如,我們想知道產品的平均售價是多少?對這些數據的處理,就需要SQL中的聚集函數。
(一)聚集函數:處理匯總數據信息的函數。
在SQL中,總共有5個聚集函數:AVG、COUNT、MAX、MIN、SUM。這些函數和上面提及的文本函數、時間函數、數值處理函數一樣,在使用時可以使用AS語句創建別名。下面我們分別來介紹一下:
1、AVG函數
AVG函數可以返回該列或行的平均值。比如,下面這段代碼:計算全球所有國家的平均GDP情況。
SELECT AVG(gdp) AS gdp_avgFROM world
結果:
AVG函數使用注意事項:
?AVG函數只能作用於單個列,並且列名必須作為函數參數。
?AVG函數忽略列中值為NULL的行。
2、COUNT函數
COUNT函數有兩種使用方式:
COUNT(*)--對表中的所有行進行計數,不論其值是否為空值(NULL)。 COUNT(列名)--對特定的進行計數,且忽略其中值為空值的行。
比如,我們想知道地球上到底有幾個國家??
SELECT COUNT(name) AS country_numFROM world
結果:
3、MAX函數
MAX返回指定列中的最大值。比如,我們想知道人口最多國家人口有多少?GDP最高的值是多少?
SELECT MAX(population) AS pop_max, MAX(gdp) AS gdp_maxFROM world
結果:
MAX用於非數值數據,將返回該列數據中最後一行數據。
4、MIN函數
MIN返回指定列中的最小值。比如,我們想知道人口最少的國家人口有多少?GDP最低的值是多少?
SELECT MIN(population) AS pop_min, MIN(gdp) AS gdp_minFROM world
結果:
MIN用於非數值數據,將返回該列數據中第一行的數據。
5、SUM函數
SUM返回指定列值的和。比如,我們想知道:全世界的總人口是多少?
SELECT SUM(population) AS pop_sumFROM world
結果:
SUM函數忽略列中數值為空值的行。
(二)聚集不同值
要對不同的值進行聚集,則必須指定DISTINCT參數。使用DISTINCT有幾點需要注意:
1、DISTINCT不能使用COUNT(*),只能使用於COUNT。
2、DISTINCT使用於MAX、MIN用處不大。
四、數據分組
上一小節中,我們學習了如何使用聚集函數進行數據匯總。但在實際應用中,可能會遇到這樣情況,我想要知道每個客戶購買量?或者,我們想要知道每一個洲人口是多少?這就需要讓「數據分組」大顯身手了。
(一)創建分組
數據分組是用SELECT語句中GROUP BY語句創建的。比如,我們想知道每個洲的人口是多少?
SELECT continent,SUM(population) AS pop_sumFROM worldGROUP BY continent
結果:
使用GROUP BY語句注意事項:
GROUP BY可以包含任意數目的列,也就是說GROUP BY可以嵌套。GROUP BY語句中列出的每一列都必須是檢索列或有效表達式。除聚集計算語句外,SELECT中出現的列,都必須在GROUP BY中給出。GROUP BY語句必須在WHERE語句之後,ORDER BY語句之前。
(二)分組過濾
在SQL中,對每一行過濾使用WHERE語句,而對分組進行過濾,則使用HAVING語句。比如,我們想知道人口在1億以上的洲有哪些?
SELECT continent,SUM(population) AS pop_sumFROM worldGROUP BY continentHAVING pop_sum > 100000000
結果:
比如,我們想知道:國家人口大於1千萬,洲人口大於1億的人口有多少?
SELECT continent,SUM(population) AS pop_sumFROM worldWHERE population > 10000000GROUP BY continentHAVING pop_sum > 100000000
結果:
這裡我們既使用了WHERE語句,對每個國家的人口進行了過濾,又使用了HAVING語句,對整個大洲的人口也進行了過濾。從上面的語句中,可以看出數據的差異。
從上面的的例子,我們可以這樣理解WHERE和HAVING語句:WHERE是用於分組前的過濾,而HAVING是用於分組後的過濾。
(三)分組的排序
雖然使用GROUP BY語句得到的結果,可能和使用ORDER BY語句得到順序一樣,但是如果需要對結果進行排序,必須使用ORDER BY語句,而不能依靠GROUP BY語句。這是保證正確排序的唯一方法。
總結:對數據進行處理的方式有:計算欄位、函數、匯總數據(5個聚集函數)、數據分組。
以上就是本人對SQL中數據處理的一些總結,如有不對之處,歡迎各位小夥伴們指正!!如果這篇文章對您有所幫助,麻煩您點個讚唄!!!
推薦閱讀:
※sqlzoo練習
※SQL面試,讓你的面試官無fu,ck可說,第17題難倒一片人
※像對象一樣對待數據
※如何理解Sql語言中ANY的用法?
※SQL
TAG:SQL |