適用人群
SQL很熟練的就不用看了,我這裡是偏基礎的
平時SQL寫的少總結也少的程序員,今天我們一起總結複習下
關鍵是思路,很多SQL寫不出來是因為平時對思路不明確
把常見SQL函數語法套路搞熟悉了,一般需求都不會有問題的
本文章是MYSQL
SQL相關歷史文章
【這是我總結的SQL基礎】
表
- 學生表:Student(SID,Sname,Sage,Ssex)SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
- 成績表:score(SID,CID,score) --SID 學生編號,CID 課程編號,score 分數
成績表
學生表
繼續出幾個題目大家一起學習下SQL玩法
縱向比較、橫向比較、分組、統計、join
1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數
思路總結:
- 這是精確查詢需求 一般都用內連接 inner join
- 這裡比較2個課程的分數,關聯一張成績表不好比較,2張成績表就容易比較了,原因是關聯兩張成績表會讓列名增加,在一行數據中去比較成績分數SQL也容易寫了,橫向比較思路
- 把兩成績表分別通過條件過濾掉,然後比較分數
2 查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
思路總結:
- 查所有學生的什麼的信息,第一要想到學生表的左連接查詢 left join
- 選課總數、所有課程總成績,要想到統計函數count 、sum
- 統計函數知道後,還要知道group by 分組函數怎麼配合統計函數去工作
有了上面的思路基本SQL已經問題不大。
細節注意group by後面一定要跟能分組的列名才行,上面例子能分組的肯定是學生ID,
一個學生ID會對應多個成績數據,題目也是說要統計學生的什麼什麼數據情況。
3 查詢所有課程都及格60學生情況
第一步 普通左連接
第二部 加分組 統計函數等
比較簡單思路
不用HAVING函數一樣是可以查處理就SQL難看點,需要嵌套子查詢
思路分析:
- 題目是查所有學生的什麼,馬上向到學生左連接 left join
- 所有課程都及格,需要統計,統計的維度是學生,因此group by 學生ID,分組學生ID時,請看分數和課程ID都可以統計函數去處理了
- 要所有課程都及格,這裡所有課程就3門先寫死了 HAVING count(b.CID)=3
4.查詢各科成績最高分、最低分和平均分
需要引入課程表 course
結果
思想分析:
- 最高、最低、平均,馬上想到統計函數們max min avg
- 查詢所有成績,馬上想到 成績表左連接 left join
- 統計函數有了,當然要想到分組維度是課程ID
5 統計各科成績各分數段人數:課程編號,課程名稱, 100-85 , 85-70 , 70-60 , 0-60
思路分析
- 統計什麼,馬上統計函數想到 sum
- 查詢各科分數段的情況,需要找出範圍後統計數量,這裡就需要 case when then else end 幫助了,想不到它基本就沒好解決思路了
- 利用case把相應範圍內分數的數量過濾出來,配合SUM統計總數據
- 統計肯定要分組group by 配合,很明顯分組維度是課程
總結
- SQL結果不重要,總要的是寫SQL過程中想到的思路
- 思路清晰,題目在怎麼變化也離開不了SQL的基本知識
- SQL函數有很多,平時大家多積累吧
閱讀更多 程序汪汪 的文章