官术网_书友最值得收藏!

1章 高效處理千萬(wàn)數(shù)據(jù)

小白進(jìn)入公司已經(jīng)一年有余,在自身的不斷努力下,工作表現(xiàn)出色,獲得領(lǐng)導(dǎo)及同事們的一致認(rèn)可與贊揚(yáng),并獲得“年度優(yōu)秀員工”稱號(hào)。

隨著公司的業(yè)務(wù)規(guī)模變大,業(yè)務(wù)運(yùn)營(yíng)數(shù)據(jù)也迅速增長(zhǎng)。為了充分利用好這些數(shù)據(jù),公司領(lǐng)導(dǎo)決定成立運(yùn)營(yíng)分析部門。Mr.林參加了公司內(nèi)部競(jìng)聘,通過(guò)層層篩選與選拔,眾望所歸地成為了運(yùn)營(yíng)分析部門的經(jīng)理,負(fù)責(zé)部門運(yùn)作及管理,為公司業(yè)務(wù)運(yùn)營(yíng)提供有效的數(shù)據(jù)分析支撐。

由于運(yùn)營(yíng)分析部門剛成立,急需招兵買馬,因此小白也成為Mr.林“心儀”的對(duì)象。

Mr.林找到小白:小白,愿意加入運(yùn)營(yíng)分析團(tuán)隊(duì)嗎?

小白興奮地說(shuō):當(dāng)然愿意啦!夢(mèng)寐以求的事情,我就擔(dān)心牛董不放人。

Mr.林:你放心!牛董那邊我去說(shuō),只要你愿意就行。我先找牛董要人,現(xiàn)在領(lǐng)導(dǎo)層都很重視運(yùn)營(yíng)分析工作,等事情定下了就通知你過(guò)來(lái)上班。

小白美滋滋地說(shuō):好的。

半小時(shí)后,Mr.林打電話給小白:小白,牛董已經(jīng)同意了,并且已經(jīng)通知HR安排其他同事跟你交接工作。你今天交接完工作,明天就帶上你的家當(dāng)過(guò)來(lái)吧。

小白很快就進(jìn)入了狀態(tài):遵命,領(lǐng)導(dǎo)。

第二天上班一大早小白帶著全部家當(dāng)來(lái)到Mr.林辦公桌前報(bào)到。

Mr.林驚訝地問(wèn):小白,你就這點(diǎn)家當(dāng)啊?除了一臺(tái)筆記本電腦外,就一個(gè)保溫杯、一個(gè)靠枕、一小瓶綠色植物、一本記事本,外加一支筆!跟我見(jiàn)到的其他女同事完全不一樣,她們還有各種五花八門的小擺設(shè)、小公仔等。

小白淡定地說(shuō):嘿嘿!我就喜歡簡(jiǎn)單,就像做數(shù)據(jù)分析一樣,簡(jiǎn)單而不空洞,能說(shuō)明問(wèn)題就好。

Mr.林面露喜悅之色:小白,我果然沒(méi)選錯(cuò)你,對(duì)我胃口。

小白向Mr.林略微彎了下腰說(shuō)道:Mr.林,請(qǐng)多多指教!

Mr.林:那我們就開(kāi)始工作吧!小白,先給你介紹下我們部門的主要職責(zé)。考一下你,數(shù)據(jù)分析在我們?nèi)粘=?jīng)營(yíng)分析工作中的作用體現(xiàn)在哪幾方面呢?

小白底氣十足:這個(gè)難不倒我,我剛進(jìn)公司的第一天,您就給我介紹了數(shù)據(jù)分析,談到它的作用。在我們?nèi)粘=?jīng)營(yíng)分析工作中,數(shù)據(jù)分析主要有三大作用,如圖1-1所示。

圖1-1 數(shù)據(jù)分析三大作用

正是因?yàn)槟嬖V我數(shù)據(jù)分析這三大作用,我才對(duì)數(shù)據(jù)分析有了更深刻的理解與認(rèn)識(shí),加上您傳授的實(shí)用數(shù)據(jù)分析方法與技巧,我對(duì)牛董交辦的工作,才能輕松自如地處理完成。

Mr.林:說(shuō)得一點(diǎn)也不錯(cuò)!我們運(yùn)營(yíng)分析部的工作正是基于數(shù)據(jù)分析這三大作用展開(kāi)的。所以,運(yùn)營(yíng)分析部的主要職責(zé)如下:

① 負(fù)責(zé)完成公司運(yùn)營(yíng)日?qǐng)?bào)、周報(bào)、月報(bào)等日常通報(bào),告訴公司領(lǐng)導(dǎo)及運(yùn)營(yíng)部門現(xiàn)階段公司整體運(yùn)營(yíng)情況,這是通過(guò)各個(gè)關(guān)鍵經(jīng)營(yíng)指標(biāo)完成情況來(lái)衡量的。

② 根據(jù)公司運(yùn)營(yíng)需要,開(kāi)展業(yè)務(wù)專題分析。比如基于日?qǐng)?bào)、周報(bào)、月報(bào)的現(xiàn)狀分析,我們對(duì)公司的運(yùn)營(yíng)情況有了基本了解,但這還不夠,還需要知道運(yùn)營(yíng)情況具體好在哪里,差在哪里,是什么原因引起的。這時(shí)就需要開(kāi)展原因分析,以進(jìn)一步確定業(yè)務(wù)變動(dòng)的具體原因。

③ 根據(jù)公司運(yùn)營(yíng)需要,開(kāi)展市場(chǎng)研究工作。如果現(xiàn)有數(shù)據(jù)無(wú)法滿足分析需求,就需要通過(guò)外部用戶調(diào)研進(jìn)行補(bǔ)充說(shuō)明,我們才能進(jìn)一步了解用戶的真實(shí)想法與需求。

④ 開(kāi)展預(yù)測(cè)分析,預(yù)測(cè)公司未來(lái)發(fā)展趨勢(shì),為公司制訂運(yùn)營(yíng)目標(biāo)及策略提供有效的決策依據(jù),以保證公司的可持續(xù)健康發(fā)展。

⑤ 搭建公司經(jīng)營(yíng)分析體系,指導(dǎo)公司業(yè)務(wù)運(yùn)營(yíng)。

以上5條就是我們運(yùn)營(yíng)分析部門現(xiàn)階段的主要工作職責(zé),我會(huì)帶領(lǐng)你和其他同事一起完成。

小白:好的,那我們接下來(lái)要做什么?

Mr.林:我要先對(duì)你進(jìn)行一些培訓(xùn),主要是數(shù)據(jù)處理與分析的應(yīng)用工具的培訓(xùn)。

小白滿臉疑惑地問(wèn)道:這些工作不是用Excel就可以完成么?

Mr.林:嘿嘿!Excel當(dāng)然是非常實(shí)用的數(shù)據(jù)分析工具,不過(guò)那是有前提條件的,因?yàn)镋xcel對(duì)數(shù)據(jù)有限制,Excel 97-2003版本,能容納的行與列數(shù)都是有限制的,具體如圖1-2所示,Excel 2007-2010版本最多也只有1048576行、16384列。

圖1-2 Excel各版本對(duì)數(shù)據(jù)的限制

現(xiàn)在已經(jīng)到了大數(shù)據(jù)時(shí)代,數(shù)據(jù)量動(dòng)不動(dòng)就超過(guò)百萬(wàn)條,Excel已經(jīng)滿足不了數(shù)據(jù)處理與分析的需求了。

沒(méi)等Mr.林說(shuō)完,小白又發(fā)問(wèn)了:什么是大數(shù)據(jù)呢?

Mr.林耐心地解釋道:大數(shù)據(jù)具有4大特點(diǎn),可以用4個(gè)“V”來(lái)概括,如圖1-3所示。

圖1-3 大數(shù)據(jù)4大特點(diǎn)

舉個(gè)例子,我們公司有1000多萬(wàn)的用戶,單單一個(gè)用戶信息表,Excel 2007—2010版本就無(wú)法容納得下,更別說(shuō)1000多萬(wàn)用戶的購(gòu)買行為數(shù)據(jù)。

這時(shí)候我們就要借助于數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的高效存儲(chǔ)、處理、分析。


1.1 最容易上手的數(shù)據(jù)庫(kù)

1.1.1 數(shù)據(jù)庫(kù)那些事兒

Mr.林:我們先來(lái)認(rèn)識(shí)下什么是數(shù)據(jù)庫(kù)吧!

小白迫不及待地說(shuō):非常期待,快開(kāi)始吧!

Mr.林:數(shù)據(jù)庫(kù)(Database)是按照數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù)。它利用數(shù)據(jù)庫(kù)中的各種對(duì)象,記錄、處理和分析各種數(shù)據(jù)。

隨著現(xiàn)代社會(huì)進(jìn)入信息時(shí)代,我們每天的工作和生活都離不開(kāi)各種信息。對(duì)這樣的海量數(shù)據(jù),這時(shí)就需要采用數(shù)據(jù)庫(kù)對(duì)其進(jìn)行有效的存儲(chǔ)與管理,并運(yùn)用數(shù)據(jù)庫(kù)進(jìn)行合理的處理與分析,使其轉(zhuǎn)化為有價(jià)值的數(shù)據(jù)信息。

圖1-3 大數(shù)據(jù)4大特點(diǎn)

一個(gè)通用數(shù)據(jù)庫(kù)具有以下幾項(xiàng)基本功能。

向數(shù)據(jù)庫(kù)中添加新數(shù)據(jù)記錄,例如增加用戶注冊(cè)信息。

編輯數(shù)據(jù)庫(kù)中的現(xiàn)有數(shù)據(jù),例如修改某個(gè)用戶信息。

刪除數(shù)據(jù)庫(kù)中信息記錄,例如刪除失去時(shí)效性的數(shù)據(jù),以釋放存儲(chǔ)空間。

以不同方式組織和查看數(shù)據(jù),例如對(duì)數(shù)據(jù)進(jìn)行查詢、處理與分析。

常用的數(shù)據(jù)庫(kù)有Oracle、Microsoft SQL Server、MySQL、Microsoft Access等關(guān)系型數(shù)據(jù)庫(kù),隨著大數(shù)據(jù)時(shí)代的到來(lái),相關(guān)的數(shù)據(jù)庫(kù)技術(shù)也快速發(fā)展,如基于NoSQL技術(shù)的分布式數(shù)據(jù)庫(kù)Hbase、MongoDB、Redis等。

Access數(shù)據(jù)庫(kù)

Mr.林:我們從關(guān)系型數(shù)據(jù)庫(kù)Access入手,因?yàn)樗鼔蛴押谩蚝?jiǎn)單,會(huì)讓我們的學(xué)習(xí)之旅更輕松。

小白:好的。

Mr.林:Access數(shù)據(jù)庫(kù)是Microsoft Office辦公軟件中一個(gè)極為重要的組成部分,是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)軟件,它能夠幫助用戶處理各種海量信息,不僅能存儲(chǔ)數(shù)據(jù),更重要的是還能夠?qū)?shù)據(jù)進(jìn)行處理和分析,數(shù)據(jù)處理功能比Excel更勝一籌。由于目前Access 2010為較為常用版本,所以我們將基于Access 2010來(lái)學(xué)習(xí)數(shù)據(jù)處理和分析(如圖1-5所示)。

圖1-5 Access數(shù)據(jù)庫(kù)示例

在Access 2010中,數(shù)據(jù)庫(kù)窗口中包含“表”、“查詢”、“窗體”、“報(bào)表”、“宏”、“模塊”六大對(duì)象。在數(shù)據(jù)庫(kù)中,“表”用來(lái)存儲(chǔ)數(shù)據(jù);“查詢”用來(lái)查找數(shù)據(jù);“窗體”、“報(bào)表”用于獲取數(shù)據(jù);而“宏”和“模塊”則用來(lái)實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)化操作。

Access 2010數(shù)據(jù)庫(kù)還提供了多種向?qū)А⑸善鳌⒛0澹褦?shù)據(jù)存儲(chǔ)、數(shù)據(jù)查詢、界面設(shè)計(jì)、報(bào)表生成等操作規(guī)范化,為建立功能完善的數(shù)據(jù)庫(kù)管理系統(tǒng)提供了方便,也使得普通用戶不必編寫代碼,就可以完成大部分?jǐn)?shù)據(jù)管理的任務(wù),操作簡(jiǎn)便,容易使用和掌握。

Access數(shù)據(jù)庫(kù)作為Microsoft Office辦公軟件包中的一員,它還可以與Excel、Word、Power-Point、Outlook等軟件進(jìn)行數(shù)據(jù)的交互與共享,例如分析報(bào)告的自動(dòng)化,后面我會(huì)進(jìn)一步介紹。

小白:好的。

Mr.林:下面我們就學(xué)習(xí)用Access 2010進(jìn)行數(shù)據(jù)處理與分析,用到的主要對(duì)象是:表和查詢。

(1)表

作為一個(gè)數(shù)據(jù)庫(kù),最基本的組成單位就是表。建立和規(guī)劃數(shù)據(jù)庫(kù),首先要做的就是建立各種數(shù)據(jù)表。數(shù)據(jù)表是數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)的唯一單位,數(shù)據(jù)庫(kù)將各種信息分門別類地存放在各種數(shù)據(jù)表中,例如用戶信息表、訂單表、采購(gòu)表等。

(2)查詢

