先看個問題
- 問:查詢每個學(xué)生每個科目的分?jǐn)?shù)
- 分析:學(xué)生姓名來源于students表嘿辟,科目名稱來源于subjects,分?jǐn)?shù)來源于scores表厦画,怎么將3個表放到一起查詢嘱能,并將結(jié)果顯示在同一個結(jié)果集中呢?
- 答:當(dāng)查詢結(jié)果來源于多張表時伦吠,需要使用連接查詢
- 關(guān)鍵:找到表間的關(guān)系妆兑,當(dāng)前的關(guān)系是
- students表的id---scores表的stuid
- subjects表的id---scores表的subid
- 則上面問題的答案是:
select students.sname,subjects.stitle,scores.score
from scores
inner join students on scores.stuid=students.id
inner join subjects on scores.subid=subjects.id;
- 結(jié)論:當(dāng)需要對有關(guān)系的多張表進(jìn)行查詢時,需要使用連接join
連接查詢
-
連接查詢分類如下:
-
表A inner join 表B:表A與表B匹配的行會出現(xiàn)在結(jié)果中
不分左右毛仪,能匹配上的都出現(xiàn) -
表A left join 表B:表A與表B匹配的行會出現(xiàn)在結(jié)果中搁嗓,外加表A中獨(dú)有的數(shù)據(jù),未對應(yīng)的數(shù)據(jù)使用null填充
左連接 -
表A right join 表B:表A與表B匹配的行會出現(xiàn)在結(jié)果中箱靴,外加表B中獨(dú)有的數(shù)據(jù)腺逛,未對應(yīng)的數(shù)據(jù)使用null填充
右連接
-
在查詢或條件中推薦使用“表名.列名”的語法
如果多個表中列名不重復(fù)可以省略“表名.”部分
如果表的名稱太長,可以在表名后面使用' as 簡寫名'或' 簡寫名'衡怀,為表起個臨時的簡寫名稱
什么時候需要用到連接查詢:需要查看一組信息棍矛,來自多張表安疗。
注意:inner join 只有在關(guān)系匹配上的時候才會在結(jié)果集中出現(xiàn),inner join不分前后够委。
inner join匹配上的會出現(xiàn)
練習(xí)
- 查詢學(xué)生的姓名荐类、平均分
select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
group by students.sname;
- 查詢男生的姓名、總分
select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
where students.gender=1
group by students.sname;
- 查詢科目的名稱茁帽、平均分
select subjects.stitle,avg(scores.score)
from scores
inner join subjects on scores.subid=subjects.id
group by subjects.stitle;
- 查詢未刪除科目的名稱玉罐、最高分、平均分
select subjects.stitle,avg(scores.score),max(scores.score)
from scores
inner join subjects on scores.subid=subjects.id
where subjects.isdelete=0
group by subjects.stitle;