开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
GROUP BY
GROUP BY可将计算控制在组一级,分组的目的是细化计算函数的作用对象。分组语句位置在WHERE子句的后边,一般形式为:
GROUP BY<分组依据列>[HAVING<组过滤条件>]
- 统计每门课程的选课人数,列出课程号和人数
SELECT Cno 课程号, COUNT(Sno) 选课人数 FROM SC GROUP BY Cno
- 查询每名学生的选课门数和平均成绩。
SELECT Sno as 学号, COUNT(Cno) as 选课门数, AVG(Grade) as 平均成绩 FROM SC GROUP BY Sno
使用HAVING
- HAVING用于对分组进行筛选,它有点象WHERE子句,但它用于组而不是对单个记录。
- 在HAVING子句中可以使用计算函数,但在WHERE子句中则不能。
- HAVING通常与GROUP BY子句一起使用。
查询修了3门以上课程的学生的学号
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(Cno) >=3
查询修课门数等于或大于4门的学生的平均成绩和选课门数。
SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 修课门数 FROM SC GROUP BY Sno HAVING COUNT(*) >= 4
多表连接查询
- 内连接(最常用的连接类型)
- 自连接(一种特殊的内连接)
- 外连接
- 交叉连接
内连接
SELECT … FROM <表1> [INNER] JOIN <表2> ON <连接条件>
- 连接查询中用于连接两个表的条件称为连接条 件或连接谓词。
- 一般格式为:
[<表名1.>]<列名1> <比较运算符> [<表名2.>]<列名2>
执行连接的过程
首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组。找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。表2全部查找完毕后(或确定表2已没有满足本次连接条件的记录),再取表1中的第2个元组,然后再从头(或其他相应位置)开始扫描表2,并逐一连接满足条件的元组将其加入结果。重复这个过程,直到表1中的全部元组都处理完毕为止。
查询每个学生基本信息及其修课的情况。
SELECT * FROM Student INNER JOIN SC ON Student.Sno = SC.Sno -- 将Student与 SC连接起来
自连接
- 为特殊的内连接
- 相互连接的表物理上为同一张表。
- 必须为两个表取别名,使之在逻辑上成为两个表。
外连接
- 只限制一张表中的数据必须满足连接条件,而另一张表中数据可以不满足连接条件。
- 可以输出不满足连接条件的元组的信息。
- 语法格式: 左外连接 右外连接 全外连接
FROM <表1> LEFT | RIGHT | FULL [OUTER] JOIN <表2> ON <连接条件>
SELECT Student.Sno, Sname, Cno, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno
连接算是比较重要的一部分,在写这部分代码的时候开始我会有些晕,就是搞不清楚顺序还有语法这些,但是多写几遍就好啦,熟能生巧。