查詢是數(shù)據(jù)庫(kù)中應(yīng)用最多的對(duì)象之一,可執(zhí)行很多不同的功能,最常用的功能是根據(jù)指定條件從表中檢索數(shù)據(jù)。

查詢和表的區(qū)別在于,查詢中的所有數(shù)據(jù)都不是真正單獨(dú)存在的。查詢實(shí)際上是一個(gè)固定的篩選,它根據(jù)指定條件將表中的數(shù)據(jù)篩選出來(lái),并以表的形式返回篩選結(jié)果。

在Access數(shù)據(jù)庫(kù)中,我們就是采用查詢方式進(jìn)行數(shù)據(jù)處理與分析的。

優(yōu)勢(shì)與不足

小白疑惑不解地問(wèn):為什么用Access數(shù)據(jù)庫(kù),而不用Oracle、Microsoft SQL Server等數(shù)據(jù)庫(kù)呢?

Mr.林:因?yàn)锳ccess數(shù)據(jù)庫(kù)與Oracle等其他關(guān)系型數(shù)據(jù)庫(kù)相比具有以下兩大優(yōu)勢(shì):

(1)操作界面友好,易操作

Access與Excel、PowerPoint、Word都是微軟Office產(chǎn)品,只要熟悉Excel、PowerPoint、Word中的任一款軟件,即使沒(méi)有數(shù)據(jù)庫(kù)經(jīng)驗(yàn),對(duì)Access也能快速上手。Access風(fēng)格與Windows完全一樣,用戶想要生成對(duì)象并應(yīng)用,只要使用鼠標(biāo)進(jìn)行拖放即可,非常直觀方便。并且作為Office辦公軟件的一部分,Access可以與Office其他軟件集成,實(shí)現(xiàn)無(wú)縫連接。

(2)Access查詢處理可直接生成相應(yīng)的SQL語(yǔ)句

通過(guò)Access查詢向?qū)гO(shè)置好需要的表關(guān)聯(lián)及查詢條件,單擊“SQL視圖”,即可獲取相應(yīng)的SQL語(yǔ)句,無(wú)須重新編寫。在此基礎(chǔ)上,還可以進(jìn)行簡(jiǎn)單的調(diào)整、優(yōu)化,即可轉(zhuǎn)化為所需的SQL語(yǔ)句,方便快捷。

小白心中釋然:那我就放心了,你沒(méi)說(shuō)之前,我還擔(dān)心數(shù)據(jù)庫(kù)比較難學(xué)呢。

Mr.林:不用擔(dān)心,有Mr.林在嘛,包教包會(huì),我們繼續(xù)。

有優(yōu)勢(shì),自然也有不足,Access是小型數(shù)據(jù)庫(kù),與Oracle等其他關(guān)系型數(shù)據(jù)庫(kù)相比存在以下不足。

數(shù)據(jù)庫(kù)過(guò)大時(shí)(一般Access數(shù)據(jù)庫(kù)文件百兆以上),其性能會(huì)變差。

記錄數(shù)過(guò)多時(shí)(一般記錄數(shù)達(dá)到千萬(wàn)條以上),其性能會(huì)變差。

Access數(shù)據(jù)庫(kù)中每個(gè)數(shù)據(jù)庫(kù)文件上限為2GB。

雖然Access數(shù)據(jù)庫(kù)存在以上三大不足,但并不妨礙我們使用它完成日常工作與學(xué)習(xí)任務(wù),因?yàn)橛盟鼘W(xué)習(xí)SQL處理數(shù)據(jù)真的很方便,不需要寫SQL語(yǔ)句。只要數(shù)據(jù)記錄不超億條,其處理速度還是可以接受的,數(shù)據(jù)記錄越少,其處理速度就越快。

1.1.2 萬(wàn)能的SQL

小白:Mr.林,你剛才提到了好幾次SQL,什么是SQL呀?

Mr.林: SQL(Structured Query Language)是結(jié)構(gòu)化查詢語(yǔ)言,它是一種通用的關(guān)系型數(shù)據(jù)庫(kù)操作語(yǔ)言。簡(jiǎn)單來(lái)說(shuō),它就是讓數(shù)據(jù)庫(kù)按我們的意思來(lái)實(shí)現(xiàn)查詢操作的語(yǔ)言。

說(shuō)到這里,小白靈機(jī)一動(dòng):我可不可以這樣理解:SQL就好比動(dòng)畫片《葫蘆娃兄弟》里那個(gè)女妖精手中的寶貝——如意,如意、如意,按我心意,快快顯靈……

Mr.林忍不住捧腹大笑:哈哈!我看行,還是你機(jī)靈,你這個(gè)比喻既生動(dòng)又形象。

由于SQL功能豐富強(qiáng)大,語(yǔ)言簡(jiǎn)潔易學(xué),使用方法靈活,目前所有主要的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都支持SQL。

雖然Access數(shù)據(jù)庫(kù)大部分查詢都可通過(guò)菜單完成,不需要用到SQL語(yǔ)句,但是如果想真正利用Access數(shù)據(jù)庫(kù)強(qiáng)大的數(shù)據(jù)處理、分析能力,那么掌握SQL是非常必要的。

作為一名優(yōu)秀的數(shù)據(jù)分析師,只有親自經(jīng)歷在數(shù)據(jù)庫(kù)中處理與分析數(shù)據(jù)的過(guò)程,才能對(duì)分析結(jié)果有更深層次的認(rèn)識(shí),同時(shí)也會(huì)加深對(duì)業(yè)務(wù)的理解,否則看到的只是一個(gè)個(gè)數(shù)字,并不能體會(huì)其內(nèi)涵。

另外,業(yè)內(nèi)人士常說(shuō)的數(shù)據(jù)挖掘,很多是通過(guò)對(duì)歷史數(shù)據(jù)進(jìn)行建模預(yù)測(cè),生成一定的規(guī)則,然后數(shù)據(jù)庫(kù)工程師將生成的規(guī)則編寫成相應(yīng)的SQL語(yǔ)句,并編寫成數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程,可定期執(zhí)行它們得到數(shù)據(jù)模型結(jié)果。

最后,處理大數(shù)據(jù)的Hadoop,所使用的Hive語(yǔ)言(HQL),也是與SQL語(yǔ)言基本一致,只不過(guò)部分語(yǔ)句的編寫或功能存在差異。掌握了SQL,再學(xué)習(xí)HQL就非常容易了。

小白:那么如何編寫SQL語(yǔ)句呢?

基本語(yǔ)法

Mr.林:我們現(xiàn)在來(lái)了解一下SQL基本語(yǔ)法,常用的SQL語(yǔ)句如圖1-6所示。

圖1-6 Access數(shù)據(jù)庫(kù)常用的SQL語(yǔ)句

我們做數(shù)據(jù)分析時(shí),在數(shù)據(jù)庫(kù)中主要的操作就是數(shù)據(jù)合并、數(shù)據(jù)分組、數(shù)據(jù)去重等,這些操作都是通過(guò)查詢來(lái)完成的。因此,數(shù)據(jù)查詢是數(shù)據(jù)庫(kù)的核心操作。而在SQL查詢語(yǔ)言中有一條查詢命令,即SELECT語(yǔ)句。

SELECT語(yǔ)句是SQL的核心語(yǔ)言,它能完成強(qiáng)大的查詢功能,根據(jù)指定的條件規(guī)則從數(shù)據(jù)庫(kù)中查詢出所要的數(shù)據(jù)。SELECT語(yǔ)句的基本語(yǔ)法是:

SELECT字段1,字段2,字段3,……
FROM表
WHERE條件

小白撓了撓頭:不是太明白,能否舉個(gè)例子?

Mr.林靈機(jī)一動(dòng):那好,我就給你舉生活中例子:假設(shè)你爸媽催你結(jié)婚,并且他們已經(jīng)上婚姻中介所幫你物色對(duì)象相親。

小白紅著小臉,不好意思地問(wèn)道:你怎么知道我爸媽在催我?

Mr.林:人之常情呀!老人家都希望自己兒女早點(diǎn)結(jié)婚,等著抱孫子呢!我們繼續(xù)剛才的例子。中介所工作人員從他們的會(huì)員數(shù)據(jù)庫(kù)中按你爸媽的要求篩選出目標(biāo)人選,供他們進(jìn)一步選擇,那么婚姻中介所的工作人員會(huì)在他的數(shù)據(jù)庫(kù)命令窗口寫下如下SQL語(yǔ)句:

SELECT姓名,性別,年齡,身高,婚姻狀況,教育背景,月收入,是否有房,是否有車,備注
FROM會(huì)員表
WHERE性別=男
AND年齡BETWEEN(26,30)
AND身高BETWEEN(170,180)
AND婚姻狀況=未婚
AND教育背景IN( 本科, 研究生)
AND月收入>=8000
AND是否有房=是
AND是否有車=是
AND備注IN ( 細(xì)心, 大方, 浪漫, 英俊, 紳士, 智慧 )
ORDER BY月收入DESC;

小白:您舉的這個(gè)生動(dòng)例子,確實(shí)很清晰直觀。

我爸媽的要求,不對(duì),差點(diǎn)被您繞暈了,應(yīng)該是您假設(shè)我爸媽的要求:首先必須是男的,年齡在26至30歲之間,身高在1米7至1米8之間,婚姻狀況為未婚,教育背景為本科或研究生,月收入不低于8000元,必須有房有車,還要求細(xì)心、大方、浪漫、英俊、紳士、智慧。最后篩出來(lái)的名單再按月收入降序排序。

Oh!My God!上哪找這樣條件的未婚男士?如果有的話,我就考慮考慮。

Mr.林:哈哈!小白,你入戲還真快,這么快就進(jìn)入角色了。

小白的臉?biāo)查g又紅了:Mr.林,您又在給我下套呀!不過(guò)這樣的例子確實(shí)很生動(dòng),一看就懂,我大概知道SELECT語(yǔ)句怎么用了。

注意事項(xiàng)

Mr.林:好的,現(xiàn)在我們一起來(lái)了解下編寫SQL語(yǔ)句時(shí)的一些注意事項(xiàng)。

① SQL語(yǔ)句中,英文字母大寫或小寫均可。

② 每個(gè)SQL語(yǔ)句的關(guān)鍵字用空格符號(hào)分隔,例如:

SELECT字段FROM表

③ 字段或參數(shù)之間用逗號(hào)分隔,例如:

SELECT姓名,性別,年齡,身高,教育背景
FROM會(huì)員表
WHERE教育背景IN( 本科 , 研究生 )

④ SQL語(yǔ)句中如參數(shù)為字符型,那么需要使用單引號(hào),數(shù)值型不使用單引號(hào),例如:

SELECT姓名,性別,月收入
FROM會(huì)員表
WHERE性別=男AND月收入>=8000

⑤ SQL語(yǔ)句結(jié)束時(shí),在語(yǔ)句結(jié)尾處添加分號(hào)。在Access數(shù)據(jù)庫(kù)中,用分號(hào)結(jié)束對(duì)于SQL語(yǔ)句不是必須的。

⑥ SQL語(yǔ)句中如表名、字段名中出現(xiàn)空格、“/”、“\”等特殊字符時(shí),需用方括號(hào)“[]”將含有特殊字符的表名或字段名括起來(lái),以免得到不正確的結(jié)果或SQL語(yǔ)句無(wú)法運(yùn)行。

⑦ SQL語(yǔ)句中,“*”代表選擇選定表格中的所有字段,并且按照其在數(shù)據(jù)庫(kù)中的固定順序來(lái)排序,例如:

SELECT * FROM表

⑧ 在函數(shù)參數(shù)或條件查詢中,如果參數(shù)或查詢條件為日期和時(shí)間類型數(shù)據(jù),需要在數(shù)據(jù)值兩端加上井字符號(hào)“#”,以表示數(shù)據(jù)類型為日期型。

⑨ SQL語(yǔ)句中使用的逗號(hào)、分號(hào)、單引號(hào)、括號(hào)等符號(hào)均為英文狀態(tài)下輸入的符號(hào)。

⑩ 應(yīng)盡量避免在數(shù)據(jù)庫(kù)中進(jìn)行全表掃描。首先應(yīng)考慮用WHERE子句篩選出需要的數(shù)據(jù),其次在WHERE子句中,應(yīng)盡量避免使用“!=”或“< >”、“OR”等,最后應(yīng)盡量避免在WHERE子句中對(duì)字段進(jìn)行函數(shù)操作,否則將進(jìn)行全表掃描。

其他注意事項(xiàng)等介紹到具體示例時(shí)再進(jìn)行講解。

小白:好的,您剛才說(shuō)的10條注意事項(xiàng)我都記下了,回去我再認(rèn)真復(fù)習(xí)復(fù)習(xí)。

1.1.3 兩招導(dǎo)入數(shù)據(jù)

Mr.林:小白,接下來(lái)我們學(xué)習(xí)如何將數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中。因?yàn)閿?shù)據(jù)量大才采用Access數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)處理與分析,而大型數(shù)據(jù)文件一般以TXT文本形式存儲(chǔ),所以我們主要學(xué)習(xí)如何導(dǎo)入TXT文本數(shù)據(jù)。還記得我教你的如何將TXT文本數(shù)據(jù)導(dǎo)入Excel么?

小白:當(dāng)然記得,工作中我常用呢。

