天天看點

MySQL連接配接查詢常見坑1

由于MySQL不是編譯器,SQL語句也不是用于開發程式的程式設計語言,報錯機制不完善,是以其非常不 靈活,錯誤也不易找到,是以也随之帶來了一些坑,例如在連接配接查詢中:

查詢所有同學的學生編号、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null):

```sql
select sid,sname from student as  tmp left join (
    select sid,count(*) as totalCourse, sum(score) as totalScore from sc group by sid
  ) as temp on tmp.sid=temp.sid;
           

會報錯:Error Code: 1052. Column ‘sid’ in field list is ambiguous

為什麼呢?

因為我原本以為是先 (select sid,sname from student),然後命名這張表是tmp,然後執行左連 接,但實際上,MySQL執行順序并非如此,它會先執行 student as tmp把學生表命名為tmp,然後執行:

```sql
left join (
    select sid,count(*) as totalCourse, sum(score) as totalScore from sc group by sid
  ) as temp on tmp.sid=temp.sid;
           

注意,left join後的表,看起來隻有一個sid字段,實際上有兩個,隻不過多餘的被隐藏了,是以這時 執行最開始的select sid,sname from 這張左連接配接之後的表時,MySQL不知道要選取哪個sid字段,于 是報錯

如果把開始的select語句改為:select temp.sid,sname,能正确求解嗎?

能執行,但隻會顯示 sid、sname屬性,沒有選課總數和總成績,因為剛講了,開頭的select語句,是 在left join之後的表中查詢,如果不select 選課總數和總成績,結果中自然不會顯示。

正确答案:

select student.sid,sname, totalCourse,totalScore from student left join (
      select sid,count(*) as totalCourse, sum(score) as totalScore from sc group by sid
  )as temp on student.sid=temp.sid;