sql 相加_SQL多表查询
一.表的加法
相加就是用union把兩個select語句相加,會去重;如果需要保留重復的行,用union all就可以了
二.表的聯結
聯結的幾種類型:
1.交叉聯結 2.內聯結 3.左聯結 4.右聯結 5.全聯結
一.交叉聯結 cross join(笛卡爾積)
兩個表的行數相乘就是最終的行數
在實際運用中很少用到,因為數據太多了,占用大量的設備空間,但是是后面所有聯結的基礎。
二.內聯結 inner join
查找出同時存在于兩張表中的數據,用文氏圖去記憶更直觀
select a.學號,a.姓名,b.課程號
from student as a inner join score as b
on a.學號=b.學號;
二.左聯結 left join
查找出左側表中的數據,用文氏圖記憶
三.右聯結 right join
將右側表中的數據全部取出來,文氏圖右邊的圈
四.全聯結 full join
Mysql不支持全聯結
當需要某個表的表頭或者特別指明要某個表的數據時,用 left join 或者 right join
其他情況用inner join
以下是重點:
如何用sql解決實際問題
問題:查詢所有學生的學號、姓名、選課數、總成績
1.學號、姓名(學生表student)
2.選課數(成績表score按學號分組,對課程號計數count)
3.總成績(成績表,按學號分組,對成績求和sum)
select a.學號,a.姓名,count(b.課程號) as 選課數,sum(b.成績) as 總成績
from
student as a left join score as b
on a.學號=b.學號
group by a.學號;
問題:查詢平均成績大于85的所有學生的學號、姓名、平均成績
1.學號、姓名(學生表student)
2.平均成績 (avg(成績)score 需要group by 學號 分組后再篩選平均成績用having)
select a.學號,a.姓名,avg(b.成績) as 平均成績
from student as a left join score as b
on a.學號=b.學號
group by a.學號
having avg(b.成績)>85;
問題:查詢學生的選課情況:學號、姓名、課程號、課程名稱
1.學號、姓名(student)
2.課程號,課程名稱(score、course)
select a.學號,a.姓名,c.課程號,c.課程名稱
from
student as a inner join score as b on a.學號=b.學號
inner join course as c on b.課程號=c.課程號;
case表達式
相當于進行條件判斷的函數,用來判斷每一行是不是滿足某個條件
case when<判斷表達式> then<表達式>
when<判斷表達式> then<表達式>
when<判斷表達式> then<表達式>
---
else<表達式>
end
內部運行邏輯:
查詢出每門課程的及格人數和不及格人數
select 課程號,
sum(case when 成績>=60 then 1
else 0
end) as 及格人數,
sum(case when 成績<60 then 1
else 0
end) as 不及格人數
from score
group by 課程號;
運行過程:
case表達式的注意事項
1.else表達式可以不寫,視為null,建議不要省略
2.case表達式可以寫在sql語句的任意子句里面
案例:
使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計:
各分數段人數,課程號,課程名稱
1的地方容易忘記加;2的地方可加可不加
總結
以上是生活随笔為你收集整理的sql 相加_SQL多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下列不是python对文件的写操作方法的
- 下一篇: sql输出带颜色的字段_带你走进MySQ