Mr.林:很好,在Access數(shù)據(jù)庫(kù)中導(dǎo)入TXT文本數(shù)據(jù)與Excel中的操作步驟類似,都是按照一定的數(shù)據(jù)分隔符號(hào)或者數(shù)據(jù)寬度,將文本中的數(shù)據(jù)自動(dòng)分配到數(shù)據(jù)表中。

在Access數(shù)據(jù)庫(kù)中主要有兩種方式:一是直接導(dǎo)入法,二是建立鏈接法。下面以導(dǎo)入“訂購(gòu)明細(xì).txt”數(shù)據(jù)為例,一起來(lái)學(xué)習(xí)這兩種數(shù)據(jù)導(dǎo)入方法。

直接導(dǎo)入法

STEP 01 啟動(dòng)Access,單擊【文件】選項(xiàng)卡,單擊【新建】按鈕,在【可用模板】中選擇【空數(shù)據(jù)庫(kù)】,并為新建的數(shù)據(jù)庫(kù)文件命名,設(shè)置好存放路徑,最后單擊【創(chuàng)建】按鈕,如圖1-7所示。

圖1-7 新建數(shù)據(jù)庫(kù)文件

STEP 02 在創(chuàng)建好的數(shù)據(jù)庫(kù)中,單擊【外部數(shù)據(jù)】選項(xiàng)卡,在【導(dǎo)入并鏈接】組中單擊【文本文件】按鈕,彈出如圖1-8所示的對(duì)話框,瀏覽指定數(shù)據(jù)源,并在【指定數(shù)據(jù)在當(dāng)前數(shù)據(jù)庫(kù)中的存儲(chǔ)方式和存儲(chǔ)位置】項(xiàng)中,選中默認(rèn)的【將源數(shù)據(jù)導(dǎo)入當(dāng)前數(shù)據(jù)庫(kù)的新表中】項(xiàng),單擊【確定】按鈕。

圖1-8 【獲取外部數(shù)據(jù)—文本文件】對(duì)話框

STEP 03 在彈出的第一個(gè)【導(dǎo)入文本向?qū)А繉?duì)話框中,選中默認(rèn)的【帶分隔符】作為數(shù)據(jù)分隔方式,如圖1-9所示,單擊【下一步】按鈕。

圖1-9 【導(dǎo)入文本向?qū)А繉?duì)話框1

STEP 04 在彈出的第二個(gè)【導(dǎo)入文本向?qū)А繉?duì)話框中(如圖1-10所示),選擇【逗號(hào)】作為分隔符,并勾選【第一行包含字段名稱】復(fù)選框,單擊【下一步】按鈕。

圖1-10 【導(dǎo)入文本向?qū)А繉?duì)話框2

需要說(shuō)明的是,分隔符及第一行是否包含字段名稱需根據(jù)數(shù)據(jù)本身的實(shí)際情況進(jìn)行選擇,本例中為以逗號(hào)分隔,并且第一行包含字段名稱。

STEP 05 在彈出的第三個(gè)【導(dǎo)入文本向?qū)А繉?duì)話框中(如圖1-11所示),可對(duì)文本數(shù)據(jù)的各個(gè)字段名稱、數(shù)據(jù)類型、索引以及是否導(dǎo)入字段進(jìn)行設(shè)置,用戶可根據(jù)數(shù)據(jù)本身的實(shí)際情況進(jìn)行選擇與設(shè)置。本例采用默認(rèn)設(shè)置,單擊【下一步】按鈕。

圖1-11 【導(dǎo)入文本向?qū)А繉?duì)話框3

STEP 06 在彈出的第四個(gè)【導(dǎo)入文本向?qū)А繉?duì)話框中(如圖1-12所示),選擇【讓Access添加主鍵】,則Access數(shù)據(jù)庫(kù)會(huì)將“ID”字段添加為目標(biāo)表中的第一個(gè)字段,并且用從1開(kāi)始的唯一ID自動(dòng)填充它,單擊【完成】按鈕。

圖1-12 【導(dǎo)入文本向?qū)А繉?duì)話框4

STEP 07 在彈出的【保存導(dǎo)入步驟】對(duì)話框中保存詳細(xì)信息,有助于在以后重復(fù)執(zhí)行該操作,而不必每次都逐步完成向?qū)А?筛鶕?jù)數(shù)據(jù)導(dǎo)入的需求,選擇是否保存導(dǎo)入步驟,本例選擇不保存導(dǎo)入步驟,單擊【關(guān)閉】按鈕。

文本數(shù)據(jù)導(dǎo)入Access數(shù)據(jù)庫(kù)后的結(jié)果如圖1-13所示,用鼠標(biāo)雙擊左邊Access對(duì)象框里的“訂購(gòu)明細(xì)”表,即可在右邊窗口顯示產(chǎn)品訂購(gòu)明細(xì)。

圖1-13 文本數(shù)據(jù)導(dǎo)入結(jié)果

小白:Mr.林,剛才您說(shuō)到兩個(gè)新名詞“索引”、“主鍵”,這兩個(gè)是什么呀?

Mr.林:索引相當(dāng)于對(duì)指定的列進(jìn)行排序,它就好比是一本書的目錄,通過(guò)它可以快速查詢到結(jié)果,不需要進(jìn)行全表掃描,可以大大加快數(shù)據(jù)庫(kù)的查詢速度。

主鍵是確定數(shù)據(jù)中每一條記錄的唯一標(biāo)識(shí),其實(shí)也是一個(gè)索引,是一個(gè)特殊索引,因?yàn)橹麈I所在列里的每一個(gè)記錄都是唯一的,在同一個(gè)表里只能有一個(gè)主鍵。簡(jiǎn)單來(lái)說(shuō),主鍵就是所在列不能出現(xiàn)相同記錄的特殊索引,且這個(gè)索引只能在表里出現(xiàn)一次。

綜上所述,主鍵與索引的具體區(qū)別為以下四點(diǎn)。

① 主鍵用于標(biāo)識(shí)數(shù)據(jù)庫(kù)記錄的唯一性,不允許記錄重復(fù),且鍵值不能為空。主鍵也是一個(gè)特殊索引,主鍵等于索引,索引不一定等于主鍵。

② 索引可以提高查詢速度,通過(guò)它可以快速查詢到結(jié)果,不需要進(jìn)行全表掃描。

③ 使用主鍵,數(shù)據(jù)庫(kù)會(huì)自動(dòng)創(chuàng)建主索引,也可以在非主鍵上創(chuàng)建索引,提高查詢速度。

④ 數(shù)據(jù)表中只允許有一個(gè)主鍵,但是可以有多個(gè)索引。

在Access數(shù)據(jù)庫(kù)中,雖然主鍵不是必需的,但最好為每個(gè)表都設(shè)置一個(gè)主鍵,這樣可提高查詢速度。

小白點(diǎn)了點(diǎn)頭:明白。

建立鏈接法

Mr.林:現(xiàn)在我們來(lái)學(xué)習(xí)第二種導(dǎo)入方法:建立鏈接法。

建立鏈接法與直接導(dǎo)入法步驟基本類似,不同的地方就在于步驟2與步驟7。在步驟2中,對(duì)于【指定數(shù)據(jù)在當(dāng)前數(shù)據(jù)庫(kù)中的存儲(chǔ)方式和存儲(chǔ)位置】項(xiàng),更改為選中【通過(guò)創(chuàng)建鏈接表來(lái)鏈接到數(shù)據(jù)源】,如圖1-14所示。

圖1-14 【獲取外部數(shù)據(jù)—文本文件】對(duì)話框

因?yàn)檫@種方法是以鏈接方式建立數(shù)據(jù)庫(kù)與源數(shù)據(jù)的鏈接關(guān)系,所以只要不刪除,這個(gè)鏈接關(guān)系一直存在,也就無(wú)須【保存導(dǎo)入步驟】,所以采用鏈接方式就沒(méi)有步驟7。

其余數(shù)據(jù)導(dǎo)入操作步驟基本一致,小白,你可以事后自行練習(xí)這兩種文本數(shù)據(jù)導(dǎo)入方法。

小白:好的,您介紹的“直接導(dǎo)入法”與“建立鏈接法”這兩種方法之間有何區(qū)別呢?

Mr.林:你這個(gè)問(wèn)題問(wèn)得真好,不愧是做數(shù)據(jù)分析的好苗子。

★ 直接導(dǎo)入法:Access數(shù)據(jù)庫(kù)中的表與數(shù)據(jù)源脫離了聯(lián)系,對(duì)數(shù)據(jù)的更改不會(huì)影響源文本數(shù)據(jù)文件。

★ 建立鏈接法:鏈接表顯示源文本文件中的數(shù)據(jù),但是它實(shí)際上并不將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,對(duì)源文本文件進(jìn)行的任何更改都將自動(dòng)反映到鏈接表中,即數(shù)據(jù)會(huì)隨數(shù)據(jù)源的變化而自動(dòng)更新。

你可以根據(jù)實(shí)際需求,選擇“直接導(dǎo)入法”或“建立鏈接法”導(dǎo)入文本數(shù)據(jù)。

Mr.林:如果數(shù)據(jù)是以Excel格式存儲(chǔ)的,將Excel數(shù)據(jù)導(dǎo)入Access數(shù)據(jù)庫(kù)的步驟基本與TXT文本數(shù)據(jù)導(dǎo)入步驟類似,同樣你也可事后自行練習(xí)數(shù)據(jù)導(dǎo)入方法。

小白:好的。

1.1.4 數(shù)據(jù)合并的二三式

Mr.林:小白,接下來(lái)我們就要開(kāi)始學(xué)習(xí)用Access數(shù)據(jù)庫(kù)處理數(shù)據(jù)啦!再考一下你,什么是數(shù)據(jù)處理?數(shù)據(jù)處理主要包含哪些操作?

小白:這個(gè)難不倒我。數(shù)據(jù)處理就是根據(jù)數(shù)據(jù)分析的目的,將采集到的數(shù)據(jù),用適當(dāng)?shù)奶幚矸椒ㄕ砗图庸ぃ纬蛇m合數(shù)據(jù)分析要求的樣式,也就是一維表。它是數(shù)據(jù)分析前必不可少的階段。數(shù)據(jù)處理包括數(shù)據(jù)合并、數(shù)據(jù)計(jì)算、數(shù)據(jù)分組、數(shù)據(jù)去重等操作。

Mr.林:說(shuō)的沒(méi)錯(cuò),我們先來(lái)學(xué)習(xí)數(shù)據(jù)合并。數(shù)據(jù)合并包括橫向合并與縱向合并。

橫向合并

Mr.林:橫向合并就是從多個(gè)表中,根據(jù)各表共有的關(guān)鍵字段,把各表所需的記錄一一對(duì)應(yīng)起來(lái)。這個(gè)功能也相當(dāng)于Excel中的VLOOKUP精確匹配功能。

例如剛才導(dǎo)入的“訂購(gòu)明細(xì)”表,它只記錄了用戶訂購(gòu)單的相應(yīng)信息,但缺乏用戶的相關(guān)背景信息,如果要統(tǒng)計(jì)不同性別的用戶的產(chǎn)品購(gòu)買偏好,就必須獲得用戶的性別信息。這時(shí)就需要將“訂購(gòu)明細(xì)”表與“用戶明細(xì)”表根據(jù)關(guān)鍵字段“用戶ID”進(jìn)行關(guān)聯(lián)匹配查詢,如圖1-15所示。

圖1-15 “訂購(gòu)明細(xì)”表與“用戶明細(xì)”表關(guān)系圖

現(xiàn)在就看看在Access數(shù)據(jù)庫(kù)中如何實(shí)現(xiàn)數(shù)據(jù)橫向合并。

小白:接下來(lái)要先做什么呢?怎么做?

Mr.林:主要有兩種方式,一種是菜單操作法,另一種就是SQL查詢法。我們先學(xué)習(xí)菜單操作法。

(1)菜單操作法

首先,建立“訂購(gòu)明細(xì)”與“用戶明細(xì)”兩表的數(shù)據(jù)庫(kù)關(guān)系。

STEP 01 單擊【數(shù)據(jù)庫(kù)工具】選項(xiàng)卡,在【關(guān)系】組中單擊【關(guān)系】按鈕。

STEP 02 在彈出的【顯示表】對(duì)話框中,同時(shí)選中“訂購(gòu)明細(xì)”與“用戶明細(xì)”兩表(可結(jié)合Shift鍵同時(shí)選中,也可結(jié)合Ctrl鍵依次選中),如圖1-16所示。單擊【添加】按鈕,再單擊【關(guān)閉】按鈕,以關(guān)閉【顯示表】對(duì)話框。

圖1-16 【顯示表】對(duì)話框

STEP 03 在【關(guān)系管理器】中(如圖1-17所示),將“訂購(gòu)明細(xì)”表中的“用戶ID”字段用鼠標(biāo)拖到“用戶明細(xì)”表中的“用戶ID”字段處,松開(kāi)鼠標(biāo)。

圖1-17 關(guān)系管理器

STEP 04 在彈出【編輯關(guān)系】對(duì)話框中,單擊【聯(lián)接類型】按鈕,默認(rèn)選擇第一種關(guān)系【只包含兩個(gè)表中聯(lián)接字段相等的行】,單擊【確定】按鈕,返回【編輯關(guān)系】對(duì)話框,如圖1-18所示。

圖1-18 【編輯關(guān)系】與【聯(lián)接屬性】對(duì)話框

