伪代码编写在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编写可能比这复杂的多,不过都可以通过类似的方法来构建,只是构建层级更多一些而已