SQL習題解答總結

SQL習題解答總結

學習SQL已經一周了,學習的過程中痛苦與快樂並存。當遇到看不懂的內容時會痛苦到懷疑到自己的智商;但是費勁心力搞定某個難點的時候又會覺得很快樂。做題的過程中遇到很多問題,這裡總結下經驗吧。

做題前除了需要了解基本的SQL語句(具體教程可網上搜資源)之外,還有一些基本理論知識能夠更好的幫助我們理清思路;

一條完整的DQL語句(數據查詢語句)結構:

Select ······

From ······

Where ······

Group by ·····

Having ······

Order by ······

  • 以上關鍵字順序不能改變;
  • 以上語句執行順序:
  1. From:從某張表中檢索數據
  2. Where:經過某條件進行過濾
  3. Group by:然後分組
  4. Having:分組結果不滿意,在過濾
  5. Select:查詢出來
  6. Order by:對查詢出來的結果進行排序輸出

了解了DQL語句的含義及執行順序後,處理問題時便可按照規律將需求轉換成SQL語句;


題目及解答部分:

題目來源:

SELECT basics/zh?

sqlzoo.net

SELECT basics:

4.哪些國家是不是太小,又不是太大?

BETWEEN 允許範圍檢查 - 注意,這是包含性的。 此例子顯示面積為 250,000 及 300,000 之間的國家名稱和該國面積。

解題思路:在WORLD 表中查詢,篩選條件是:面積在20萬到25萬之間,查詢國家和面積。

Select name , area From worldWhere area between 200000 and 250000;

SELECT from WORLD :

8.美國、印度和中國(USA, India, China)是人口又大,同時面積又大的國家。排除這些國家。顯示以人口或面積為大國的國家,但不能同時兩者。顯示國家名稱,人口和面積。

解題思路:人口>250000000 為人口大國,面積>3000000 為面積大國。故根據題目意思可以確定篩選條件:人口大國,同時面積不為大國;人口不為大國,同時面積為大國。解答過程類似數學裡面的集合求法。

Select name , population ,area From worldWhere (population>250000000 and area< 3000000) or (population< 250000000 and area> 3000000);

10.顯示國家有至少一個萬億元國內生產總值(萬億,也就是12個零)的人均國內生產總值。四捨五入這個值到最接近1000。顯示萬億元國家的人均國內生產總值,四捨五入到最近的$ 1000。

解題思路:在WORLD表中查詢,篩選條件:萬億元國家,查詢人均國內生產總值,並且四捨五入到最近的$ 1000。

select name,round(gdp/population,-3) from worldwhere gdp>1000000000000;

注意round函數的用法,round(number,digits);number,要四捨五入的數,digits是要小數點後保留的位數,如果 digits 大於 0,則四捨五入到指定的小數位。如果 digits 等於 0,則四捨五入到最接近的整數。如果 digits 小於 0,則在小數點左側進行四捨五入。

SELECT from Nobel :

12.查找尤金?奧尼爾EUGENE ONEILL得獎的所有細節 Find all details of the prize won by EUGENE ONEILL

select *from nobelwhere winner=EUGENE ONEILL;

注意:當篩選條件中的語句包含單引號時,不能把一個單引號直接的放在字元串中。但您可連續使用兩個單引號在字元串中當作一個單引號。(如本題中名字)

13.騎士列隊 Knights in order

列出爵士的獲獎者、年份、獎頁(爵士的名字以Sir開始)。先顯示最新獲獎者,然後同年再按名稱順序排列。

解題思路:在NOBEL表中查詢,篩選條件:騎士列隊,查詢獲獎者、年份、獎項。注意要求先顯示最新獲獎者,也就是按照獲獎年份的降序排序;同時題目要求同年再按照名字順序排序。

select winner,yr,subject from nobelwhere winner like sir%order by yr desc,winner asc;

SELECT within SELECT Tutorial

子查詢:select 嵌套select查詢。

嵌套子查詢可以出現的位置:

Select ······(select) From······(select) Where······(select)

5.Germany德國(人口8000萬),在Europe歐洲國家的人口最多。Austria奧地利(人口850萬)擁有德國總人口的11%。顯示歐洲的國家名稱name和每個國家的人口population。以德國的人口的百分比作人口顯示。

解題思路:在world表中查詢,篩選條件:歐洲的國家,查詢國家名稱和國家人口。同時以德國人口的百分比作顯示。

select name,concat(round(population/(select population from world where name=Germany)*100),%)from worldwhere continent=europe;

注意:以德國的人口百分比走位顯示。需要先檢索出德國的人口,再將歐洲國家人口除以德國人口,同時用ROUND函數去掉小數點後的小數,再通過concat函數將得到的數字和『%』連接起來顯示。

7.在每一個州中找出最大面積的國家,列出洲份continent ,國家名字name及面積area。(有些國家的記錄中,AREA是NULL,沒有填入資料的。

解題思路:在world表中查詢,篩選條件:面積最大的國家,查詢洲份continent ,國家名字name及面積area。

select continent,name,area from world x where area>=all(select area from world y where x.continent=y.continent and area>0);

注意:面積最大的國家,即表示面積比所有國家的面積都要大,這裡用到ALL函數。另外,代碼中兩個select檢索中都運用到了world表格:from world x,from world y.這兩相當於將world當做兩個表格x 和 y使用,並對其進行連接。

SUM and COUNT:

8.列出有至少100百萬(1億)(100,000,000)人口的洲份。

解題思路:在world表中查詢,篩選條件:人口數量大於等於1億,查詢洲份。

select continent from world xwhere (select sum(population) from world y where y.continent=x.continent) group by continent having sum(population)>=100000000;

注意:題目要求檢索人口數量不少於1億的洲份名稱,源數據表中提供的是每個國家的人口數量,所以在篩選條件中需要嵌套select 用來求出每個洲份的人口總數。所以篩選的思路是:先求出各個洲份的人口總和,然後用HAVING函數檢索出人口總數大於1億的目標。

以上就是作業過程中做錯的題目,發現對錯題進行校正並進行梳理,本身就是一個知識加固的過程。SQL約束還沒有看完,未完待續,希望能輸出更多的經驗。

推薦閱讀:

SQL練習及解答
沒有任何基礎的人怎麼學SQL?
知識布局-mysql-組內排序
從編程語言設計的角度,如何評價SQL語言?
一張圖讓你詳細理解Group By的分組聚合過程

TAG:SQL | MySQL | 資料庫 |