小白,這里需要注意:在本例中,我們確定“訂購(gòu)明細(xì)”表中的“用戶ID”記錄信息都在“用戶明細(xì)”表中,所以可以用第一種關(guān)系;反之,則需要選擇第三種關(guān)系,以確保“訂購(gòu)明細(xì)”表信息的完整性。

STEP 05 單擊【創(chuàng)建】按鈕,返回【關(guān)系管理器】,可以看到,在【關(guān)系】窗口中兩個(gè)表的“用戶ID”字段之間出現(xiàn)了一條關(guān)系連接線,如圖1-19所示。

圖1-19 兩表關(guān)系連接示例

STEP 06 單擊【保存】按鈕,并關(guān)閉【關(guān)系管理器】。

Mr.林:小白,這樣這兩張表的關(guān)系就建立好了。接下來(lái)就要執(zhí)行查詢步驟,從“訂購(gòu)明細(xì)”表中選取“產(chǎn)品”字段,從“用戶明細(xì)”表中選取“性別”字段,就能取出我們需要的不同用戶性別與所購(gòu)買產(chǎn)品一一對(duì)應(yīng)的明細(xì)數(shù)據(jù),以方便統(tǒng)計(jì)不同性別的用戶的產(chǎn)品購(gòu)買偏好。

可利用Access數(shù)據(jù)庫(kù)中“簡(jiǎn)單查詢”功能來(lái)實(shí)現(xiàn),具體查詢操作步驟如下。

STEP 01 單擊【創(chuàng)建】選項(xiàng)卡,在【查詢】組中單擊【查詢向?qū)А堪粹o。

STEP 02 在彈出的【新建查詢】對(duì)話框中,默認(rèn)選擇【簡(jiǎn)單查詢向?qū)А浚鐖D1-20所示,單擊【確定】按鈕。

圖1-20 【新建查詢】對(duì)話框

STEP 03 在彈出的【簡(jiǎn)單查詢向?qū)А康谝粋€(gè)對(duì)話框【表/查詢】項(xiàng)中,選擇“訂購(gòu)明細(xì)”表,并把“用戶ID”、“產(chǎn)品”兩個(gè)字段移至【選定字段】框中,如圖1-21所示。

圖1-21 【簡(jiǎn)單查詢向?qū)А繉?duì)話框1

STEP 04 在【簡(jiǎn)單查詢向?qū)А康诙€(gè)對(duì)話框【表/查詢】項(xiàng)中,選擇“用戶明細(xì)”表,并把“性別”字段移至【選定字段】框中,如圖1-22所示,單擊【完成】按鈕,在彈出的對(duì)話框中,單擊【保存】按鈕。

圖1-22 【簡(jiǎn)單查詢向?qū)А繉?duì)話框2

Mr.林:“訂購(gòu)明細(xì)”和“用戶明細(xì)”兩表聯(lián)合查詢的結(jié)果,如圖1-23所示。

圖1-23 簡(jiǎn)單查詢結(jié)果示例

還沒(méi)等Mr.林說(shuō)完,小白就搶著說(shuō):哇!結(jié)果出來(lái)啦,確實(shí)比Excel方便!如果用VLOOKUP匹配這么大量的數(shù)據(jù),至少也要好幾分鐘,要是匹配的字段較多,速度還會(huì)更慢。

Mr.林:沒(méi)錯(cuò),這就是數(shù)據(jù)庫(kù)具備的Excel所不具備的優(yōu)勢(shì)。在Access數(shù)據(jù)庫(kù)左側(cè)對(duì)象欄中可以發(fā)現(xiàn)比查詢前新增了一個(gè)查詢對(duì)象“訂購(gòu)明細(xì) 查詢”,這就是我們剛才新建的查詢。只要雙擊它,Access數(shù)據(jù)庫(kù)就會(huì)按指定的條件重新執(zhí)行查詢,如果數(shù)據(jù)量非常大,雙擊需謹(jǐn)慎!

小白笑嘻嘻地說(shuō):好的。

Mr.林:另外還有一種菜單操作法,如果你對(duì)Access查詢功能及原理比較熟悉,還可以用“查詢?cè)O(shè)計(jì)”新建查詢,相比“查詢向?qū)А睍?huì)快捷一點(diǎn),當(dāng)然這要看個(gè)人習(xí)慣與偏好,仁者見(jiàn)仁,智者見(jiàn)智。后面我會(huì)通過(guò)其他例子介紹“查詢?cè)O(shè)計(jì)”功能的使用方法。

小白:好的。

(2)SQL查詢法

Mr.林:現(xiàn)在我們就來(lái)學(xué)習(xí)SQL查詢法。小白,記得我之前提到Access數(shù)據(jù)庫(kù)中進(jìn)行查詢處理可直接生成相應(yīng)的SQL語(yǔ)句,不需要我們親自編寫SQL語(yǔ)句嗎?

小白:我記得呀!我也好奇到底Access數(shù)據(jù)庫(kù)是怎么生成相應(yīng)SQL語(yǔ)句的。

Mr.林故弄玄虛:呵呵!見(jiàn)證奇跡的時(shí)刻到了。在剛才的Access數(shù)據(jù)庫(kù)查詢結(jié)果窗口中(如圖1-23所示),單擊Access數(shù)據(jù)庫(kù)窗口最右下方的按鈕,效果如圖1-24所示。

圖1-24 SQL查詢視圖數(shù)據(jù)橫向合并示例

Mr.林:小白,你看SQL視圖窗口里不就是寫好的SQL語(yǔ)句嘛!

小白瞪大眼睛:咦!果然,很神奇。

Mr.林:Access數(shù)據(jù)庫(kù)可直接生成相應(yīng)的SQL語(yǔ)句,我說(shuō)的沒(méi)錯(cuò)吧?讓我們一起來(lái)看看生成的SQL語(yǔ)句與剛才的查詢操作是否能對(duì)應(yīng)上。

這一條SQL語(yǔ)句的意思是:選擇查詢“訂購(gòu)明細(xì)”表的“用戶ID”、“產(chǎn)品”字段,以及相對(duì)應(yīng)的“用戶明細(xì)”表中的“性別”字段,從“用戶明細(xì)”表內(nèi)連接“訂購(gòu)明細(xì)”表選擇,條件是“用戶明細(xì)”表的“用戶ID”字段與“訂購(gòu)明細(xì)”表的“用戶ID”字段相等。

沒(méi)錯(cuò),對(duì)上了,Access數(shù)據(jù)庫(kù)生成的SQL語(yǔ)句就是我們剛才聯(lián)合查詢的操作。

只需單擊【設(shè)計(jì)】選項(xiàng)卡中【結(jié)果】組的【運(yùn)行】按鈕,如圖1-24所示,Access數(shù)據(jù)庫(kù)就直接執(zhí)行查詢操作。

小白:那么,內(nèi)連接是什么意思呢?

Mr.林:這需要先了解下數(shù)據(jù)庫(kù)連接關(guān)系,主要包含內(nèi)連接(INNER JOIN)、左連接(LEFT JOIN)、右連接(RIGHT JOIN)三種數(shù)據(jù)庫(kù)關(guān)系,使用時(shí)請(qǐng)注意區(qū)分(如圖1-25所示)。

圖1-25 三種數(shù)據(jù)庫(kù)連接關(guān)系圖

★ 內(nèi)連接(INNER JOIN):選擇兩個(gè)表中關(guān)鍵字段相匹配的記錄,對(duì)應(yīng)圖1-18“聯(lián)接屬性”對(duì)話框中的第一個(gè)關(guān)系。

★ 左連接(LEFT JOIN):選擇第一個(gè)表中的所有記錄以及第二個(gè)表中與關(guān)鍵字段相匹配的記錄,對(duì)應(yīng)圖1-18“聯(lián)接屬性”對(duì)話框中的第二個(gè)關(guān)系。

★ 右連接(RIGHT JOIN):選擇第二個(gè)表中的所有記錄以及第一個(gè)表中與關(guān)鍵字段相匹配的記錄,對(duì)應(yīng)圖1-18“聯(lián)接屬性”對(duì)話框中的第三個(gè)關(guān)系。

小白:明白了。

Mr.林:這條SQL語(yǔ)句我們還可以進(jìn)一步簡(jiǎn)化為:

SELECT B.用戶ID, B.產(chǎn)品, A.性別
FROM用戶明細(xì)AS A, 訂購(gòu)明細(xì)AS B
WHERE A.用戶ID = B.用戶ID;

① 這條SQL語(yǔ)句的條件采用WHERE子句進(jìn)行編寫,相對(duì)內(nèi)連接(INNER JOIN)語(yǔ)法更容易理解。WHERE子句由一個(gè)運(yùn)算符 (WHERE) 及后面的條件表達(dá)式(A.用戶ID = B.用戶ID) 組成。Access數(shù)據(jù)庫(kù)會(huì)選擇出符合WHERE子句所列條件的記錄,如果沒(méi)有指定WHERE子句,查詢會(huì)返回表中的所有行。條件表達(dá)式的書寫規(guī)則如圖1-26所示。

圖1-26 條件表達(dá)式的書寫規(guī)則

② 這條SQL語(yǔ)句對(duì)“用戶明細(xì)”表和“訂購(gòu)明細(xì)”表的表名分別重新命名為A、B,用關(guān)鍵字AS來(lái)命名;在編寫SQL語(yǔ)句時(shí),關(guān)鍵字AS可省略,直接在原表名后加上別名,中間以空格分隔。

③ 如果需要從不同表引用字段,先寫上表名(或別名),再加上“點(diǎn)”(.),再加上相應(yīng)字段,以區(qū)分不同表的相同的字段名,防止出錯(cuò),提高查詢效率,特別是在各表有相同字段的情況下,例如:B.用戶ID。

④ 對(duì)字段名同樣可以重新命名,其方法與為表命名別名的方式一致。采用別名的好處在于可簡(jiǎn)化表名,使SQL語(yǔ)句清晰易懂、易編寫。

小白:明白,這些注意事項(xiàng)我都記下了。

縱向合并

Mr.林:現(xiàn)在我們來(lái)學(xué)習(xí)如何進(jìn)行數(shù)據(jù)的縱向合并,也就是數(shù)據(jù)記錄的合并。合并的表必須具有相同的字段結(jié)構(gòu),它們字段的數(shù)目必須相同,并且字段的數(shù)據(jù)類型也必須相同。

假設(shè)剛才的“訂購(gòu)明細(xì)”表是以每天一個(gè)表的方式存儲(chǔ)的,即每天的數(shù)據(jù)保存為一個(gè)表,如“訂購(gòu)明細(xì)20110901”、“訂購(gòu)明細(xì)20110902”、“訂購(gòu)明細(xì)20110903”、“訂購(gòu)明細(xì)20110904”等,現(xiàn)在需要把它們合并到一張表中。

(1)菜單操作法

我們可采用Access數(shù)據(jù)庫(kù)中“追加查詢”功能來(lái)實(shí)現(xiàn)。先看看如何把“訂購(gòu)明細(xì)20110902”表追加到“訂購(gòu)明細(xì)20110901”中,具體查詢操作步驟如下。

STEP 01 單擊【創(chuàng)建】選項(xiàng)卡,在【查詢】組中單擊【查詢?cè)O(shè)計(jì)】按鈕。

STEP 02 在彈出的【設(shè)計(jì)視圖】和【顯示表】對(duì)話框中,選擇“訂購(gòu)明細(xì)20110902”表,單擊【添加】按鈕將表添加進(jìn)查詢的【設(shè)計(jì)視圖】,如圖1-27所示。

圖1-27 查詢?cè)O(shè)計(jì)視圖——【顯示表】對(duì)話框

STEP 03 單擊【設(shè)計(jì)】選項(xiàng)卡【查詢類型】組的【追加】按鈕,彈出【追加】對(duì)話框,在【表名稱】下拉列表框中選擇“訂購(gòu)明細(xì)20110901”作為目標(biāo)表,如圖1-28所示。

圖1-28 追加查詢?cè)O(shè)計(jì)視圖—【追加】對(duì)話框

STEP 04 單擊【確定】按鈕,返回查詢的【設(shè)計(jì)視圖】,依次雙擊選擇“訂購(gòu)明細(xì)20110901”表中所有字段,被選擇的字段將在下面的查詢?cè)O(shè)計(jì)網(wǎng)格中顯示,如圖1-29所示。

圖1-29 追加查詢?cè)O(shè)計(jì)視圖—字段選擇

STEP 05 單擊【設(shè)計(jì)】選項(xiàng)卡中【結(jié)果】組的【運(yùn)行】按鈕(如圖1-30所示),Access數(shù)據(jù)庫(kù)將彈出如圖1-31所示的提示框,單擊【是】按鈕,Access數(shù)據(jù)庫(kù)直接執(zhí)行追加查詢操作。

圖1-30 【設(shè)計(jì)】選項(xiàng)卡

圖1-31 追加查詢操作提示框

雙擊“訂購(gòu)明細(xì)20110901”表可以查看追加查詢的結(jié)果。重復(fù)上述步驟,將“訂購(gòu)明細(xì)20110903”、“訂購(gòu)明細(xì)20110904”表中記錄,通過(guò)“追加查詢”功能追加至“訂購(gòu)明細(xì)20110901”表中,以完成數(shù)據(jù)縱向合并的目的。

