SQLZOO練習記錄和總結
來自專欄猴子聊數據分析1 人贊了文章
SQLZOO是很好的練習SQL初級查詢的網站,能快速的幫我們填平從學習到使用的鴻溝。在刷完SQLZOO所有題目後,把自己碰到的問題,做一下記錄和總結。
1. 特定排序問題
使用環境:a. NULL值不參與排序,如果要排序的列含有 NULL,NULL的行會在結果的開頭或末尾匯總顯示。b. 有時候我們需要讓某個值的數據都排在最前或最後
方法:結合搜索CASE表達式,將要排在前的賦值為0,排在後的賦值為1,然後對賦值的0和1排序,得到結果
例子:SELECT from Nobel Tutorial
代碼:
SELECT winner, subject FROM nobel WHERE yr = 1984
ORDER BY CASE WHEN subject IN (Chemistry,Physics) THEN 1 ELSE 0 END,
subject, winner;
2. 「沒有」的陷阱
先看上面這張表,問哪一年沒有C?
如果按subject<>C的情況來找年份,會發現由於一年中有好些subject,導致排除掉C仍然無法排除掉C所在的年份。所以正確的方法是按subject<>C的情況來找年份,再排除掉這些年份。
然後再看下面幾道題,就會比較容易理解:Nobel Quiz
3. 分類排序的第幾條
適用範圍:查詢各分類中最大、最小、最前、最後,排序中第幾條這些問題
方法:關聯子查詢配合排序,以及LIMIT 1 (限制1條)、OFFSET(偏移數量來確定第幾條)
例子:SELECT within SELECT Tutorial
代碼:
SELECT continent, name, area FROM world a
WHERE area = (SELECT area FROM world b
WHERE a.continent =b.continent
ORDER BY area DESC LIMIT 1)
代碼:
SELECT continent,name FROM world a
WHERE name = (SELECT name FROM world b
WHERE a.continent = b.continent
ORDER BY name
LIMIT 1)
另外,對於分類中的最大最小值,還可以有兩種方法解決:
一、 通過在子查詢中查詢MAX()和MIN()來解決
這種方法還適用於在子查詢中查詢COUNT(),SUM(),AVG()
相關例題的解釋很多,不舉例了。
二、通過ALL(子查詢)結合比較謂詞來解決
相關例題請見4
4. ALL的用法
ALL:父查詢中的結果集大於子查詢中每一個結果集中的值,則為真
例子:SELECT within SELECT Tutorial
代碼:
SELECT name, continent, population FROM world a
WHERE 25000000>= ALL(SELECT population FROM world b
WHERE a.continent = b.continent)
代碼:
SELECT name, continent
FROM world a
WHERE population/3 >= ALL( SELECT population FROM world b
WHERE a.name != b.name AND a.continent = b.continent)
補充:
類似用法的還有ANY,SOME,區別是:
ANY:父查詢中的結果集大於子查詢中任意一個結果集中的值,則為真
SOME的作用和ANY一樣。
5. 三表聯結
兩種方法:1. 兩個兩個進行聯結;2. 三個一起聯結 (相當於CROSS JOIN)
例子:
代碼:
SELECT title, name
FROM movie JOIN casting ON movie.id= movieid
JOIN actor ON actorid = actor.id
WHERE yr = 1962 AND ord=1;
代碼:
SELECT title, name
FROM movie, actor, casting
WHERE movie.id = movieid AND actor.id = actorid
AND yr = 1962 AND ord=1;
推薦閱讀:
※西線學院每日學習分享----SQL數據分析常用語句
※滴滴出行分析師十條
※Hello world! 數據分析我來了
※數據分析啟程----實踐計劃
※雨沐田:數據分析之Excel數據導入方法