SQL ZOO 通關記錄(待更新)

SQL ZOO 通關記錄(待更新)

來自專欄從零開始數據分析1 人贊了文章

NOTICE:

  1. 並不會一次性刷完,後續會繼續補充。
  2. 文章中幾乎沒什麼文字,大部分都是將題目代碼截屏的...各位看官請輕噴,不是我偷懶,我也希望你們在使用資料庫的時候可以動手碼一碼,畢竟動了手才知道自己到底有沒有學會...
  3. 手寫的代碼比較美觀,放在SQLzoo裡面的代碼考慮到篇幅無法兼顧美觀,望見諒。

SQLZOO 官方網站:sqlzoo.net/

  • SELECT basics

這部分太過基礎,略去不提哈~

  • SELECT QUIZ

根據語法規範為一下形式:

SELECT NAME, populationFROM worldWHERE population BETWEEN 1000000AND 1250000;

從題目中可以看出題目尋找的是國家名字以AL開頭的字元串,然後將國家名字和國家人口輸出作為表格。

以上一題的使用方式為導向,可以寫出代碼為:

SELECT NAMEFROM worldWHERE NAME LIKE %AOR NAME LIKE %L;

這句語句是查找名稱長度為5並且在歐洲地區的國家,然後將國家名稱和國家名稱的長度輸出。哈哈,做這道題還需要一些常識,比如哪些國家是屬於歐洲的呢?比如我就不知道Binin是什麼國家,屬於哪個大洲[尷尬.jpg]。個人認為應該把region 選項也輸出,顯得更親民哈哈...

首先找到人口為6400的國家(人口大國生人表示對這個參數難以置信),然後將該國家的地域面積乘二,再將國家名稱和地域面積進行輸出。

來來來,不解釋,直接碼代碼:

SELECT country, area, populationFROM worldWHERE area > 50000AND population < 10000000;

數零數得我眼花,還是複製粘貼大法好哈哈...

人口密度:人口與地域面積的差值。有了這個知識...直接碼代碼...(考得真豐富...)

SELECT NAME, population, area, population / area AS densityFROM worldWHERE country = CHINAOR country = AustraliaOR country = NigeriaOR country = France;

我還非常自豪的利用了AS重命名列,沒想到他用的IN,好高端...

  • SELECT FROM WORLD

這一節主要是對SELECT 語句的反覆應用,部分代碼就不做過多解釋了哈~

這裡XOR表示異或,即後面兩個條件至少滿足一個且至多滿足一個;

這裡的ROUND函數是四捨五入函數,而逗號後面的2表示保留兩位有效數字。

這道題需要稍稍動動腦子,既燃+2表示的是保留小數點後面兩位數字,也就意味著-3表示保留小數點前三位後面的數字啦~

前面為什麼要放那麼多東西唬人,然後輸出時再告訴你輸出的列太多...

  • Quiz

這部分沒什麼有意思的題目,權當是練習熟悉吧,具體怎麼解題也就不說啦~

  • SELECT from nobel

注意:這道題有坑...文章中提供的名字是『PETER GRüNBERG』,但實際上你會發現nobel庫裡面只有Peter Grünberg...

同時這裡注意一下當出現一些拉丁字母等特殊符號應該怎樣使用語法識別特殊字元。

這裡記住 ,表示一個可以作為的轉義字元。

這道題非常巧妙,挺難想出來的。

首先利用了通過subject IN 語句的真值表可以將物理+化學專業與其它方向區分開來,然後再對科目進行排序。完成排序之後,對內部的作者名字再進行一次排序。

  • Quiz

第一題第二題沒啥意思,這裡略去不提...直接從第三題說起。

這個問題直接想對於初學者而言會有點兒懵逼,所以我們需要將問題進行拆解。題干讓我們找到沒有授予諾貝爾醫學獎的總年數是多少。這個問題應該拆解為兩步,首先第一步找到授予諾貝爾醫學獎的年份,代碼應如下所示:

SELECT DISTINCT yrFROM nobelWHERE SUBJECT = Medicine

接下來,我們需要從所有獲獎年份中將這些年份進行剔除:

SELECT COUNT(DISTINCT yr)FROM nobelWHERE yr NOT IN ( SELECT DISTINCT yr FROM nobel WHERE SUBJECT = Medicine )

第四題略去不提,下面說第五題第六題。