如果不希望把各表數(shù)據(jù)記錄都追加至“訂購(gòu)明細(xì)20110901”表中,而希望追加至表名為“訂購(gòu)明細(xì)201109”的空白數(shù)據(jù)表,可新建一張數(shù)據(jù)結(jié)構(gòu)與“訂購(gòu)明細(xì)20110901”表一致,并且表名為“訂購(gòu)明細(xì)201109”的空白數(shù)據(jù)表,通過(guò)上述的“追加查詢”功能,將“訂購(gòu)明細(xì)20110901”等表追加至“訂購(gòu)明細(xì)201109”表中。

小白:原來(lái)如此。可是我有個(gè)問(wèn)題,如果需要合并的表較少,通過(guò)菜單操作還可接受,如果需要合并的表較多時(shí),這樣操作就比較麻煩了,該怎么辦?

(2)SQL查詢法

Mr.林:小白,你這個(gè)問(wèn)題很不錯(cuò),當(dāng)需要合并的表較多時(shí),這樣操作確實(shí)效率低下,我們可以轉(zhuǎn)變下思路,想一想能否采用SQL語(yǔ)句呢?

小白:對(duì)啊!我們可以從追加查詢的SQL視圖中取出相應(yīng)的SQL語(yǔ)句,只要更改要追加數(shù)據(jù)的表名,分別運(yùn)行,就比剛才重復(fù)菜單操作來(lái)得便捷。Mr.林,是這樣的嗎?

Mr.林:小白,不錯(cuò)啊!剛學(xué)的就馬上用上了,你說(shuō)的是一種思路,不過(guò)這樣也要分開(kāi)運(yùn)行多次,有幾個(gè)表就要運(yùn)行幾次,還是有點(diǎn)慢。我教你一個(gè)只要運(yùn)行一次的妙招。

小白張大嘴巴:還有這樣的妙招?Mr.林,快快教我。

Mr.林:就是用UNION ALL或UNION指令進(jìn)行兩表或多表合并,但是所有查詢中的列數(shù)和列的順序必須相同,數(shù)據(jù)類型必須兼容。

小白疑惑不解地問(wèn):這兩個(gè)指令有何不同呢?什么情況下該用UNION ALL?什么情況下該用UNION?

Mr.林:UNION ALL就是將各表的記錄合并到一起,并且對(duì)這些記錄不做任何更改。而UNION會(huì)刪除各表存在的重復(fù)記錄,并對(duì)記錄進(jìn)行自動(dòng)排序,這樣UNION比UNION ALL需要更多的計(jì)算資源,所以盡可能使用UNION ALL指令進(jìn)行各表合并。

一般需要使用UNION ALL指令的情況如下:

知道有重復(fù)記錄且想保留這些記錄。

知道不可能存在任何的重復(fù)記錄。

不在乎是否存在任何的重復(fù)記錄。

現(xiàn)在我們就來(lái)看看如何使用UNION ALL來(lái)合并9月1日—9月4日的4張當(dāng)日訂購(gòu)明細(xì)表,合并至“訂購(gòu)明細(xì)201109”的空白數(shù)據(jù)表,因?yàn)槲覀冎肋@4張當(dāng)日訂購(gòu)明細(xì)表之間不可能存在重復(fù)記錄,所以這里使用UNION ALL指令,具體步驟如下。

STEP 01 新建表名為“訂購(gòu)明細(xì)201109”的空白數(shù)據(jù)表,要求其表結(jié)構(gòu)、各字段數(shù)據(jù)類型與“訂購(gòu)明細(xì)20110901”表一致,相應(yīng)的SQL語(yǔ)句如下:

SELECT*INTO訂購(gòu)明細(xì)201109
FROM訂購(gòu)明細(xì)20110901
WHERE 1=2;

小白疑惑不解地問(wèn):為什么條件是“1=2”呢?

Mr.林:我們的目的是得到“訂購(gòu)明細(xì)20110901”表的結(jié)構(gòu),而不需要表里面的記錄,因而需要設(shè)置一個(gè)不可能存在的條件,因?yàn)?是不可能等于2的,所以在建立的“訂購(gòu)明細(xì)201109”表里將插入0條記錄,這樣就巧妙地新建一張表結(jié)構(gòu)、各字段數(shù)據(jù)類型與“訂購(gòu)明細(xì)20110901”表一致的空白數(shù)據(jù)表“訂購(gòu)明細(xì)201109”。

STEP 02 在剛才的Access數(shù)據(jù)庫(kù)追加查詢結(jié)果窗口中,單擊Access數(shù)據(jù)庫(kù)窗口最右下方的按鈕,得到如下SQL語(yǔ)句:

INSERT INTO訂購(gòu)明細(xì)20110901(訂單編號(hào),訂購(gòu)日期,用戶ID,產(chǎn)品,[單價(jià)(元)],數(shù)量,訂購(gòu)金額)
SELECT訂單編號(hào),訂購(gòu)日期,用戶ID,產(chǎn)品,[單價(jià)(元)],數(shù)量,訂購(gòu)金額
FROM訂購(gòu)明細(xì)20110902;

STEP 03 修改、添加相應(yīng)的SQL語(yǔ)句,結(jié)果如下(紅色加粗部分為修改、添加之處):

INSERT INTO訂購(gòu)明細(xì)201109(訂單編號(hào),訂購(gòu)日期,用戶ID,產(chǎn)品,[單價(jià)(元)],數(shù)量,訂購(gòu)金額)
SELECT訂單編號(hào),訂購(gòu)日期,用戶ID,產(chǎn)品,[單價(jià)(元)],數(shù)量,訂購(gòu)金額
FROM
(SELECT A.訂單編號(hào),A.訂購(gòu)日期,A.用戶ID,A.產(chǎn)品,A.[單價(jià)(元)],A.數(shù)量,A.訂購(gòu)金額
FROM訂購(gòu)明細(xì)20110901 AS A
UNION ALL
SELECT B.訂單編號(hào),B.訂購(gòu)日期,B.用戶ID,B.產(chǎn)品,B.[單價(jià)(元)],B.數(shù)量,B.訂購(gòu)金額
FROM訂購(gòu)明細(xì)20110902 AS B
UNION ALL
SELECT C.訂單編號(hào),C.訂購(gòu)日期,C.用戶ID,C.產(chǎn)品,C.[單價(jià)(元)],C.數(shù)量,C.訂購(gòu)金額
FROM訂購(gòu)明細(xì)20110903 AS C
UNION ALL
SELECT D.訂單編號(hào),D.訂購(gòu)日期,D.用戶ID,D.產(chǎn)品,D.[單價(jià)(元)],D.數(shù)量,D.訂購(gòu)金額
FROM訂購(gòu)明細(xì)20110904 AS D);

Mr.林看到小白疑惑不解的樣子,就繼續(xù)解釋:下面圓括號(hào)里的語(yǔ)句是子查詢語(yǔ)句,子查詢的結(jié)果將生成一張數(shù)據(jù)表,它將作為插入語(yǔ)句(INSERT INTO)的源表,這也叫嵌套查詢,原理就與IF函數(shù)的嵌套原理基本類似。

小白豁然開(kāi)朗:原來(lái)是這樣。

Mr.林:小白,你有沒(méi)有發(fā)現(xiàn),因?yàn)楦鱾€(gè)表的表結(jié)構(gòu)、數(shù)據(jù)類型都是一樣的,所以對(duì)于這段SQL語(yǔ)句我們還可以簡(jiǎn)化:

INSERT INTO訂購(gòu)明細(xì)201109
SELECT * FROM
(SELECT * FROM訂購(gòu)明細(xì)20110901
UNION ALL
SELECT * FROM訂購(gòu)明細(xì)20110902
UNION ALL
SELECT * FROM訂購(gòu)明細(xì)20110903
UNION ALL
SELECT * FROM訂購(gòu)明細(xì)20110904);

小白:果然簡(jiǎn)化了很多。這么說(shuō),當(dāng)多張表的表結(jié)構(gòu)、數(shù)據(jù)類型一樣時(shí),可以用“SELECT *”的方式查詢所有字段與記錄;當(dāng)多張表的表結(jié)構(gòu)、數(shù)據(jù)類型不一樣時(shí),就要單獨(dú)提出需要的字段,有時(shí)候甚至還要進(jìn)行字段類型的轉(zhuǎn)換,將各表對(duì)應(yīng)的各個(gè)字段類型統(tǒng)一,是這樣的嗎?

Mr.林:沒(méi)錯(cuò),孺子可教也!

接下來(lái)我們就要將修改好的SQL語(yǔ)句,復(fù)制至SQL視圖窗口運(yùn)行。

STEP 04 單擊【創(chuàng)建】選項(xiàng)卡,在【查詢】組中單擊【查詢?cè)O(shè)計(jì)】按鈕,關(guān)閉彈出查詢的【顯示表】對(duì)話框,單擊Access數(shù)據(jù)庫(kù)窗口右下方的按鈕,進(jìn)入SQL視圖窗口,將修改好的SQL語(yǔ)句復(fù)制至SQL視圖窗口,如圖1-32所示。

圖1-32 SQL查詢視圖數(shù)據(jù)縱向合并示例

STEP 05 單擊【設(shè)計(jì)】選項(xiàng)卡中【結(jié)果】組的【運(yùn)行】按鈕,如圖1-32所示,Access數(shù)據(jù)庫(kù)將彈出類似如圖1-31所示的提示框,單擊【是】按鈕,Access數(shù)據(jù)庫(kù)直接執(zhí)行追加查詢操作。

小白:Mr.林,我有個(gè)問(wèn)題,剛才建空白數(shù)據(jù)表“訂購(gòu)明細(xì)201109”的時(shí)候,我們只用了“訂購(gòu)明細(xì)20110901”的表結(jié)構(gòu),那為什么不把9月1日—9月4日4張當(dāng)日訂購(gòu)明細(xì)表的記錄也一起加進(jìn)去呢?

Mr.林:小白,不錯(cuò),有想法。剛才我介紹的是追加查詢的方法,你的提議是直接查詢并把數(shù)據(jù)添加至新表中,這是可行的。這樣好了,你來(lái)寫相應(yīng)的SQL語(yǔ)句。

小白不客氣地說(shuō):那我就班門弄斧啦!我這就寫來(lái):

SELECT*INTO訂購(gòu)明細(xì)201109
FROM
(SELECT*FROM訂購(gòu)明細(xì)20110901
UNION ALL
SELECT*FROM訂購(gòu)明細(xì)20110902
UNION ALL
SELECT*FROM訂購(gòu)明細(xì)20110903
UNION ALL
SELECT*FROM訂購(gòu)明細(xì)20110904);

小白寫完問(wèn)道:Mr.林,您看,是這樣的么?

Mr.林:咱們運(yùn)行一下,不就知道結(jié)果了嘛!

小白:好的,那我單擊“運(yùn)行”啦!哇,果真!這樣比較方便快捷,一步到位!

1.1.5 快速實(shí)現(xiàn)數(shù)據(jù)計(jì)算

Mr.林:小白,接下來(lái)學(xué)習(xí)在Access數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)計(jì)算,這里的數(shù)據(jù)計(jì)算是指對(duì)原有的字段進(jìn)行相應(yīng)的計(jì)算得到新的字段,以滿足我們的分析需求。你還記得數(shù)據(jù)計(jì)算有哪幾種方式么?

小白:當(dāng)然記得,工作中也常用到嘛!數(shù)據(jù)計(jì)算包括簡(jiǎn)單計(jì)算與函數(shù)計(jì)算。

簡(jiǎn)單計(jì)算就是加、減、乘、除等簡(jiǎn)單算術(shù)運(yùn)算。

函數(shù)計(jì)算就是通過(guò)軟件內(nèi)置的函數(shù)進(jìn)行計(jì)算,比如求和,求平均值、最大值、最小值等。

Mr.林:還不錯(cuò),都沒(méi)忘,那我們就先來(lái)學(xué)習(xí)Access數(shù)據(jù)庫(kù)中的簡(jiǎn)單計(jì)算。

簡(jiǎn)單計(jì)算

Mr.林:以“訂購(gòu)明細(xì)”表為例,這個(gè)表里面有每張訂單的詳細(xì)信息,如訂購(gòu)的“產(chǎn)品”、“單價(jià)”、“數(shù)量”、“訂購(gòu)金額”,這里的“訂購(gòu)金額”就是通過(guò)“單價(jià)”x“數(shù)量”計(jì)算而來(lái)。現(xiàn)在假設(shè)沒(méi)有這個(gè)“訂購(gòu)金額”字段,而需要通過(guò)簡(jiǎn)單計(jì)算方式來(lái)新增“訂購(gòu)金額”字段。

(1)菜單操作法

STEP 01 單擊【創(chuàng)建】選項(xiàng)卡,在【查詢】組中單擊【查詢?cè)O(shè)計(jì)】按鈕。

STEP 02 在彈出查詢的【設(shè)計(jì)視圖】和【顯示表】對(duì)話框中,選擇“訂購(gòu)明細(xì)”表,單擊【添加】按鈕將表添加進(jìn)查詢的【設(shè)計(jì)視圖】。

STEP 03 依次雙擊選擇“訂購(gòu)明細(xì)”表中所有字段,被選擇的字段會(huì)在下面的查詢?cè)O(shè)計(jì)網(wǎng)格中顯示,如圖1-33所示。

圖1-33 查詢?cè)O(shè)計(jì)視圖—字段選擇

STEP 04 在第8個(gè)字段表中輸入“訂單金額: [單價(jià)(元)]*[數(shù)量]”,表示“訂單金額=單價(jià)(元)×數(shù)量”,如圖1-33所示。

