MySQL實操錯誤匯總
來自專欄柳青的專欄6 人贊了文章
最近在學習MySQL,下面把在學習中遇到的錯誤匯總起來供大家參考。
我是在SQLzoo上進行的聯繫,網址:http://sqlzoo.net/wiki/SQL_Tutorial
從簡單的SQL聯繫開始,前面幾道題都挺順利的。接下來是列出的錯誤:
一、這道題要求首都是國家名字的延伸,說實話沒看過SQL教程的遇到這道題挺坑。上面提示的SQL函數也不全,經過搜索引擎查找後終於蒙對答案。
SELECT name,substring(capital,char_length(name)+1) AS extFROM worldWHERE capital LIKE concat(name,_%)
在上面函數中遇到的坑:
- substring函數中的幾個參數間用了漢語逗號,這個錯誤很不容易發現
- 自己邏輯沒梳理清楚,在substring函數的第一個參數,應該輸入capital,錯誤的錄入了name,導致結果一直錯誤
- 遇到不知道有沒有的函數用搜索引擎找答案。這個SQL中的char_length函數就是我明白自己要找到capital的國家名字後延伸,所以思路就是要知道國家名字的字長,這個時候搜索引擎查找可以得到字長的函數
二、這道題要求展示這些指定國家的名字和人口,在這個上面遇到的是一個坑:
SELECT name,populationFROM worldWHERE name IN (France,Germany,Italy)
- 最後篩選指定國家名字時「=」與「IN」函數用錯,』=『對於比較大小等使用,這裡多個指定國家名字需要用』IN『函數
三、這個題是考邏輯關係的,可遇到三個判斷條件我就蒙了
SELECT name,population,areaFROM worldWHERE (area>3000000 OR population>250000000) AND name NOT IN (United States,India,China)
- 這三個判斷首先需要理清先後順序,再次只需要保證SQL語言是我要表示的語言,這個SQL中有OR和AND,我開始時沒有括弧的,網上搜索別人多個判斷條件後得到啟發用括弧來區分判斷條件的先後順序果然就成功了
四、不注意審題,漏掉一個判斷條件
SELECT nameFROM worldWHERE gdp/population>(SELECT gdp/populationFROM worldWHERE name=United Kingdom) AND continent=Europe
- 這個是考子查詢的,要高於英國人均gdp,這個值是需要計算的,就要用到子查詢。單我審題時漏掉了只查找歐洲的國家。
五、書寫錯函數
SELECT name,continentFROM worldWHERE continent=(SELECT continentFROM worldWHERE name=Argentina)OR continent=(SELECT continentFROM worldWHERE name=Australia)ORDER BY name
- 這道題遇到新函數ORDER BY,ORDER BY寫成了ORDEY BY
六、小於等於順序錯誤
SELECT *FROM nobelWHERE (yr>=1980 AND yr<=1989) AND subject=Literature
- 這個SQL我覺得最容易錯的就在於多條件比較,大於等於與小於等於號,如果順序輸入錯誤結果會返回錯誤
- 我會按以前數學中的習慣輸入a<=x<=b來錄入,可能導致錯誤
- 邏輯關係,and與or的使用錯誤
七、
SELECT mdate,teamnameFROM game JOIN eteam ON (team1=eteam.id)WHERE team1=(SELECT id FROM eteam WHERE coach=Fernando Santos)
- 關聯表時,兩個表有相關欄位,需要注意欄位id同時是表格game 和表格 eteam的欄位,你要清楚指出eteam.id而不是只用id
- 子查詢的時候我又用了關聯表,沒得到結果,經過梳理邏輯不用關聯表就可以得到結論。
八、
SELECT player FROM game JOIN goal ON matchid = id WHERE (team1=GER OR team2=GER) AND teamid NOT IN (GER)GROUP BY player
- 這個題要做對,需要了解表格表示的內容,看不懂關係表就算不對。說明理解業務的重要性。德國隊可能是team1也可能是team2,然後要排除這些比賽中德國隊員
- 在實際情況中,會有一個人進多個球的情況,所以需要對最後結果進行分組
九、
SELECT name
FROM actor JOIN casting ON (id=actorid)
WHERE movieid=11768
- 在這個題上重複犯了對表格理解不深,關聯錯表格,第一次就沒得到正確結果
十、
SELECT titleFROM movie JOIN casting ON (id=movieid)WHERE actorid=(SELECT id FROM actor WHERE name=Harrison Ford)
- WHERE子查詢不能連接表
- 子查詢中的表沒有與FROM後的表關聯也是可以運行的
十一、
SELECT title,nameFROM movie JOIN casting ON id=movieid JOIN actor ON actor.id=actoridWHERE yr=1962 AND ord=1
- 這個題中遇到了要關聯三個表的情況,這種情況第一個JOIN結束後直接JOIN下一個表就可以,需要注意的是主鍵的區分
- 對單詞的不熟悉導致結果錯誤
十二、
SELECT title,name FROM casting JOIN movie ON id=movieid JOIN actor ON actor.id=actoridWHERE movieid IN (SELECT movieidFROM castingWHERE actorid IN ( SELECT id FROM actor WHERE name=Julie Andrews)) AND ord=1
- 子查詢編寫時出現錯誤Subquery returns more than 1 row,經過搜索核對最後知道是子查詢中有多個結果時,我在子查詢前面用了=,多個結果應該用IN
十三、
SELECT nameFROM actor JOIN casting ON id=actoridWHERE ord=1GROUP BY nameHAVING COUNT(*)>=30ORDER BY name
- HAVING與子查詢混淆導致錯誤
十四、
SELECT title,COUNT(actorid)FROM casting JOIN movie ON movie.id=movieidWHERE yr=1978GROUP BY movieid,titleORDER BY COUNT(actorid) DESC
- 這個題我錯在對業務不熟上,GROUP BY分組時只分了title,沒想到會有同名這種情況的存在
- ORDER BY使用不熟練,倒序排列時加DESC
推薦閱讀:
※第三代DRDS分散式SQL引擎全新發布
※Pandas+MySQLdb——python3環境配置(OS系統)
※SQL習題解答總結
※如何將資料庫中查詢出來的數據再進行分頁操作?
TAG:MySQL |