1.纵 横表的优缺点
优缺点:
横表:表结构更加的清晰明了,关联查询的一些sql语句也更容易,方便易于后续开发人员的接手,但是如果字段不够,需要新增字段,会改动表结构。
纵表:扩展性更高,如果要增加一个字段,不需要改变表结构,但是一些关联查询会更加麻烦,也不便于维护与后续人员接手。
平常开发,尽量能用横表就不要用纵表,维护成本比较高昂,而且一些关联查询也很麻烦。
2.纵表转横表的具体操作
(1)首先创建socres表,具体如下:
(2)将上面的纵表转换为横表,可以一目了然的看到同学的各科成绩,方便查看,我先看一下转换后的效果:
(3)
分析:首先查成绩需要学生姓名,那么就需要根据姓名进行分组
语法如下:
select 姓名 from scores group by 姓名
实现代码如下:
select name from scores group by name
代码实现效果:
我们要拿到其中一门科目的分数,既然我们用到了group by 语句,这里肯定要用聚合函数来求分数。
而且我们只需要语文这一科的成绩,分组出来的 一共有 3列 ,分别是 语文、数学、英语 。 那么就需要判断科目来取分数。
这里符合我们需求的 case 语句就登场了。它和c#中switch-case 作用一样。
sql case 语句语法:
case 字段
when 值1 then 结果
when 值2 then 结果2
...
else 默认结果
end
当用到case 语句语法之后就可以对学生进行成绩查询了
语法如下:
select 姓名,
SUM(case 课程 when '课程名' then grade else 0 end)
as 课程名 from scores group by name
具体代码如下:
select name,
SUM(case course when '语文' then grade else 0 end)
as 语文 from scores group by name
代码实现效果:
既然已经查到了语文成绩,那么其他成绩自然能查询出来
select name,
SUM(case course when '语文' then grade else 0 end) as 语文 ,
SUM(case course when '数学' then grade else 0 end) as 数学 ,
SUM(case course when '英语' then grade else 0 end) as 英语
from scores group by name
代码实现效果:
查询出来之后只需要将这个表插入到一个新表中就可以实现将纵表转换为横表了
select name,
SUM(case course when '语文' then grade else 0 end) as 语文 ,
SUM(case course when '数学' then grade else 0 end) as 数学 ,
SUM(case course when '英语' then grade else 0 end) as 英语
into scores3
from scores group by name
代码效果如下: