[SQL] HankerRank SQL 練習紀錄_2021.05.31 updated
本篇記錄在HankerRank上刷SQL題目過程,並筆記一些有趣的題目。
為什麼使用HankerRank?
- 刷題目的過程不需要自己事先架設database,可以直接用HankerRank提供的資料庫進行練習。
- 支援MySQL/Oracle/MS SQL Server/DB2 等常見SQL語法。
- 有積分累積制度,依據累積分數設立星星等級(追求成就 V̷a̷n̷i̷t̷y̷)。
STATION
1 題目: Weather Observation Station 7
從STATION 表格中,Query出CITY名稱結尾包含vowels。
對應前一題(6)是找開頭含vowels。
#解法一 單純取結尾的一個字
#MySQL
SELECT DISTINCT CITY
FROM STATION
WHERE RIGHT(CITY,1) IN (‘a’,’i’,’e’,’o’,’u’);#解法二 用到正規表達式
#MySQL
SELECT DISTINCT CITY
FROM STATION
WHERE CITY REGEXP '[aeiou]$'#MS SQL Server作法
SELECT DISTINCT(CITY)
FROM STATION
WHERE CITY LIKE '%[aeiou]'
延伸: 若需要抓取開頭或結尾都包含vowels
#MySQL
select distinct city from station
where left(city,1) in (‘a’,’e’,’i’,’o’,’u’)
and right(city, 1) in (‘a’,’e’,’i’,’o’,’u’)
為什麼選這題?
這題除了可以做為正規表達式的敲門磚,也是認識不同語言中,需要注意語法不同,如上述解法中MySQL與MS SQL就使用到了不一樣的作法。
網路各說紛紜,但其實參考W3Schools中SQL Wildcards在這裡就很夠用。
或者參考GeeksforGeeks的MySQL正規表達式整理文。
https://www.hackerrank.com/challenges/weather-observation-station-16/problem?
2 題目: Weather Observation Station 16
從STATION 表格中,根據LAT_N>38.7780 Query出LAT_N最小值。
且小數取round 4位。
#解法 MySQL
select min(round(lat_n, 4))
from station
where lat_n > 38.7780
為什麼選這題?
這裡包含SQL中小數進位的function介紹,如同python也有不同的進位法,而SQL 主要就以TRUNCATE()
, ROUND()
這兩種做法。
TRUNCATE()
:針對輸入數值,對指定位數無條件捨去。ROUND()
:針對輸入數值,對指定位數的四捨五入。
3–1 題目: Weather Observation Station 18
從STATION 表格中,計算最大(LAT_N, LONG_W)減去最小(LAT_N, LONG_W)的曼哈段距離。
select round(
max(lat_n)-min(lat_n) + max(long_w)-min(long_w)
,4)
from station
3–2 題目: Weather Observation Station 19
從STATION 表格中,計算最大最小(LAT_N, LONG_W)的歐幾里得距離。
# 最大x-最小x取平方 加上 最大y-最小y取平方
# 再將兩者加總後開根號
select round(
sqrt(
power(max(lat_n)-min(lat_n),2) +
power(max(long_w)-min(long_w),2)
)
,4)
from station
4 題目 Type of Triangle
從TRIANGLES表格中,找出可以組成三角形者,
再依據三邊判斷為等邊三角形[三邊等長]、等腰三角形[任兩邊等長]、
(斜角)三角形[三個邊長皆不相等]。
三角形條件
- 任二邊長和大於第三邊
- 任二邊長差的絕對值小於第三邊
Select
CASE
when A+B>C and B+C>A and A+C>B then #三角形形成條件
CASE
when A=B and B=C Then ‘Equilateral’
when A=B or A=C or B=C then ‘Isosceles’
ELSE ‘Scalene’
END
ELSE ‘Not A Triangle’
END
from TRIANGLES