同樣首先來看題干,需要找的數據是:找到諾貝爾物理學獎和諾貝爾化學獎都沒有被授予的年份,並將它們展示出來。同樣的,我們依然通過兩步來處理問題,首先找到兩個獎項有一個被授予的時間:

SELECT DISTINCT yrFROM nobelWHERE SUBJECT IN (Chemistry)OR SUBJECT IN (Physics)

然後再從中所有年份中剔除掉這些年份,得到:

SELECT yr FROM nobelWHERE yr NOT IN(SELECT DISTINCT yr FROM nobelWHERE subject IN (Chemistry, Physics))

需要尋找的數據是:找到諾貝爾醫學獎被授予但是和平獎或文學獎沒有被授予的年份,從限制條件可以看出,使用兩層查找t嵌套即可找到。

第一層:找到授予和平獎,授予文學獎的年份:

SELECT DISTINCT yrFROM nobelWHERE SUBJECT IN Medicine

同樣的,和平獎為:

SELECT DISTINCT yrFROM nobelWHERE SUBJECT NOT IN Peace

將兩層結合,找到授予醫學獎卻沒有和平獎的年份:

SELECT yrFROM nobelWHERE ( SUBJECT = Medicine AND yr NOT IN ( SELECT DISTINCT yr FROM nobel WHERE SUBJECT IN Medicine ) AND yr NOT IN ( SELECT DISTINCT yr FROM nobel WHERE SUBJECT NOT IN Peace ) )

第七題略去不提。


剛和那女票從北戴河回來,找工作再要緊也不能忘了好好說生活哦~

今天重新開始我的數據分析之路!

開工!

  • SELECT within SELECT Tutorial

第一題還是比較認真的講一下:

讀題干我們可以知道,程序想要的數據是人口數量大於俄羅斯的國家。且不論使用SQL語言該如何實現這樣的操作,就以我們人類的正常認知而言,解決這個問題一共需要兩步:第一步,找到俄羅斯的人口;第二步,找到人口數量大於俄羅斯人口的國家。

首先,我們來尋找俄羅斯的人口數量,這個在前幾期已經用爛了,再來一遍:

SELECT populationFROM worldWHERE NAME = Russia

下面,我們假設俄羅斯的人口數量為X,我們尋找人口數量大於X的國家,語句同樣非常簡單:

SELECT NAMEFROM worldWHERE population > X

這裡的X便是我們假設的俄羅斯人口數量,兩句語句一結合,我們有:

SELECT NAMEFROM worldWHERE population > ( SELECT population FROM world WHERE NAME = Russia )

看,是不是非常通俗易懂。前人的思維方式,真的是需要我這樣的螻蟻仔細研讀,思索。

因為,這些語句的每一個字母裡面都充斥著美感!

這道題目就不細解釋了,原理和第一題相同,只需要注意一下人均GDP的概念即可。

這道題也不解釋了哈,注意得到的大洲名字需要用括弧括起來。

不解釋,直接碼代碼...

這道題目的綜合性比較強,先後需要使用子查詢得到人口數量,得到人口百分比後,使用ROUND函數進行四捨五入,最後使用拼接函數||將數據與百分號拼接。

這道題需要注意要把可能為空的數據使用"AND IS NOT NULL"進行預處理,排除。

這道題目裡面有一個坑,我們需要使用最大面積作為尋找標準,而不應該使用大洲名字。這樣目標更加明確,否則MAX()函數會因此報錯。

但是後來,我想到這樣的做法是不對的,如果你所找到的某個大洲的某個國家的面積和另外一個大洲的某國領土面積恰好相等怎麼辦...所以我這樣的做法有點兒投機取巧的意味在,所以不推薦大家使用這樣的方法做,重新思考後,我使用下面的方法完成第七題:

重新審視下,這樣的方式果然更加穩健。

這道題目思維也很常規,這裡不講啦~

講真這道題自己一開始是沒有弄明白的,後來看了網上的相關教程,才搞明白這其中的關竅。首先,將之前的百分之33化作原人口比3;然後通過關聯子查詢將搜索範圍鎖定在一個大洲內,最後加入國家名字不同的條件,選擇出最後的結果。

題目先到此為止哈,以後會進行更新,每天至少五道題吧~

喜歡就點個讚唄~

2018.10.02

努力想要變強的小強


推薦閱讀:

TAG:資料庫 | SQL語句 |