更多課程 選擇中心
        Java培訓

        400-111-8989

        Java培訓 > Java教程  > 正文

        SQL實戰,從入門到熟練

        • 發布:Java培訓
        • 來源:Java教程
        • 時間:2017-02-14 15:28

        今天進入SQL實戰練習。SQL是數據庫的查詢語言,語法結構簡單,相信本文會讓你從入門到熟練。

        掌握SQL后,不論你是產品經理、運營人員或者數據分析師,都會讓你分析的能力邊界無限拓展。別猶豫了,趕快上車吧!

        以下的語句都在SequelPro的Query頁面運行,其他操作頁面不會有太大差異。標點符號必須為英文,這是新人很容易犯的錯誤。

        SQL最小化的查詢結構如下:

        select column from table

        table是我們的表名,column是我們想要查詢的字段/列,column可以用 * 代替,指代全部字段,意為從table表查詢所有數據。

        where 是基礎查詢語法,用于條件判斷。

        select * from DataAnalyst

        where city = '上海'

        【sql從入門到熟練】

        上圖是最簡化的查詢語句,將所有城市為上海的職位數據過濾出來。我們也可以用 and 進行多條件判斷。

        select * from DataAnalyst

        where city = '上海' and positionName = '數據分析師'

        or 語句則是或的關系

        select * from DataAnalyst

        where city = '上海' or positionName = '數據分析師'

        查找城市為上海,或者職位名稱是數據分析師的數據,它們是并集。

        當我們涉及到非常復雜的與或邏輯判斷,應該怎么辦?比如即滿足條件AB,又要滿足條件C,或者是滿足條件DE。此時需要用括號明確邏輯判斷的優先級。

        select * from DataAnalyst

        where (city = '上海' and positionName = '數據分析師') or (city = '北京' and positionName = '數據產品經理')

        這條語句的含義是查找出上海的數據分析師或者是北京的產品經理。當有括號時,會優先進行括號內的判斷,當有多個括號時,對最內層括號先進行判斷,然后依次往外。

        接下來的問題來了,當我們要查詢多個條件,比如北京上海廣州深圳南京這些城市,難道一個個用and關聯起來?這太麻煩了,我們可以使用 in 。

        select * from DataAnalyst

        where city in ('北京','上海','廣州','深圳','南京')

        當我們遇到字段數據類型是數值時,也可以使用符號> 、>=、< 、<=、!= 進行邏輯判斷,!= 指的是不等于,等價于 <> 。

        select * from DataAnalyst

        where companyId >= 10000

        上例是篩選出公司ID >= 10000的職位,為數值時,不需要像字符串一樣加引號。

        當我們需要取區間數值時,使用 between and

        select * from DataAnalyst

        where companyId between 10000 and 20000

        between and 包括數值兩端的邊界,等同于 companyId >=10000 and companyId <= 20000。

        如果要模糊查找,能用like。

        select * from DataAnalyst

        where positionName like '%數據分析%'

        語句的含義是在positionName列查找包含「數據分析」字段的數據,%代表的是通配符,含義是無所謂「數據分析」前面后面是什么內容。如果是 '數據分析%' ,則代表字段必須以數據分析開頭,無所謂后面是什么。

        除了上面所講,還有一個常用的語法是not,代表邏輯的逆轉,常見not in、not like、not null等。

        接下來我們學習group by,它是數據分析中常見的語法,目的是將數據按組/維度劃分。類似于Excel中的數據透視表,我們以city為例。

        select * from DataAnalyst

        group by city

        【sql從入門到熟練】

        它將城市劃分成幾組,通過group by 可以快速的瀏覽數據有哪些城市。我們看一下它的高階用法。

        select city,count(1) from DataAnalyst

        group by city

        【sql從入門到熟練】

        上述語句,使用count函數,統計計數了每個城市擁有的職位數量。括號里面的1代表以第一列為計數標準。這里出現新的問題,當我們遇到重復數據怎么辦?在DataAnalyst 這張表中,北京職位包含重復的職位ID,我們需要去重。

        select city,count(distinct positionId) from DataAnalyst

        group by city

        【sql從入門到熟練】

        北京的數據一下子少了2000,多余的重復值被排除在外。distinct 是去重函數,distinct positionId 會只計算唯一的positionId個數。日常工作中,活躍用戶數、文章UV,都是用distinct 計算獲得,這是唯一標示符ID的重要作用。

        除了count,還有max,min,sum,avg等函數,也叫做聚合函數。用法和Excel沒什么區別。

        當我們在group by 添加多個字段,它將以多維的形式進行數據聚合。

        select city,workYear,count(distinct positionId) from DataAnalyst

        group by city,workYear

        【sql從入門到熟練】

        這就是數據分析師常用的多維分析法,通過group by 切分不同的維度進行對比,在不利用BI的情況下,通過SQL進行快速數據分析。

        接下來學習邏輯判斷,SQL也有if函數,和Excel的用法一摸一樣,通過它我們能進行復雜的運算。比如我想統計各個城市中有多少數據分析職位,其中,電商領域的職位有多少,在其中的占比?

        industryField是公司的行業領域,雖然我們能用where like 計算出有幾個電商的數據分析師,但是占比的計算會比較麻煩,此時可以用if。

        select if(industryField like '%

        【sql從入門到熟練】

        上面的公式利用if判斷出哪些是電商行業的數據分析師,哪些不是。if函數中間的字段代表為true時返回的值,不過因為包含重復數據,我們需要將其改成positionId。之后,用它與group by 組合就能達成目的了。

        select city,

        count(distinct positionId),

        count(if(industryField like '%電子商務%',positionId,null))

        from DataAnalyst

        group by city

        【sql從入門到熟練】

        第一列數字是職位總數,第二列是電商領域的職位數,相除就是占比。記住,count是不論0還是1都會納入計數,所以第三個參數需要寫成null,代表不是電商的職位就排除在計算之外。

        接下來是新的問題,如果我想找出各個城市,數據分析師崗位數量在500以上的城市有哪些,應該怎么計算?有兩種方法,第一種,是使用having語句,它對聚合后的數據結果進行過濾。

        select city,count(distinct positionId) from DataAnalyst

        group by city having count(distinct positionId) >= 500

        【sql從入門到熟練】

        第二種,是利用嵌套子查詢。

        【sql從入門到熟練】

        我們將第一次查詢獲得的城市職位數的結果,看作一張新的表,利用as 將它命名為t1( table1 的簡寫),將職位數命名為一個新的字段counts。然后外面再套一層select 過濾出counts >=500。

        這種查詢方式就叫嵌套子查詢,使用場景比較廣泛,where 后面也能跟子查詢。

        很多時候,數據是凌亂的,我們希望結果能夠呈現一定的順序,這時候就用到order by語句。

        select city,count(distinct positionId) as counts from DataAnalyst

        group by city

        order by counts

        【sql從入門到熟練】

        看,數據就按照統計結果升序排列,如果需要降序,則是order by counts desc,后面加一個desc就好了。如果是多個字段,按逗號分隔即可。

        我們再來熟悉SQL的常用函數,首先是時間。因為我們的練習數據中沒有時間,首先用now創建出一個時間字段。

        select now()

        直接執行它,就能獲得當前的系統時間,精確到秒。其實select不一定后面要跟from。

        select date(now())

        它代表的是獲得當前日期,week函數獲得當前第幾周,month函數獲得當前第幾個月。其余還包括,quarter,year,day,hour,minute。

        時間函數也包含各種參數,比如week,因為中西方計算第幾天是不一樣的,西方把周日算作一周中的第一天,而我們習慣周一。

        select week(now(),0)

        除了以上的日期表達,也可以使用dayofyear、weekofyear 的形式計算。它和上面的部分函數等價。

        怎么對時間進行加減法呢?這時候靠date_add函數出馬。

        select date_add(date(now()) ,interval 1 day)

        【sql從入門到熟練】

        我們可以改變1為負數,達到減法的目的,也能更改day為week、year等,進行其他時間間隔的運算。如果是求兩個時間的間隔,則是datediff(date1,date2)或者timediff(time1,time2)。

        時間函數的運用比較靈活,沒有特殊限定,網絡上的文檔和教程也不少,可以深入學習。

        最后是數據清洗類的函數。

        select left(salary,1) from DataAnalyst

        MySQL支持left、right、mid等函數,這里又和Excel一樣。我們通過salary計算數據分析師的工資吧(這一步驟,在曾經的文章中已經用Excel和BI多次講解,所以我就不多贅述了,只講過程,不熟悉的同學可以看歷史內容)。

        首先利用locate函數查找第一個k所在的位置。

        select locate("k",salary),salary from DataAnalyst

        【sql從入門到熟練】

        然后使用left函數截取薪水的下限。

        select left(salary,locate("k",salary)-1),salary from DataAnalyst

        【sql從入門到熟練】

        為了獲得薪水的上限,要用substr函數,或者mid,兩者等價。

        substr(字符串,從哪里開始截,截取的長度)

        薪水上限的開始位置是「-」位置往后推一位。截取長度是整個字符串減去「-」所在位置,剛好是后半段我們需要的內容,不過這個內容是包含「K」的,所以最后結果還得再減去1。

        【sql從入門到熟練】

        這里不了解不要緊,可以將計算過程分步驟運行。基本上,了解了上面寫法的含義,文本清洗這塊就沒有問題了(not like用來清洗亂七八糟的薪水,我簡單處理了)。再然后計算不同城市不同工作年限的平均薪資。

        【sql從入門到熟練】

        上面語句,我們用了文本清洗、子查詢嵌套、分組聚合、排序等多種用法,屬于較復雜的查詢。重復數據的問題,因為我是復制了一份北京數據,數量剛好乘二,對平均數沒有影響,感興趣的朋友可以再加一步清洗掉它。

        下面是三道思考題:

        查詢出哪家公司招聘的崗位數最多;

        查詢出O2O、電子商務、互聯網金融這三個行業,哪個行業的平均薪資最高;

        查詢出各城市的最高薪水Top3是哪家公司哪個崗位。

        做完上面的題目,你已經神功初成,數據分析的SQL意見沒有大問題了。更復雜的查詢,也無非是嵌套更多的內容,本質思路是一樣的。

        講到這里,只剩join語法還沒有教大家。因為練習數據只有一張表,而join又是SQL中比較容易混淆的難點,我會單獨開一篇內容講解,到時候使用SQLZoo和LeetCode的案例。

        LeetCode是知名的算法競賽網站,可以在上面和全世界的程序員比拼算法,當然我們只練習SQL,完成后,至少能秒殺全世界50%的程序員吧。

        達內 java培訓機構轉載自網絡 如有侵權請聯系我們感謝您的關注 謝謝支持

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:Java培訓機構分享XML的解析教程
        下一篇:Java培訓機構分享JDBC基礎教程
        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        貴州省

        福建省

        • 達內廈門軟件園中心
        廣西省

        海南省

        国产高清情侣视频2019年,限制电影福利在线观看,23伊人大香蕉 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>