データベースノート(2)

今週の学習サマリー

学習経験


   昨晚写的实验报告,写得焦头烂额
   一脸懵逼,分不清rollup,cube和grouping sets
   今天在老师的讲解之下,仿佛get了点什么

学習内容

1.ロールアップ


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に従ってグループ化されます。2番目の赤いフレームは合計の要約です
  • (GROUP BYサマリー行は結果ではNULLとして表示されますが、すべての値を表すために使用できます)
  • ロールアップのパラメータは注文に関連しています
  • Rollup(X、Y、Z)によるグループ化等

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

  • ロールアップに似ています
  • フレーム化されていないものは(SNO、CNO)に従ってグループ化されます。最初の赤いフレームはSNOに従ってグループ化されます。2番目の赤いフレームは合計の要約です
  • しかし、CNOによると、キューブはロールアップよりもグループ化されています。つまり、青いボックスです。
  • ロールアップのパラメータは注文に関連しています
  • Rollup(X、Y、Z)によるグループ化等

3.グループ化セット


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学生番号、コース番号、成績、平均学生スコアなどの学生情報を照会します。(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データを使用します
  • 集合関数はどこにでも書くことができず、持った後に書く必要があり、グループ化した列は持った後に従うことができます

5.2名前、コース名、成績、各学生の平均スコア、各コースの平均スコアなどの学生情報を照会します。(1つのステートメント)

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学生番号、名前、コース番号、コース名、成績、各学生の平均スコア、各コースの平均スコアなどの学生情報を照会します。(1つのステートメント)

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学生番号、名前、コース番号、コース名、各学生の平均スコア、各コースの平均スコアなどの学生情報を照会します。(1つのステートメント)

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))

おすすめ

転載: www.cnblogs.com/hyj-/p/12703885.html