1. 程式人生 > >SQL資料清洗

SQL資料清洗

大家好,我是jacky,很高興繼續跟大家分享《MySQL資料分析實戰》,從本節課程開始,我們的課程就會變得越來越實戰,也會越來越有意思了;
我們課程的主體叫MySQL資料分析實戰,那我們用MySQL來進行資料分析的時候,也一定會有其邏輯在的,大家想想我們無論從事任何的工作崗位,我們工作都是有我們的邏輯在的,可能有人會說,我的工作有什麼工作邏輯?那jacky說,那是因為我們的工作都太熟悉了,我們也沒有進行過總結,最簡單的來說,我們工作總會有先後順序吧,就是先做什麼,後做什麼,這也是一種邏輯;好,前面鋪墊了這麼多,jacky就是說,在實際工作中,用MySQL來做資料分析也是有它的邏輯在的,jacky給大家總結的單表操作的八句箴言,也是完成按照我們實際工作中的邏輯來編寫的;
前面jacky說過單表查詢的八句箴言第二句是:資料清洗兩條路,唯一where走一走;第三句:清洗資料有空值,is not 來去除;那jacky說第二句箴言,和第三句箴言我們結合著來講,這都屬於資料清洗的範疇;
本節課程,jacky將結合資料資料清洗的六大步驟,給大家解析八句箴言的第二、三、四句;

(一)本小節邏輯線(開篇鋪墊)-資料清洗的六大步驟

  • (1)資料預處理;
  • (2)去除(補全)有缺失的資料
  • (3)去除(修改)格式和內容錯誤的資料
  • (4)去除(修改)邏輯錯誤的資料
  • (5)去除不需要的資料
  • (6)關聯性驗證

第一步:資料預處理

  • 八句箴言第一句:不管三七二十一,先把資料show來看

  • 資料預處理說白了就是看兩件事:

    • (1)看描述資料的資訊:就是我們上次課講的看錶結構,SQL語句1;

    • (2)二是抽取一部分資料,使用人工檢視方式,對資料本身有一個直觀的瞭解,並且初步發現一些問題,為之後的處理做準備:這部分呢,jacky上次課也將了就是SQL語句2和SQL語句3;

第二步:去除(補全)有缺失的資料

SQL語句5:去除缺失資料-空值

select * from user where name is null; 
select * from user where name is not null;
  • 為了不打斷邏輯的完整性,關於空值和NULL值的相關內容,在系列課程的最後一個章節,請觀看《這些年踩過的坑-空值與NULL》,這裡jacky就不給大家過空值和NULL值的一些知識點,包括優化的一些內容,大家對應最後的一章檢視吧;

  • 我們開啟MySQL軟體,看一下message表,

select *
from message
  • 我們在向message表中插入一些空值和NULL的資料
insert into mess(name,content) values('','vvvvvvvvvv');
insert into mess(name,content) values('user7',null);

±—±------±-----------------------+
| id | name | content |
±—±------±-----------------------+
| 1 | user1 | dfdfdfdfd |
| 2 | user1 | aaaaaaaaa |
| 3 | user1 | ccccccccc |
| 4 | user2 | jjjjjjjjjj |
| 5 | user5 | hello world |
| 6 | user6 | weixin:run2lucky |
| 7 | user6 | gongzhognhao:shujudata |
| 8 | | vvvvvvvvvv |
| 9 | use7 | NULL |
±—±------±-----------------------+

SQL語句4:去除缺失資料- 用is not 去除null值

select * from mess where content is not null
select * from mess where content <>''
select * from mess where name <>'' and content is not null;
  • SQL語句5:用比較運算子去除空值

    • 下面jacky總結比較運算子的用法
    • 比較運算子:
運算子 含義
= 和~相等
<> 和~不相等
>= 大於等於~
> 大於~
<= 小於等於~
< 小於
  • 運算子很簡單,沒有必要每條來說,但有幾個主要注意的點:

    • 第一點:比較運算子不僅可以對資料這個資料型別的列進行比較,還能對包括字元、日期等所有資料型別和列進行比較;
insert into mess(name,content) values('user11','llllllllll'),('user32','kkkkkkkk');

對於字串來說,由於時間關係,jacky就不用MySQL舉例了,jacky把規則說一下:字串的比較是按字典順序進行排序的,我們一定要與數字的大小順序區分,什麼意思:

1<10<11<2<222<3

  • 注意第二點:

在MySQL中!= 與<>都是與~不相等的意思,但jacky這裡更傾向於用<>,因為這樣顯得更規範,也更相容其他的除MySQL外的資料庫軟體;

  • 關於如何填充缺失的資料,SQL能做,我們可以用SQL的AVG函式計算出平均值,在進行填充,但工作中有這麼用SQL清洗資料的嗎?沒有,我們都是用程式語言,這裡就略過了

第三步:去除(修改)格式和內容錯誤的資料

下面jacky來說下資料清洗的第三步,去除或修改格式和內容錯誤的資料,前面 jacky說資料清洗,是整個資料分析過程中不可缺少的一個環節,在實際操作中,資料清洗通常會佔用資料分析過程的80%的時間,如果說我們的資料是由我們企業內部系統日誌而來,那我們的資料來源,在格式和內容方面,一般來說,格式和內容會是比較結構化的,或者說是規範的,我們不用花太多的時間進行資料清洗,但如果說,我們的資料是由人工收集來的,或是多個數據源整合而來,那麼我們就要花時間對資料來源進行清洗;

  • 那清洗格式和內容錯誤的原則思想就是資料過濾,那什麼是資料過濾或者說當我們在工作中遇到需要用SQL清洗格式和內容有錯誤的資料時,我們首要要想到的是什麼?

    • 就是資料過濾的兩種方法:

      • (1)where過濾

        看一個人SQL水平高不高,你看他使用IN還是使用OR

      • (2)萬用字元過濾

3.1 先說where過濾

有朋友說,這where過濾不就是where 字句嗎?這有什麼好說的,但jacky看過太多工作中經常寫SQL的人,還真就是連where都寫不好,下面jacky給大家好好總結一下where字句,告訴大家看一個人SQL 用的水平高不高,其實看where 字句就能看出來:

  • where過濾的第一層次:單一查詢條件用where :真的沒啥好說的,太簡單了select * from message where age>30;

  • where 過濾的第二層次:多個查詢條件組合:

    • 關於多個查詢條件的whereSQL語句,玩的就是邏輯運算子,那邏輯運算子有哪幾個呢:AND、OR、IN、NOT

@資料分析-jacky

3.1.1 邏輯運算子之AND和OR

  • SQL語句7:AND先運算,OR後運算(AND運算子的優先順序高於OR運算子)想要優先執行OR運算子時就要使用括號。

3.1.2 邏輯運算子之OR和IN

  • SQL語句8:當在SQL語句中,用OR也行,用IN也行,那我們用IN就牛*,就專業,用OR就**了,就不專業

  • 為什麼IN要遠遠好過用OR呢?主要有四點理由:

    • (1)IN語法更清楚,更直觀

    • (2)在與其他AND和OR組合使用IN時,求值順序更容易管理

    • (3)這點是最最重要的就是,IN的效能更優,執行速度更快

    • (4)IN可以包含其他SELECT語句,OR不行

去重:

  • 合併去重:分組

  • “暴力去重”:distinct