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


版权声明:本文为wxl847466025原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。