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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬瓜就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值