STEP 05 單擊【設(shè)計(jì)】選項(xiàng)卡中【結(jié)果】組的【運(yùn)行】按鈕,運(yùn)行結(jié)果如圖1-34所示。

圖1-34 簡(jiǎn)單計(jì)算的運(yùn)行結(jié)果

Mr.林:小白,你看,我們計(jì)算出來(lái)的“訂單金額”與原表的“訂購(gòu)金額”數(shù)據(jù)一致。

小白:沒(méi)錯(cuò),完全相等。

(2)SQL查詢法

Mr.林:我們?cè)賮?lái)看SQL查詢法。同理,在剛才的Access數(shù)據(jù)庫(kù)查詢結(jié)果窗口中,單擊Access數(shù)據(jù)庫(kù)窗口右下方的按鈕,得到如下簡(jiǎn)化的SQL語(yǔ)句:

SELECT訂單編號(hào),訂購(gòu)日期,用戶ID,產(chǎn)品,[單價(jià)(元)],數(shù)量,訂購(gòu)金額,[單價(jià)(元)]*[數(shù)量]AS訂單金額
FROM訂購(gòu)明細(xì);

可以看出,在SQL語(yǔ)句中進(jìn)行簡(jiǎn)單計(jì)算的方式,就是直接寫出運(yùn)算表達(dá)式,然后對(duì)新增的字段采用AS命令命名即可。

同樣,我們只需單擊【設(shè)計(jì)】選項(xiàng)卡中【結(jié)果】組的【運(yùn)行】按鈕,Access數(shù)據(jù)庫(kù)直接按照編寫好的SQL語(yǔ)句執(zhí)行相應(yīng)的查詢操作。

小白:確實(shí)簡(jiǎn)單、方便。

函數(shù)計(jì)算

Mr.林:我們繼續(xù)來(lái)學(xué)習(xí)Access數(shù)據(jù)庫(kù)中的函數(shù)計(jì)算。

假如,現(xiàn)在我們需要了解截至2011年年底用戶注冊(cè)天數(shù)的分布,以了解現(xiàn)有存量用戶的構(gòu)成情況,為后續(xù)用戶細(xì)分做準(zhǔn)備。數(shù)據(jù)庫(kù)中現(xiàn)有的“用戶明細(xì)”表只有用戶注冊(cè)日期,我們需要通過(guò)相應(yīng)的日期函數(shù)計(jì)算得到用戶注冊(cè)的天數(shù)。

我們可用DATEDIFF函數(shù),它的作用與Excel中的DATEDIF函數(shù)一致,但用法略有不同,不同之處在于日期間隔參數(shù)移至表達(dá)式前部,其參數(shù)設(shè)置及說(shuō)明詳見(jiàn)圖1-35,其語(yǔ)法如下:

圖1-35 DAtEDlff函數(shù)參數(shù)設(shè)置及說(shuō)明表

DATEDIFF("參數(shù)",起始日期,結(jié)束日期)

再次提醒:在函數(shù)參數(shù)或條件查詢中,若參數(shù)或查詢條件為日期和時(shí)間類型,需要在數(shù)據(jù)值兩端加上井字符號(hào)(#),以表示數(shù)據(jù)類型為日期型。

我們可以在如圖1-33所示的查詢?cè)O(shè)計(jì)網(wǎng)格字段中輸入函數(shù)進(jìn)行計(jì)算,也可以直接在SQL語(yǔ)句中進(jìn)行計(jì)算。在此以SQL語(yǔ)句應(yīng)用為例,編寫的SQL語(yǔ)句如下:

SELECT用戶ID,注冊(cè)日期,DATEDIFF("D",注冊(cè)日期,#2011-12-31#) AS注冊(cè)天數(shù)
FROM用戶明細(xì);

字段可根據(jù)實(shí)際需求選擇,盡量減少不必要的字段,字段越少越好,可大大提升系統(tǒng)運(yùn)行效率。

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中(操作步驟可參見(jiàn)前文),單擊【運(yùn)行】按鈕,得到如圖1-36所示的結(jié)果。

圖1-36 DAtEDlff函數(shù)計(jì)算結(jié)果示例

其他Access數(shù)據(jù)庫(kù)常用函數(shù)如圖1-37所示,可根據(jù)實(shí)際計(jì)算需求采用。

圖1-37 Access數(shù)據(jù)庫(kù)常用函數(shù)

小白:好的,我先記下,留著備用。

1.1.6 數(shù)據(jù)分組小妙招

Mr.林:小白,還記得數(shù)據(jù)分析三大基本方法么?

小白:當(dāng)然記得:對(duì)比、細(xì)分與預(yù)測(cè)。

Mr.林:是的,現(xiàn)在我們就要學(xué)習(xí)其中的細(xì)分方法,也就是數(shù)據(jù)分組。

進(jìn)行數(shù)據(jù)分析時(shí)不僅要對(duì)總體的數(shù)量特征和數(shù)量關(guān)系進(jìn)行分析,還要深入總體的內(nèi)部進(jìn)行分組分析。數(shù)據(jù)分組是一種重要的數(shù)據(jù)分析方法,這種方法根據(jù)數(shù)據(jù)分析對(duì)象的特征,按照一定的標(biāo)志(指標(biāo)),如業(yè)務(wù)、用戶屬性、時(shí)間等維度,把數(shù)據(jù)分析對(duì)象劃分為不同的部分和類型來(lái)進(jìn)行研究,以揭示其內(nèi)在的聯(lián)系和規(guī)律性。

常用的數(shù)據(jù)分組方式主要包括數(shù)值分組、日期/時(shí)間分組兩種。

數(shù)值分組

(1)IIF函數(shù)法

Mr.林:小白,還記得Excel中的IF函數(shù)吧?

小白:當(dāng)然,這個(gè)函數(shù)可好用了,IF與VLOOKUP函數(shù)相當(dāng)于萬(wàn)金油,是工作中用到最多的兩個(gè)函數(shù)。

Mr.林:現(xiàn)在我們要學(xué)的第一個(gè)用于數(shù)值分組的函數(shù)是IIF,它與Excel中的IF函數(shù)用法及功能一樣。在Access數(shù)據(jù)庫(kù)中,IIF函數(shù)最多可進(jìn)行13層嵌套,如果嵌套超過(guò)13層,運(yùn)行時(shí)Access數(shù)據(jù)庫(kù)將提示“表達(dá)式過(guò)于復(fù)雜”。

IIF函數(shù)語(yǔ)法如下:

IIF (表達(dá)式,表達(dá)式成立時(shí)返回的值,表達(dá)式不成立時(shí)返回的值)

仍以“用戶明細(xì)”表為例。表中有個(gè)“年齡”字段,我們需要了解用戶年齡結(jié)構(gòu),這時(shí)就需要對(duì)用戶年齡進(jìn)行分組。下面就采用IIF函數(shù)進(jìn)行分組,編寫的SQL語(yǔ)句如下:

SELECT用戶ID,年齡,
IIF(年齡<=20,"20歲及其以下",
IIF(年齡<=30,"21-30歲",
IIF(年齡<=40,"31-40歲",
"40歲以上"))) AS年齡分組
FROM用戶明細(xì);

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,得到如圖1-38所示的結(jié)果。

小白:果然,IIF函數(shù)的用法及效果與Excel中的IF函數(shù)一樣。

圖1-38 llf函數(shù)分組結(jié)果示例

(2)CHOOSE函數(shù)法

Mr.林:第二個(gè)用于數(shù)值分組的函數(shù)CHOOSE,它與Excel中的CHOOSE函數(shù)用法及功能一樣。CHOOSE函數(shù)語(yǔ)法如下:

CHOOSE (參數(shù),結(jié)果1,結(jié)果2,……,結(jié)果N)

說(shuō)明:

① 參數(shù)可為數(shù)值或表達(dá)式,如果參數(shù)或表達(dá)式返回的值為1,則函數(shù)CHOOSE返回結(jié)果1;如果參數(shù)或表達(dá)式返回的值為2,函數(shù)CHOOSE返回結(jié)果2,以此類推。

② 參數(shù)或表達(dá)式返回的值必須為1~254的數(shù)字,如果小于1或者大于254,則Access數(shù)據(jù)庫(kù)將返回錯(cuò)誤值“#VALUE!”。

③ 如果參數(shù)為小數(shù),則在使用前將被截尾取整,即相當(dāng)于Excel中的lNt函數(shù)效果。

仍以“用戶明細(xì)”表為例,對(duì)用戶年齡進(jìn)行分組,下面就采用CHOOSE函數(shù)進(jìn)行分組,編寫的SQL語(yǔ)句如下:

SELECT用戶ID,年齡,
CHOOSE((年齡-1)/10+1,"10歲及其以下","11-20歲","21-30歲","31-40歲","40歲以上") AS年齡分組
FROM用戶明細(xì);

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,得到如圖1-39所示的結(jié)果。

圖1-39 CHOOSE函數(shù)分組結(jié)果示例

小白:Mr.林,請(qǐng)教一個(gè)問(wèn)題,為何表達(dá)式為“(年齡-1)/10+1”?

Mr.林:我們可以分步來(lái)看。首先假設(shè)年齡范圍是1~10歲,那么“(年齡-1)/10”返回的值就落入[0,1)區(qū)間,而“(年齡-1)/10+1”返回的值就落入[1,2)區(qū)間,根據(jù)剛才介紹的函數(shù)說(shuō)明的第3點(diǎn)“如果參數(shù)為小數(shù),則在使用前將被截尾取整”原則,那么參數(shù)最終返回值為1,也就對(duì)應(yīng)第1個(gè)結(jié)果“10歲及其以下”,以此類推,就可把用戶年齡劃分為不同的范圍,從而保證各個(gè)用戶年齡都能落入正確的區(qū)間。

小白:原來(lái)如此,我明白了。

(3)SWITCH函數(shù)法

Mr.林:第三個(gè)用于數(shù)值分組的函數(shù)是SWITCH。SWITCH函數(shù)語(yǔ)法如下:

SWITCH (條件1,結(jié)果1,條件2,結(jié)果2,……,條件N,結(jié)果N)

說(shuō)明:

① 如果條件1為true,SWltCH將返回結(jié)果1,如果條件2為true,SWltCH將返回結(jié)果2,以此類推。

② 參數(shù)由成對(duì)的條件表達(dá)式和結(jié)果值組成,條件表達(dá)式按照從左到右的順序求值,將返回與第一個(gè)求值結(jié)果為true的表達(dá)式相對(duì)應(yīng)的結(jié)果值。

③ SWltCH函數(shù)在SQL語(yǔ)句中的條件表達(dá)式最多可以達(dá)到14個(gè),如果多于14個(gè)表達(dá)式,將提示錯(cuò)誤。

④ 如果所有表達(dá)式的結(jié)果值都不為true,SWltCH將返回Null。

我們?nèi)砸浴坝脩裘骷?xì)”表為例,對(duì)用戶年齡進(jìn)行分組。下面就采用SWITCH函數(shù)進(jìn)行分組,編寫的SQL語(yǔ)句如下:

SELECT用戶ID,年齡,
SWITCH(年齡<=20,"20歲及其以下",
   年齡<=30,"21-30歲",
   年齡<=40,"31-40歲",
   年齡>40,"40歲以上") AS年齡分組
FROM用戶明細(xì);

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,得到的結(jié)果與IIF函數(shù)分組結(jié)果一樣,如圖1-38所示。

小白:果然,SWITCH函數(shù)分組與IIF函數(shù)分組效果一樣,但SWITCH函數(shù)會(huì)讓人感覺(jué)分組更清晰些。

(4)PARTITION函數(shù)法

Mr.林:第四個(gè)用于數(shù)值分組的函數(shù)是PARTITION。PARTITION函數(shù)語(yǔ)法如下:

PARTITION (數(shù)值參數(shù),開(kāi)始值,結(jié)束值,組距)

說(shuō)明:

① 數(shù)值參數(shù)為要根據(jù)范圍進(jìn)行計(jì)算的整數(shù)。

② 開(kāi)始值必須為整數(shù),并且不能小于0。

③ 結(jié)束值也必須為整數(shù),該數(shù)值不能等于或小于開(kāi)始值。

④ 組距也必須為整數(shù),指定在整個(gè)數(shù)值范圍內(nèi)(在開(kāi)始值與結(jié)束值之間)的分區(qū)大小。

⑤ PARtltlON返回的內(nèi)容為每組的“下限:上限”。

我們?nèi)砸浴坝脩裘骷?xì)”表為例,對(duì)用戶年齡進(jìn)行分組。下面就采用PARTITION函數(shù)進(jìn)行分組,開(kāi)始值設(shè)置為1,結(jié)束值設(shè)置為100,組距設(shè)置為20,編寫的SQL語(yǔ)句如下:

SELECT用戶ID,年齡,
PARTITION(年齡,1,100,20) AS年齡分組
FROM用戶明細(xì);

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,得到的結(jié)果如圖1-40所示。

圖1-40 PARtltlON函數(shù)分組結(jié)果示例

小白:哇,用PARTITION函數(shù)分組更加簡(jiǎn)單、清晰、明了。

(5)四個(gè)分組函數(shù)的比較

小白:Mr.林,還有個(gè)問(wèn)題:這四個(gè)數(shù)值分組函數(shù),分別在什么情況下使用呢?

