sqlzoo.net 上面的题目解答

namecontinent
AfghanistanAsia
AlbaniaEurope
AlgeriaAfrica
AndorraEurope
AngolaAfrica

name:國家名稱
continent:洲份

Pattern Matching Strings

此教程使用LIKE運算子來檢查國家名字,我們會在world表格中運用SELECT語句:

1、

你可以用WHERE name LIKE 'B%'來找出以 B 為開首的國家。
%是萬用字元,可以用代表任何字完。

找出以 Y 為開首的國家。

SELECT name FROM world
  WHERE name LIKE 'Y%'

2、

找出以 Y 為結尾的國家。

SELECT name FROM world
  WHERE name LIKE '%Y'

3、

“Luxembourg 盧森堡”中有一個x字母,還有一個國家的名字中有x。列出這兩個國家。

找出所有國家,其名字包括字母x。

SELECT name FROM world
  WHERE name LIKE '%X%'

4、

“Iceland 冰島”和“Switzerland 瑞士”的名字都是以”land”作結束的。還有其他嗎?

找出所有國家,其名字以 land 作結尾。

SELECT name FROM world
  WHERE name LIKE '%land'

5、

“Columbia 哥倫比亞”是以 C 作開始,ia 作結尾的。還有兩個國家相同。

找出所有國家,其名字以 C 作開始,ia 作結尾。

SELECT name FROM world
  WHERE name LIKE 'C%ia'

6、

“Greece 希臘”中有雙 e 字。哪個國家有雙 o 字呢?

找出所有國家,其名字包括字母oo。

SELECT name FROM world
  WHERE name LIKE '%oo%'

7、

“Bahamas 巴哈馬”中有三個 a,還有嗎?

找出所有國家,其名字包括三個或以上的a。

SELECT name FROM world
  WHERE name LIKE '%a%a%a%'

8、

“India 印度”和”Angola 安哥拉”的第二個字母都是 n。
你可以用底線符_當作單一個字母的萬用字元。

SELECT name FROM world
 WHERE name LIKE '_t%'
ORDER BY name

9、

“Lesotho 賴索托”和”Moldova 摩爾多瓦”都有兩個字母 o,被另外兩個字母相隔着。

找出所有國家,其名字都有兩個字母 o,被另外兩個字母相隔着。

SELECT name FROM world
 WHERE name LIKE '%o__o%%'

10、

“Cuba古巴”和”Togo 多哥”都是 4 個字母。

找出所有國家,其名字都是 4 個字母的。

SELECT name FROM world
 WHERE name LIKE '____'

更困難的問題

如你覺得以上題目太容易了,非常好。Well done for getting this far. 下面的題目更困難,更有挑戰性!

11、

“Luxembourg 盧森堡”的首都 capital 都同樣叫“Luxembourg”。

顯示所有國家名字,其首都和國家名字是相同的。

SELECT name
  FROM world
 WHERE name = capital

另一个解答

SELECT name
  FROM world
 WHERE name = concat(capital,'')

12、

“Mexico 墨西哥”的首都是”Mexico City”。

顯示所有國家名字,其首都是國家名字加上”City”。

concat函數:用于将两个字符串连接为一个字符串

SELECT name
  FROM world
 WHERE capital = concat(name, ' City')

注意:「City」 前有空格

13、

找出所有首都和其國家名字,而首都要有國家名字中出現。

SELECT capital,name FROM world
WHERE capital LIKE concat('%',name,'%')

中间是 like 不是等号。

14、

找出所有首都和其國家名字,而首都是國家名字的延伸。
你應顯示 Mexico City,因它比其國家名字 Mexico 長。
你不應顯示 Luxembourg,因它的首都和國家名相是相同的。

select name,capital from world 
where capital Like concat('%',name,'%') and capital != name

15、

“Monaco-Ville"是合併國家名字 “Monaco” 和延伸詞”-Ville".

顯示國家名字,及其延伸詞,如首都是國家名字的延伸。

你可以使用SQL函數 REPLACE 或 MID.

SELECT name,replace(capital,name,'') FROM world
WHERE capital LIKE concat(name,'%_')

SQL REPLACE()字符串替换函数
replace函数定义
replace(original-string,search-string,replace-string)

  • 参数
    • original-string: 被搜索的字符串。可为任意长度。
    • search-string: 要搜索并被 replace-string 替换的字符串。该字符串的长度不应超过 255 个字节。如果 search-string 是空字符串,则按原样返回原始字符串。
    • replace-string: 该字符串用于替换 search-string。可为任意长度。如果 replacement-string 是空字符串,则删除出现的所有 search-string。
  • 说明
    用字符串表达式3替换字符串表达式1中出现的所有字符串表达式2的匹配项。返回新的字符串。
    如果有某个参数为 NULL,此函数返回 NULL。

SELECT from Nobel Tutorial/zh

yrsubjectwinner
1960ChemistryWillard F. Libby
1960LiteratureSaint-John Perse
1960MedicineSir Frank Macfarlane Burnet
1960MedicinePeter Madawar

yr: 年份
subject: 獎項
winner: 得獎者

1、

更改查詢以顯示1950年諾貝爾獎的獎項資料。

SELECT yr, subject, winner
  FROM nobel
 WHERE yr = 1950

2、

顯示誰贏得了1962年文學獎(Literature)。

SELECT winner
  FROM nobel
 WHERE yr = 1962
   AND subject = 'Literature'

3、

顯示“愛因斯坦”(‘Albert Einstein’) 的獲獎年份和獎項

