“子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達式時,這種情況是不允許的。”SQL查詢錯誤解析


為了實現下述代碼,首先得有數據庫和相應的表格,本文用的是https://blog.csdn.net/qaz13177_58_/article/details/5575711/中的案例,即先用鏈接中那些命令創建數據庫、生成數據表,然后就有了student,teacher,course,score等表。

 

最近用select做題,經常碰到下面的這兩個錯誤:

1.子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達式時,這種情況是不允許的。

比如針對下述問題:

1.查詢成績比該課程平均成績低的同學的成績表。

我的查詢:select * from score where degree<(select avg(degree) from score group by cno),執行后,出現上述錯誤。

正確查詢:SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO)

2.查詢出“計算機系“教師所教課程的成績表。

我的查詢:select * from score where cno=
(select course.cno from course where tno=(select tno from TEACHER where teacher.depart='計算機系')),執行后,出現上述錯誤。

正確查詢:select * from score where cno IN

(select course.cno from course INNER JOIN TEACHER ON TEACHER.TNO=COURSE.TNO AND teacher.depart='計算機系')

上述問題2在於用了'='於select子查詢(我的查詢的第二行括號內語句)之前,但是select子查詢返回的不止一個元素,所以出錯了。

如果問題改一改,變為:查詢出“李誠“教師所教課程的成績表。那么我們可以用'='構成的嵌套查詢語句如下:

select * from score where cno=
(select course.cno from course where tno=(select tno from TEACHER where teacher.depart='李誠'))

為什么這時候可以執行而且得到想要的結果了?這是因為select tno from TEACHER where teacher.depart='李誠'只返回'804'這個tno值,而且select course.cno from course where tno='804'也只返回'3-245'這個cno值,第二行中的兩個嵌套子查詢都只返回一個值,因此上述語句中的兩個'='不會出錯。

 

2.HAVING 子句中的列 'score.DEGREE' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。

比如針對下述問題:

查詢最低分大於70,最高分小於90的Sno列。

我的查詢:select sno from score group by sno having degree between 70 and 90,執行后,出現上述錯誤。

正確查詢:select sno from score group by sno having min(degree)>70 and max(degree)<90

分析,having 后面應該是跟聚合函數的表達式的,直接跟按某一列的行篩選語句會無效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM