分组查询
SQL可以将检索到的元组按某一条件进行分组,分组是属性值相同的为一组
- 求每个学生的平均成绩
SELECT sn,AVG(score)
FROM sc
GROUP BY sn
先按sn进行分组,即sn相同的为一组,然后求该组中score的平均值。最后输出是按组输出,一个组为一条记录
分组过滤
当我们对结果集进行分组后,如果需要对分组进行筛选,只留下我们需要的分组,那就要用到分组过滤。
分组过滤的关键词是HAVING
- 求不及格成绩超过两门课的同学学号
SELECT sn
FROM sc
WHERE score < 60
GROUP BY sn HAVING COUNT(*)>2
将成绩小于60分的记录按学号进行分组,然后统计每个分组中记录的条数。如果条数大于2则将学号输出。
- 求有两门以上课程不及格的学生学号和他的平均成绩
SELECT sn,AVG(score)
FROM sc
WHERE sn IN(
SELECT sn
FROM sc
WHERE score<60
GROUP BY sn HAVING COUNT(*)>2
)
GROUP BY sn;
SQL语言中的并交差
在关系代数中有集合的并,交,差运算,SQL语言也能实现相应的运算。
SQL语言;并运算(UNION),交运算(INTERSECTS),差运算(EXCEPT)
基本语法: 子查询 {UNION [ALL] | INTERSECT [ALL] | EXCEPT [ALL]} 子查询
注意:MySQL中只有UNION操作
当没有ALL时结果集中会删除重复元组,而有ALL则会保留
- 求学过002号课的同学或者学过003号同学的学号
SELECT sn FROM sc WHERE cn="003"
UNION
SELECT sn FROM sc WHERE cn="002"
- 求即学过002又学过003课程的同学学号
SELECT sn FROM sc WHERE cn="002"
INTERSECTS
SELECT sn FROM sc WHERE cn="003"
查询小结
SELECT语句完整定义(::==表示定义)
在面向对象/对象关系数据库中SQL将转化为OQL,这个可以作为了解。