標籤:

SQL基礎教程之數據處理

SQL基礎教程之數據處理

來自專欄小數據,大世界4 人贊了文章

資料庫就是專門處理處理數據、與數據打交道的一個工具。數據中的數據不僅只有數值型的數據、還有文本型數據、日期型的數據、等等還有其他類型的數據。

今天我們就來說說如何對SQL中數據做一下簡單的處理。這節課包含以下內容:計算欄位處理數據、函數處理數據、如何對數據進行分組以及如何對數據進行匯總。下面我們就開始吧!

world表(本教程使用的表)

一、計算欄位處理數據

(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 |