SELECT yr, subject
  FROM nobel
 WHERE winner = 'Albert Einstein'

4、

顯示2000年及以後的和平獎(‘Peace’)得獎者。

select winner from nobel
where yr >= 2000 and subject ='Peace'

5、

顯示1980年至1989年(包含首尾)的文學獎(Literature)獲獎者所有細節(年,主題,獲獎者)。

SELECT yr, subject, winner
  FROM nobel
 WHERE yr between 1980 and 1989 
and subject='Literature'

6、

顯示總統獲勝者的所有細節:

西奧多•羅斯福 Theodore Roosevelt
伍德羅•威爾遜 Woodrow Wilson
吉米•卡特 Jimmy Carter

SELECT * FROM nobel
 WHERE winner IN ('Theodore Roosevelt',
                  'Woodrow Wilson',
                  'Jimmy Carter')

7、

顯示名字為John 的得獎者。 (注意:外國人名字(First name)在前,姓氏(Last name)在後)

select winner from nobel
where winner like 'John%'

8、

顯示1980年物理學(physics)獲獎者,及1984年化學獎(chemistry)獲得者。

select * from nobel
where (yr=1980 and subject='physics') or
(yr=1984 and subject='chemistry')

9、

查看1980年獲獎者,但不包括化學獎(Chemistry)和醫學獎(Medicine)。

select * from nobel
where yr = 1980
and
subject != 'Chemistry' and subject != 'Medicine'

10、

顯示早期的醫學獎(Medicine)得獎者(1910之前,不包括1910),及近年文學獎(Literature)得獎者(2004年以後,包括2004年)。

select * from nobel
where (subject = 'Medicine' and yr < 1910)
or
(subject = 'Literature' and yr >= 2004)

11、

Find all details of the prize won by PETER GRÜNBERG

select * from nobel 
where winner = 'PETER GRÜNBERG'

12、

查找尤金•奧尼爾EUGENE O’NEILL得獎的所有細節 Find all details of the prize won by EUGENE O’NEILL

select * from nobel 
where winner = 'EUGENE O\'NEILL'

13、

騎士列隊 Knights in order

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

select winner,yr,subject from nobel
where winner like 'Sir%'
order by yr desc,winner

14、

The expression subject IN (‘Chemistry’,‘Physics’) can be used as a value - it will be 0 or 1.

Show the 1984 winners and subject ordered by subject and winner name; but list Chemistry and Physics last.

SELECT winner, subject
  FROM nobel
 WHERE yr=1984 
 ORDER BY subject IN ('Chemistry','Physics'),subject,winner

子查询

SELECT within SELECT Tutorial/zh

1、

列出每個國家的名字 name,當中人口 population 是高於俄羅斯’Russia’的人口。

world(name, continent, area, population, gdp)
SELECT name FROM world
  WHERE population >
     (SELECT population FROM world
      WHERE name='Russia')

2、

列出歐州每國家的人均GDP,當中人均GDP要高於英國’United Kingdom’的數值。

SELECT name FROM world
  WHERE continent = 'Europe' and gdp/population >
     (SELECT gdp/population FROM world
      WHERE name='United Kingdom')

3、

在阿根廷Argentina 及 澳大利亞 Australia所在的洲份中,列出當中的國家名字 name 及洲分 continent 。按國字名字順序排序

SELECT name,continent  FROM world
  WHERE continent IN
    (SELECT continent FROM world WHERE name = 'Argentina' OR name = 'Australia') 
ORDER BY name

4、

哪一個國家的人口比加拿大Canada的多,但比波蘭Poland的少?列出國家名字name和人口population 。

SELECT name,population FROM world
  WHERE population >
    (SELECT population FROM world WHERE name = 'Canada')
     and
    population <
    (SELECT population FROM world WHERE name = 'Poland')

5、

Germany德國(人口8000萬),在Europe歐洲國家的人口最多。Austria奧地利(人口850萬)擁有德國總人口的11%。

顯示歐洲的國家名稱name和每個國家的人口population。以德國的人口的百分比作人口顯示。

SELECT name,
CONCAT(ROUND(population*100/(select population from world
 where name = 'Germany'),0),'%')
 FROM world
  WHERE continent='Europe'

concat 用于合并字符串,round用于把数值字段舍入为指定的小数位数。


如要練習一些較少用的SQL功能,看下去。

我們可以用ALL 這個詞對一個列表進行>=或>或<或<=充當比較。例如,你可以用此查詢找到世界上最大的國家(以人口計算):

SELECT name
  FROM world
 WHERE population >= ALL(SELECT population
                           FROM world
                          WHERE population>0)

你需在子查詢的條件中使用 population>0,因為有些國家的記錄中,人口是沒有填入,只有 null值。


6、

哪些國家的GDP比Europe歐洲的全部國家都要高呢? [只需列出 name 。] (有些國家的記錄中,GDP是NULL,沒有填入資料的。)

SELECT name
  FROM world
 WHERE GDP >= ALL(SELECT GDP
                           FROM world
                          WHERE GDP>0 and continent = 'Europe')
      and continent != 'Europe'

这题隐藏了一个条件,国家不包括欧洲。

我們可以在子查詢,參閱外部查詢的數值。我們為表格再命名,便可以分別內外兩個不同的表格。

7、

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

SELECT continent, name, area FROM world x
  WHERE area >= ALL
    (SELECT area FROM world y
        WHERE y.continent=x.continent
          AND area >0)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值