Mr.林:好的。我就來(lái)總結(jié)下這四個(gè)數(shù)值分組函數(shù)的優(yōu)缺點(diǎn),如圖1-41所示,這樣你可以根據(jù)實(shí)際情況選擇相應(yīng)的函數(shù)進(jìn)行數(shù)據(jù)分組。

圖1-41 四個(gè)分組函數(shù)的優(yōu)缺點(diǎn)比較

如果要進(jìn)行數(shù)值等距分組,可考慮使用PARTITION或CHOOSE函數(shù);如果要進(jìn)行數(shù)值不等距分組,可考慮使用SWITCH或IIF函數(shù)。

小白:經(jīng)過(guò)您這么歸納、總結(jié)和對(duì)比,四個(gè)數(shù)值分組函數(shù)的優(yōu)缺點(diǎn)很清晰直觀,我知道該如何選擇使用了。

日期/時(shí)間分組

Mr.林:介紹完數(shù)值分組,接下來(lái)學(xué)習(xí)對(duì)日期/時(shí)間的分組,這一類分組也是我們數(shù)據(jù)處理與分析工作中常用到的。

在Access數(shù)據(jù)庫(kù)中,除了可以采用YEAR、MONTH、DAY等常用日期函數(shù)(如圖1-37所示)進(jìn)行日期分組外,我們還可以采用FORMAT函數(shù)進(jìn)行日期/時(shí)間分組。FORMAT函數(shù)可對(duì)文本、數(shù)值、日期/時(shí)間等類型數(shù)據(jù)按指定要求進(jìn)行格式化,這里我們主要介紹FORMAT函數(shù)的日期/時(shí)間格式化功能。FORMAT函數(shù)的語(yǔ)法如下:

FORMAT(日期/時(shí)間,日期/時(shí)間格式參數(shù))

FORMAT函數(shù)中日期/時(shí)間相關(guān)的格式參數(shù)說(shuō)明如圖1-42所示。

圖1-42 fORMAt函數(shù)日期/時(shí)間參數(shù)說(shuō)明表

我們以“訂購(gòu)明細(xì)”表為例,對(duì)用戶訂購(gòu)日期依次按年、季、月、日、星期、小時(shí)、分、秒等8個(gè)日期/時(shí)間單位進(jìn)行格式化分組。下面就采用FORMAT函數(shù)進(jìn)行分組,編寫的SQL語(yǔ)句如下:

SELECT訂單編號(hào),訂購(gòu)日期,
FORMAT(訂購(gòu)日期,"yyyy") AS年,
FORMAT(訂購(gòu)日期,"q") AS季,
FORMAT(訂購(gòu)日期,"m") AS月,
FORMAT(訂購(gòu)日期,"d") AS日,
FORMAT(訂購(gòu)日期,"dddd") AS星期,
FORMAT(訂購(gòu)日期,"h") AS小時(shí),
FORMAT(訂購(gòu)日期,"n") AS分,
FORMAT(訂購(gòu)日期,"s") AS秒
FROM訂購(gòu)明細(xì);

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,得到的結(jié)果如圖1-43所示。

圖1-43 fORMAt函數(shù)日期/時(shí)間分組結(jié)果示例

小白:FORMAT函數(shù)真方便,我想要什么樣的日期/時(shí)間分組,就有什么樣的日期/時(shí)間分組。

1.1.7 重復(fù)數(shù)據(jù)巧處理

Mr.林:小白,還記得在Excel中處理重復(fù)數(shù)據(jù)的幾種方式嗎?

小白:當(dāng)然記得,有函數(shù)、條件格式標(biāo)識(shí)、高級(jí)篩選、數(shù)據(jù)透視表等方法。

Mr.林:沒(méi)錯(cuò),接下來(lái)學(xué)習(xí)Access數(shù)據(jù)庫(kù)中處理重復(fù)數(shù)據(jù)的方法,主要包含重復(fù)項(xiàng)查詢、不重復(fù)項(xiàng)查詢以及數(shù)據(jù)去重查詢,同樣也可以通過(guò)菜單操作、SQL語(yǔ)句兩種方式完成。

重復(fù)項(xiàng)查詢

(1)菜單操作法

Mr.林:小白,之前學(xué)習(xí)新建簡(jiǎn)單查詢時(shí),對(duì)話框里面就有一項(xiàng)“查找重復(fù)項(xiàng)查詢向?qū)А惫δ埽ㄈ鐖D1-20所示),下面就要用它來(lái)查找數(shù)據(jù)重復(fù)項(xiàng)。我們以查找“訂購(gòu)明細(xì)”表中重復(fù)的“用戶ID”為例,具體查詢操作如下。

STEP 01 單擊【創(chuàng)建】選項(xiàng)卡,在【查詢】組中單擊【查詢向?qū)А堪粹o。

STEP 02 在彈出的【新建查詢】對(duì)話框中,選擇【查找重復(fù)項(xiàng)查詢向?qū)А浚鐖D1-20所示,單擊【確定】按鈕。

STEP 03 在彈出的【查找重復(fù)項(xiàng)查詢向?qū)А康谝粋€(gè)對(duì)話框中,選擇【表】視圖,并在列表框中選擇“訂購(gòu)明細(xì)”表作為查詢對(duì)象,單擊【下一步】按鈕,如圖1-44所示。

圖1-44 【查找重復(fù)項(xiàng)查詢向?qū)А繉?duì)話框1

STEP 04 在【查找重復(fù)項(xiàng)查詢向?qū)А康诙€(gè)對(duì)話框【可用字段】列表框中,選擇“用戶ID”作為要進(jìn)行查找重復(fù)項(xiàng)查詢的字段,單擊【完成】按鈕,如圖1-45所示。

圖1-45 【查找重復(fù)項(xiàng)查詢向?qū)А繉?duì)話框2

Mr.林:查找“訂購(gòu)明細(xì)”表中“用戶ID”重復(fù)的結(jié)果,如圖1-46所示。從重復(fù)項(xiàng)查詢結(jié)果中可獲知兩個(gè)信息:重復(fù)訂購(gòu)的用戶ID,每個(gè)重復(fù)訂購(gòu)用戶所重復(fù)訂購(gòu)的次數(shù)。

圖1-46 重復(fù)項(xiàng)查詢結(jié)果示例

小白驚訝地說(shuō)道:哇!比Excel方便很多!如果用Excel數(shù)據(jù)透視表進(jìn)行重復(fù)用戶統(tǒng)計(jì),還需要把統(tǒng)計(jì)結(jié)果復(fù)制出來(lái),再篩選出訂購(gòu)次數(shù)大于或等于2次的結(jié)果。

Mr.林:沒(méi)錯(cuò),Access數(shù)據(jù)庫(kù)還能處理比Excel大得多的數(shù)據(jù),而且速度一點(diǎn)也不慢。

(2)SQL查詢法

小白:Mr.林,快單擊Access數(shù)據(jù)庫(kù)窗口右下方的按鈕,我想看看這個(gè)查找重復(fù)項(xiàng)算法是怎樣的,SQL語(yǔ)句是怎樣寫的。

Mr.林:好的。單擊Access數(shù)據(jù)庫(kù)窗口右下方的按鈕,其簡(jiǎn)化的SQL語(yǔ)句如下:

SELECT First(用戶ID),Count(用戶ID) AS NumberOfDups
FROM訂購(gòu)明細(xì)
GROUP BY用戶ID
HAVING Count(用戶ID)>1;

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,同樣可以得到如圖1-46所示的結(jié)果。

小白:咦!多了幾條陌生的語(yǔ)句,F(xiàn)irst、Count、GROUP BY、HAVING分別代表什么意思?Count,我知道,在Excel中是計(jì)數(shù)的意思,它在Access數(shù)據(jù)庫(kù)中也是計(jì)數(shù)的意思吧!

Mr.林:沒(méi)錯(cuò),Count就是計(jì)數(shù)的意思。

First,很簡(jiǎn)單,就是第一,在這里的意思就是第一條記錄。有第一就有最后,其函數(shù)為L(zhǎng)ast。如果有用戶重復(fù)訂購(gòu),那么我們也可不使用First函數(shù),直接用字段表示即可,“用戶ID”取哪個(gè)值都是一樣的。

GROUP BY子句就是實(shí)現(xiàn)對(duì)數(shù)據(jù)按指定的分組字段進(jìn)行分組,本例中按用戶進(jìn)行分組,這與數(shù)據(jù)透視表分組統(tǒng)計(jì)的道理是一致的。

HAVING子句在SELECT語(yǔ)句中與GROUP BY子句聯(lián)合使用,用于表示GROUP BY子句輸出結(jié)果的條件,其作用相當(dāng)于WHERE子句之于SELECT語(yǔ)句。即WHERE子句設(shè)定被選擇字段的條件,而HAVING子句設(shè)置GROUP BY子句形成的分組條件。

另外它們都需要使用關(guān)系比較運(yùn)算符:“=”、“<”、“>”、“<=”、“>=”或“<>”。

在本例中,“HAVING Count(用戶ID)>1”的意思就是對(duì)用戶ID出現(xiàn)2次及以上的數(shù)據(jù)進(jìn)行分組。

小白:明白了。

不重復(fù)項(xiàng)查詢

Mr.林:找出了重復(fù)項(xiàng),那么不重復(fù)項(xiàng)如何找呢,小白?

小白:我想想……有了,既然重復(fù)項(xiàng)是用戶訂購(gòu)次數(shù)大于或等于2次的結(jié)果,那么不重復(fù)項(xiàng)不就是用戶訂購(gòu)次數(shù)等于1的結(jié)果么?也就是說(shuō),我們只需在剛才查找重復(fù)項(xiàng)的SQL語(yǔ)句中,把“HAVING Count(用戶ID)>1”更改為“HAVING Count(用戶ID)=1”即可,是這樣的么,Mr.林?

Mr.林:真聰明!非常正確,加10分,查找不重復(fù)項(xiàng)的SQL語(yǔ)句如下:

SELECT用戶ID,Count(用戶ID) AS NumberOfDups
FROM訂購(gòu)明細(xì)
GROUP BY用戶ID
HAVING Count(用戶ID)=1;

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,同樣可以得到如圖1-47所示的結(jié)果。

圖1-47 不重復(fù)項(xiàng)查詢結(jié)果示例

小白:學(xué)會(huì)SQL語(yǔ)句確實(shí)很方便,數(shù)據(jù)處理起來(lái)杠杠的,一條SQL語(yǔ)句就搞定了。

數(shù)據(jù)去重查詢

Mr.林:小白,如果我要進(jìn)行數(shù)據(jù)去重——就是找出所有購(gòu)買行為的“用戶ID”,但只保留其中一條,在Excel 2007-2010版本有“刪除重復(fù)項(xiàng)”功能,那么在Access數(shù)據(jù)庫(kù)中如何處理呢?

(1)GROUP BY子句

小白:非常簡(jiǎn)單啊!剛才對(duì)重復(fù)項(xiàng)和不重復(fù)項(xiàng)的查找都是在HAVING子句設(shè)置GROUP BY子句形成的分組條件下進(jìn)行的,如果要去重,就不需要設(shè)置條件,顯示出所有唯一的“用戶ID”,直接用GROUP BY“用戶ID”字段即可,這個(gè)同樣與數(shù)據(jù)透視表分組統(tǒng)計(jì)的道理是一致的。

Mr.林:非常正確,再加10分,數(shù)據(jù)去重的SQL語(yǔ)句如下:

SELECT用戶ID
FROM訂購(gòu)明細(xì)
GROUP BY用戶ID;

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,可以得到如圖1-48所示的結(jié)果。

圖1-48 數(shù)據(jù)去重查詢結(jié)果示例

(2)DISTINCT

Mr.林:在Access數(shù)據(jù)庫(kù)中,我們還可以使用DISTINCT關(guān)鍵字,它的作用就是忽略所選字段中包含重復(fù)數(shù)據(jù)的記錄,簡(jiǎn)單來(lái)說(shuō),就是數(shù)據(jù)去重。對(duì)于剛才的例子:找出所有有購(gòu)買行為的“用戶ID”,但只保留其中一條,其SQL語(yǔ)句如下:

SELECT DISTINCT用戶ID
FROM訂購(gòu)明細(xì);

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,同樣可以得到如圖1-48所示的結(jié)果。

需要注意:如果SELECT子句中包含多個(gè)字段,則對(duì)于結(jié)果中包含的特定記錄,其所有字段的值組合必須是唯一的。

小白:好的。

1.1.8 數(shù)據(jù)分析一步到位

Mr.林:前面我們學(xué)習(xí)了Access數(shù)據(jù)庫(kù)中的數(shù)據(jù)合并、數(shù)據(jù)計(jì)算、數(shù)據(jù)分組、重復(fù)數(shù)據(jù)處理四大常用的數(shù)據(jù)處理方式。

而數(shù)據(jù)處理的目的就是將采集到的數(shù)據(jù),用適當(dāng)?shù)奶幚矸椒ㄕ砑庸ぃ纬蛇m合數(shù)據(jù)分析要求的樣式,也就是一維表,為數(shù)據(jù)分析做好準(zhǔn)備工作。

小白:我知道您的意思了,接下來(lái)是要進(jìn)行數(shù)據(jù)分析了吧?

