SQL伪代码的编写
偽代碼編寫在JAVA、C#、PHP中都比較常見,但在SQL里面似乎用的比較少,如果能把它應用到SQL里面的話,對于復雜SQL語句的編寫會有很大幫助。這里拿一個較為常見的SQL來舉例,這個表格在很多面試的時候都有遇到過:
有兩張表格,分別是學生信息表(Student)、分數表(Score),表格設計如下:
?
要求:取出每個人的數學、語文、物理三科的成績,結果行列設計如下:
姓名 數學 語文 物理
張三 80 80 80
李四 80 80 80
王五 80 80 80
以上為了方便起見,就沒有按數據庫里面的實際數據來寫,大家知道是什么意思就行了。
這個問題是我早年參加筆試時的夢魘,因為總是想不到該怎么寫。但后來在一家互聯網公司里混,整天碰到的都是這類東西,寫的多了也就無所謂了。其實這就是偽代碼的一個應用,下面作個示例。
表格設計良好的情況下,我們應該是這樣寫語句的:
SELECT st.StudentName AS 姓名,ISNULL(math.Score,0) AS 數學,ISNULL(chn.Score,0) AS 語文,ISNULL(phy.Score,0) AS 物理
FROM Student st
? ? LEFT JOIN Score_Math math ON math.StudentId=st.StudentId---關聯數學表
? ? LEFT JOIN Score_Chinese?chn?ON chn.StudentId=st.StudentId--關聯語文表
? ? LEFT JOIN Score_Physic?phy?ON phy.StudentId=st.StudentId--關聯物理表
這個代碼一看就知道是有問題的,因為數學、語文、物理三個表格并不存在,如果我們能夠把這三張表格給構建起來,依次代替Math、Chinese、Physic這三張表的位置,這個SQL就算是完成了。
首先構建Math表:
SELECT Score,StudentId FROM Score WHERE SubjectName='數學'
然后用構建好的Math表去替換偽代碼中的數學表:
SELECT st.StudentName AS 姓名,ISNULL(math.Score,0) AS 數學,ISNULL(chn.Score,0) AS 語文,ISNULL(phy.Score,0) AS 物理
FROM Student st
? ? LEFT JOIN (SELECT Score,StudentId FROM Score WHERE SubjectName='數學')math ON math.StudentId=st.StudentId---關聯數學表
? ? LEFT JOIN (SELECT Score,StudentId FROM Score WHERE SubjectName='語文')chn?ON chn.StudentId=st.StudentId--關聯語文表
? ? LEFT JOIN (SELECT Score,StudentId FROM Score WHERE SubjectName='物理')phy?ON phy.StudentId=st.StudentId--關聯物理表
大功告成!
?
當然還有另外一種寫法,這種寫法就是通過過濾數據來構建數學\語文\物理三個分數表,只是這種寫法看上去不是很直觀,不過也算一種方法,我也把它寫出來吧:
SELECT st.StudentName AS 姓名,ISNULL(math.Score,0) AS 數學,ISNULL(chn.Score,0) AS 語文,ISNULL(phy.Score,0) AS 物理
FROM Student st
?LEFT JOIN Score math ON math.StudentId=st.StudentId AND math.SubjectName='數學' ---關聯數學表
?LEFT JOIN Score chn ON chn.StudentId=st.StudentId AND chn.SubjectName='語文'--關聯語文表
?LEFT JOIN Score phy ON phy.StudentId=st.StudentId AND phy.SubjectName='物理'--關聯物理表
?
看下運行結果:
?
總結一下,SQL偽代碼的思路有以下幾步:
1、先按照題目中的要求,用SELECT 字段 FROM 表格關聯 WHERE 條件的方法,構建出一個最初的SQL語句。這個語句中僅包含必須提取的字段,以及提取這些字段所需要的表格(不存在的話就自己命名一個),這個就是我們需要的偽代碼
2、查看語句中不存在的字段與表格,通過臨時表構建、數據篩選的方式建立關聯表,然后把它替代到偽代碼里面,結束。
當然,實際的SQL編寫可能比這復雜的多,不過都可以通過類似的方法來構建,只是構建層級更多一些而已
總結
- 上一篇: wget整站抓取、网站抓取功能;下载整个
- 下一篇: SQL 增删改查语句