大家好,我是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

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