Mr.林:沒(méi)錯(cuò)。我們?nèi)粘9ぷ髦兴龅臄?shù)據(jù)分析,主要指通過(guò)對(duì)比與細(xì)分進(jìn)行現(xiàn)狀分析及原因分析,通過(guò)數(shù)據(jù)分組了解其數(shù)據(jù)構(gòu)成,甚至通過(guò)不同時(shí)間維度的對(duì)比,查找數(shù)據(jù)變化的原因,最后通過(guò)制作相關(guān)圖表等對(duì)現(xiàn)狀進(jìn)行呈現(xiàn)及描述。

接下來(lái)學(xué)習(xí)在Access數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)分析的方法,主要包含簡(jiǎn)單統(tǒng)計(jì)、分組統(tǒng)計(jì)、交叉表統(tǒng)計(jì)三種方法,我主要介紹SQL語(yǔ)句實(shí)現(xiàn)方式。

小白:Mr.林,打斷一下,我發(fā)現(xiàn)Access數(shù)據(jù)庫(kù)中有數(shù)據(jù)透視表功能,為什么不用數(shù)據(jù)透視表進(jìn)行數(shù)據(jù)分析呢?

Mr.林:這個(gè)問(wèn)題問(wèn)得好。不用的原因是因?yàn)樵贏ccess數(shù)據(jù)庫(kù)中使用數(shù)據(jù)透視表時(shí),拖動(dòng)一個(gè)字段,Access數(shù)據(jù)庫(kù)就會(huì)計(jì)算一次,數(shù)據(jù)越多,其計(jì)算速度就越慢,也不知何時(shí)結(jié)束計(jì)算。如果每拖動(dòng)一次字段就這樣計(jì)算一次,你會(huì)瘋掉的!你可以事后自行測(cè)試一下。

而用SQL語(yǔ)句,你只需寫一次,直接單擊【運(yùn)行】按鈕即可。并且有運(yùn)行進(jìn)度條顯示運(yùn)行進(jìn)度,大大提高數(shù)據(jù)分析效率,所以我推薦用SQL語(yǔ)句進(jìn)行數(shù)據(jù)分析。

小白:明白,您繼續(xù)。

簡(jiǎn)單統(tǒng)計(jì)

Mr.林:在重復(fù)數(shù)據(jù)處理時(shí)我們已經(jīng)用到一個(gè)計(jì)數(shù)函數(shù)Count,這是最常用的統(tǒng)計(jì)函數(shù)之一。Access數(shù)據(jù)庫(kù)中常見(jiàn)的統(tǒng)計(jì)函數(shù)如圖1-49所示。

圖1-49 Access數(shù)據(jù)庫(kù)常用的統(tǒng)計(jì)函數(shù)

我們以“訂購(gòu)明細(xì)”表為例,統(tǒng)計(jì)“訂單總數(shù)”、“訂購(gòu)金額總額”、“平均訂單金額”三個(gè)數(shù)據(jù),SQL語(yǔ)句如下:

SELECT
Count(訂單編號(hào)) AS訂單總數(shù),
Sum(訂購(gòu)金額) AS訂購(gòu)金額總額,
Avg(訂購(gòu)金額) AS平均訂單金額
FROM訂購(gòu)明細(xì);

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,可以得到如圖1-50所示的結(jié)果。

圖1-50 簡(jiǎn)單統(tǒng)計(jì)結(jié)果示例

分組統(tǒng)計(jì)

Mr.林:小白,在學(xué)習(xí)重復(fù)數(shù)據(jù)處理時(shí)我們還用過(guò)一個(gè)GROUP BY子句,實(shí)現(xiàn)對(duì)數(shù)據(jù)按指定的分組字段進(jìn)行分組功能。

小白:對(duì),您說(shuō)這個(gè)與數(shù)據(jù)透視表分組統(tǒng)計(jì)的道理是一致的。

Mr.林:沒(méi)錯(cuò)。我們同樣以“訂購(gòu)明細(xì)”表為例,統(tǒng)計(jì)各個(gè)產(chǎn)品的“訂單總數(shù)”、“訂購(gòu)金額總額”、“平均訂單金額”的數(shù)據(jù),SQL語(yǔ)句如下:

SELECT產(chǎn)品,
Count(訂單編號(hào)) AS訂單總數(shù),
Sum(訂購(gòu)金額) AS訂購(gòu)金額總額,
Avg(訂購(gòu)金額) AS平均訂單金額
FROM訂購(gòu)明細(xì)
GROUP BY產(chǎn)品;

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,可以得到如圖1-51所示的結(jié)果。

圖1-51 產(chǎn)品分組統(tǒng)計(jì)結(jié)果示例

Mr.林:小白,你發(fā)現(xiàn)這個(gè)分組統(tǒng)計(jì)與剛才的簡(jiǎn)單統(tǒng)計(jì)SQL語(yǔ)句有什么區(qū)別嗎?

小白:發(fā)現(xiàn)了,就是在最后加上“GROUP BY產(chǎn)品”,并且在SELECT中增加“產(chǎn)品”字段。

Mr.林:是的,分組統(tǒng)計(jì)就是這么簡(jiǎn)單。再來(lái)看個(gè)復(fù)雜一點(diǎn)的案例。還是以“訂購(gòu)明細(xì)”表為例,我們需要了解用戶訂購(gòu)時(shí)段分布信息。原有“訂購(gòu)明細(xì)”表只有“訂購(gòu)日期”字段,需要取出時(shí)段信息,這時(shí)可采用FORMAT函數(shù),SQL語(yǔ)句如下:

SELECT FORMAT(訂購(gòu)日期,"h") AS時(shí)段,
Count(訂單編號(hào)) AS訂單數(shù)
FROM訂購(gòu)明細(xì)
GROUP BY FORMAT(訂購(gòu)日期,"h");

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,可以得到如圖1-52所示的結(jié)果。我們只需復(fù)制出統(tǒng)計(jì)結(jié)果,保存至Excel中,調(diào)整一下時(shí)段順序,即可繪制用戶訂購(gòu)時(shí)段分布圖。

圖1-52 時(shí)段分組統(tǒng)計(jì)結(jié)果示例

小白:哦,只要在原來(lái)的基礎(chǔ)上,把分組表達(dá)式當(dāng)作一個(gè)字段,放在GROUP BY后面,同時(shí)在SELECT中增加分組表達(dá)式,并重新命名。

Mr.林:是的,我們?cè)賮?lái)看個(gè)更復(fù)雜一點(diǎn)的案例。還是以“訂購(gòu)明細(xì)”表為例,我們需要了解不同年齡段的用戶訂購(gòu)分布情況,原有“訂購(gòu)明細(xì)”表中沒(méi)有用戶年齡信息,并且訂購(gòu)用戶存在重復(fù)情況,需要去重。

小白:確實(shí)又復(fù)雜了一些,怎么做呢?

Mr.林:先將“訂購(gòu)明細(xì)”表與“用戶明細(xì)”表按關(guān)鍵字段“用戶ID”進(jìn)行關(guān)聯(lián)查詢,并且可同時(shí)進(jìn)行去重處理,采用PARTITION函數(shù)法對(duì)用戶年齡分組,然后把查詢結(jié)果作為子查詢嵌套在分組統(tǒng)計(jì)查詢中。SQL語(yǔ)句如下:

SELECT年齡分組,Count(用戶ID) AS用戶數(shù)
FROM
(SELECT DISTINCT A.用戶ID, PARTITION(B.年齡,1,100,5) AS年齡分組
FROM訂購(gòu)明細(xì)A, 用戶明細(xì)B
WHERE A.用戶ID = B.用戶ID)
GROUP BY年齡分組;

將編寫好的SQL語(yǔ)句直接復(fù)制至一個(gè)新建的查詢SQL視圖窗口中,單擊【運(yùn)行】按鈕,可以得到如圖1-53所示的結(jié)果。

圖1-53 年齡分組統(tǒng)計(jì)結(jié)果示例

Mr.林:這里需要說(shuō)明的一點(diǎn)是:在Access數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)去重處理時(shí),需要使用嵌套查詢,把數(shù)據(jù)去重結(jié)果作為子查詢。如果本例需要了解的是各省的訂單數(shù)分布,無(wú)須先進(jìn)行數(shù)據(jù)去重處理,那么就無(wú)須使用嵌套查詢,SQL語(yǔ)句如下:

SELECT B.省份, Count(A.訂單編號(hào)) AS訂單數(shù)
FROM訂購(gòu)明細(xì)A, 用戶明細(xì)B
WHERE A.用戶ID = B.用戶ID
GROUP BY B.省份;

小白:明白!

交叉表統(tǒng)計(jì)

(1)菜單操作法

Mr.林:最后介紹交叉表統(tǒng)計(jì),這個(gè)需要借助“簡(jiǎn)單查詢”功能來(lái)實(shí)現(xiàn)。我們以“用戶明細(xì)”表為例,統(tǒng)計(jì)不同省份、性別的用戶分布情況,具體查詢操作步驟如下。

STEP 01 單擊【創(chuàng)建】選項(xiàng)卡,在【查詢】組中單擊【查詢向?qū)А堪粹o。

STEP 02 在彈出的【新建查詢】對(duì)話框中,選擇【交叉表查詢向?qū)А浚鐖D1-20所示,單擊【確定】按鈕。

STEP 03 在彈出的【交叉表查詢向?qū)А康谝粋€(gè)對(duì)話框中,選擇【表】視圖,并在列表框中選擇“用戶明細(xì)”表作為查詢對(duì)象,單擊【下一步】按鈕,如圖1-54所示。

圖1-54 【交叉表查詢向?qū)А繉?duì)話框1

STEP 04 在彈出的【交叉表查詢向?qū)А康诙€(gè)對(duì)話框【可用字段】列表框中,選擇“省份”作為行標(biāo)題,單擊【下一步】按鈕,如圖1-55所示。

圖1-55 【交叉表查詢向?qū)А繉?duì)話框2

STEP 05 在彈出的【交叉表查詢向?qū)А康谌齻€(gè)對(duì)話框字段列表框中,選擇“性別”作為列標(biāo)題,單擊【下一步】按鈕,如圖1-56所示。

圖1-56 【交叉表查詢向?qū)А繉?duì)話框3

STEP 06 在彈出的【交叉表查詢向?qū)А康谒膫€(gè)對(duì)話框【字段】列表框中,選擇“用戶ID”作為每個(gè)行和列的交叉點(diǎn)統(tǒng)計(jì)項(xiàng),并在【函數(shù)】列表框中,選擇“Count”函數(shù),并保持默認(rèn)勾選的【是,包括各行小計(jì)】項(xiàng),單擊【下一步】按鈕,如圖1-57所示。

圖1-57 【交叉表查詢向?qū)А繉?duì)話框4

STEP 07 在彈出的【交叉表查詢向?qū)А康谖鍌€(gè)對(duì)話框中,輸入該查詢的名稱,單擊【完成】按鈕,結(jié)果如圖1-58所示。

圖1-58 交叉表查詢結(jié)果

(2)SQL語(yǔ)句法

小白:Mr.林,單擊Access數(shù)據(jù)庫(kù)窗口右下方的按鈕,讓我瞧瞧SQL語(yǔ)句是怎樣寫的。

Mr.林:好的。我們單擊Access數(shù)據(jù)庫(kù)窗口右下方的按鈕,其簡(jiǎn)化的SQL語(yǔ)句如下:

TRANSFORM Count(用戶ID) AS用戶ID計(jì)數(shù)
SELECT省份,Count(用戶ID) AS總計(jì)用戶ID
FROM用戶明細(xì)
GROUP BY省份
PIVOT性別;

Mr.林:小白,你看出交叉表的SQL語(yǔ)句與我們剛才學(xué)的分組統(tǒng)計(jì)SQL語(yǔ)句的區(qū)別沒(méi)有?

小白:交叉表的SQL語(yǔ)句在分組統(tǒng)計(jì)SQL語(yǔ)句的基礎(chǔ)上,前后增加了TRANSFORM與PIVOT語(yǔ)句。

Mr.林:沒(méi)錯(cuò),只要在分組統(tǒng)計(jì)SQL語(yǔ)句的基礎(chǔ)上,前后增加TRANSFORM與PIVOT語(yǔ)句,并且在TRANSFORM后面增加每個(gè)行和列的交叉點(diǎn)統(tǒng)計(jì)函數(shù)及字段,在PIVOT后面增加要作為列標(biāo)題的分組字段即可。

其運(yùn)行結(jié)果與剛才的菜單操作法結(jié)果一樣,我就不再重復(fù)運(yùn)行了。小白,用Access數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)處理與分析的內(nèi)容就先介紹到這兒,現(xiàn)在你能真正體會(huì)用SQL語(yǔ)句處理與分析數(shù)據(jù)的強(qiáng)大與實(shí)用了吧!除了掌握基本原理,還要做到結(jié)合實(shí)際情況,融會(huì)貫通。

小白:確實(shí)不是一般的強(qiáng)大與實(shí)用。

主站蜘蛛池模板: 杂多县| 泸水县| 淮滨县| 葫芦岛市| 武冈市| 房产| 屯留县| 莱西市| 广南县| 关岭| 酉阳| 怀来县| 华阴市| 启东市| 青浦区| 辉县市| 孟津县| 莒南县| 孟津县| 获嘉县| 榆社县| 沁阳市| 江口县| 东城区| 梅州市| 武安市| 招远市| 上思县| 凌云县| 息烽县| 大石桥市| 神农架林区| 阿拉善盟| 彝良县| 新营市| 玛曲县| 志丹县| 阳曲县| 正定县| 白城市| 乌鲁木齐市|