zoukankan      html  css  js  c++  java
  • 数据库笔记(二)

    1.Rollup


    Rollup(X,Y,Z)
    按
    X,Y,Z
    X,Y
    Z
    0
    进行分组
    

    举个栗子

    SELECT  SNO,CNO,AVG(DEGREE) as 平均分  FROM  Score
    GROUP  BY ROLLUP(SNO,CNO)  
    

    • 没有框起来的是根据(SNO,CNO)进行分组;第一个红框是根据SNO进行分组;第二个红框是总的汇总行
    • (GROUP BY 汇总行在结果中显示为 NULL,但可用来表示所有值)
    • rollup里面的参数和顺序有关
    • Group by Rollup(X,Y,Z)等价于Group by X,Y,Z with Rollup

    2.CUBE


    CUBE(X,Y,Z)
    按
    X,Y,Z
    X,Y
    X,Z
    Y,Z
    X
    Y
    Z
    0
    进行分组
    

    举个栗子


    SELECT  SNO, CNO,AVG(DEGREE) as 平均分 FROM  SCORE
    GROUP  BY  SNO,CNO WITH CUBE
    

    • 和rollup有些相似
    • 没有框起来的是根据(SNO,CNO)进行分组;第一个红框是根据SNO进行分组;第二个红框是总的汇总行
    • 但是cube比rollup多了根据CNO的分组,就是那个蓝框
    • rollup里面的参数和顺序有关
    • Group by Rollup(X,Y,Z)等价于Group by X,Y,Z with Rollup

    3.Grouping Sets


    Grouping Sets(X,Y,Z)
    按
    X
    Y
    Z
    进行分组
    

    举个栗子


    SELECT  SNO,CNO,AVG(DEGREE) as 平均数  FROM SCORE
    GROUP BY GROUPING SETS (SNO,CNO)
    

    • 红框里面是根据SNO进行分组,蓝框是根据CNO进行分组

    4.其他


    SELECT  SNO,CNO,AVG(DEGREE)  FROM SCORE092
    GROUP BY GROUPING SETS (ROLLUP(SNO,CNO))  --等价于ROLLUP(SNO,CNO)
    --或者 GROUPING SETS((SCO,CNO),SNO) union select null,null,avg(degree) from Score
    --因为sets里面不能放空数据,若不用rollup  cube,则grouping  sets不会出现 null null的数据
    所以需要使用union将空数据加进去
    
    同理GROUP BY GROUPING SETS (CUBE(SNO,CNO)) 也是如此
    

    SELECT  SNO,CNO,AVG(DEGREE)  FROM Score092
    GROUP BY GROUPING SETS (ROLLUP(SNO,CNO),CUBE(SNO,CNO))
    相当于{(SNO,CNO),SNO,0,(SNO,CNO),SNO,CNO,0}并没有去掉重复数据
    

    5.题目

    5.1查询学生信息,包括学号,课程号,成绩以及学生的平均分。(一个语句)

    SELECT Sno 学号,ISNULL(Cno,'平均') 课程号, cast AVG(Degree) AS numeric(4,1) '成绩/平均分' from SCORE
    GROUP BY Sno,Cno WITH ROLLUP     --GROUP BY GROUPING SETS((SNO,CNO),SNO)
    having sno is not null
    
    • ISNULL(a,b):如果a数据为NULL,就用b数据代替
    • 聚合函数不能写在where后面,需要写在having后面,having后面还能跟分组列

    5.2查询学生信息,包括姓名,课程名,成绩以及每位学生的平均分和每门课程的平均分。(一个语句)

    SELECT ISNULL(s.Sname,'平均') 姓名,ISNULL(c.Cname,'平均') 课程名,AVG(Degree) AS '成绩/平均分' from Student s
    join Score sc on sc.Sno=s.Sno join Course c on c.Cno=sc.Cno
    GROUP BY s.Sname,c.Cname WITH CUBE    --GROUP BY GROUPING SETS((SNO,CNO),SNO,CNO)
    
    • 需要检索出每位学生的平均分和每门课程的平均分,所以需要将成绩表和课程表进行连接

    5.3查询学生信息,包括学号,姓名,课程号,课程名,成绩以及每位学生的平均分和每门课程的平均分。(一个语句)

    SELECT ISNULL(s.Sno,'平') 学号,ISNULL(s.Sname,'均') 姓名,ISNULL(c.Cno,'平') 课程号,ISNULL(c.Cname,'均') 课程名,AVG(Degree) as '成绩/平均分' 
    from Student s join Score sc on sc.Sno=s.Sno join Course c on c.Cno=sc.Cno
    GROUP BY GROUPING SETS((s.Sno,s.Sname,c.Cno,c.Cname),(s.Sno,s.Sname),(c.Cno,c.Cname))    --GROUP BY GROUPING SETS(cube((s.Sno,s.Sname),(c.Cno,c.Cname)))
    
    • 需要检索出(学号,姓名),(课程号,课程名),所以将他们放在一起检索

    5.4查询学生信息,包括学号,姓名,课程号,课程名以及每位学生的平均分和每门课程的平均分。(一个语句)

    SELECT ISNULL(s.Sno,'平') 学号,ISNULL(s.Sname,'均') 姓名,ISNULL(c.Cno,'平') 课程号,ISNULL(c.Cname,'均') 课程名,AVG(Degree) AS '成绩/平均分' 
    from Student s join Score sc on sc.Sno=s.Sno join Course c on c.Cno=sc.Cno
    GROUP BY GROUPING SETS((s.Sno,s.Sname),(c.Cno,c.Cname))
    
  • 相关阅读:
    alternatives命令用法
    Apache Kafka官方文档翻译(原创)
    java===泛型
    java===map集合
    java===集合框架之HashSet,treeSet
    java===集合之linkedlist
    java===集合框架之list体系
    StringBuilder===练习
    java===String类练习
    java练习多线程
  • 原文地址:https://www.cnblogs.com/hyj-/p/12703885.html
Copyright © 2011-2022 走看看