涉及空值的查询:
谓词 is null 和 is not null 可以用来查询空值和非空值
例:查询缺少成绩的学生学号和相应的课程号(即缺考)
select Sno、Cno from SC where Grade is null
多重条件查询:
通过逻辑运算符 and 和 or 来联结多个查询条件
and 的优先级高于 or ,可以使用括号改变优先级
对查询结果进行排序:
如果没有指定查询结果的显示顺序,DBMS将按其最方便的顺序(通常是元组中的先后顺序)输出查询的结果。
用户可以用 order by 子句指定按照一个或多个属性列的升序(ASC默认)或降序(DESC)重新排列查询结果。
当排序列含空值时:
ASC:排序列为控制的元组最后显示:DESC:排序列为空值的元组最先显示。
例:查询全体学生情况,查询结果按所在系的系号升序排序,同一系中的学生按年龄降序排序
select * from student order by sdept , sage desc
注意:多个关键字排序,先按第一个关键字排序,当第一个关键字相同时,按第二个关键字排,相同再依次往下匹配。
使用聚合函数查询(汇总查询):
可以应用于表中的所有行、where子句指定的表的子集
聚合函数 | 描述 |
count( * ) | 选定的行数(统计元组个数,不忽略空值) |
COUNT ( [ALL (所有值)| DISTINCT(去掉重复值,即只统计一次)] column | expression ) | 统计某列中值的个数(忽略空值)(列名应出现再表达式中,列名只出现一次) |
SUM(ALL | DISTINCT column) | 数值表达式中所有值的和(忽略空值) |
AVG( ALL | DISTINCT) | 数值表达式中所有值得平均值(忽略空值) |
MAN(column | expression) | 表达式中得最高值(忽略空值) |
MIN(column | expression) | 表达式中得最低值(忽略空值) |
1、如果选择列表( select 选择列表 from .... )中使用了聚合函数,则该选择列表只能包含:
(1)聚合函数
(2)group by 子句中分组的列
(3)为结果集中每一行返回同一值(例如一个常量)的表达式
2、where 子句中不能使用聚合函数
AVG
以下示例演示如何使用AVG()
函数计算每个部门的平均工资:
SELECT
department_name, ROUND(AVG(salary), 0) avg_salary
FROM
employees
INNER JOIN
departments USING (department_id)
GROUP BY department_name
ORDER BY department_name;
MIN:
例如,以下语句返回每个部门中员工的最低工资:
SELECT
department_name, MIN(salary) min_salary
FROM
employees
INNER JOIN
departments USING (department_id)
GROUP BY department_name
ORDER BY department_name;
MAX:
例如,以下语句返回每个部门中员工的最高薪水:
SELECT
department_name, MAX(salary) highest_salary
FROM
employees
INNER JOIN
departments USING (department_id)
GROUP BY department_name
ORDER BY department_name;
count()函数
例如:
(1)以下示例使用COUNT(*)
函数返回每个部门的人数:
SELECT
department_name, COUNT(*) headcount
FROM
employees
INNER JOIN
departments USING (department_id)
GROUP BY department_name
ORDER BY department_name;
(2)选修了课程的学生:
select count(distinct sno) from sc
SUM()函数:
例如,以下语句返回每个部门中所有员工的总薪水:
SELECT
department_id, SUM(salary)
FROM
employees
GROUP BY department_id;
分组查询:
group by 子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组。
分组的结果仍是一张表,通过having子句可以选择其中的记录。
如:求学校的工资总和,共有15个学院,就15组,一组一个元组,每个学院一组,每组对应一个值。
分组查询一般与聚合函数一起使用,实现分类汇总。分组后聚合函数将作用与每一个组,即每一组都有一个函数值。
例1:求各个课程号及相应的选课人数。
select cno , count ( sno ) from sc group by cno
例2:查询选修了3门以上课程的学生学号
select sno from sc group by sno having count(*) >3
例3:查询有3门或3门以上课程>=90分的学生的学号及课程数
select sno , count(*) from sc where grade>=90 group by sno having count(*) >3
注意: haveing 短语与where 子句的区别:
作用对象不同:
基表或视图,从中选择满足条件的元组。
having 短语作用于组,从中选择满足条件的组。
例:统计选课学生的学号和选课门数,以学号和门数作为结果的列名
select sno(查询的列) as 学号(列名) , count(cno)from sc(查询的表名) group by sno(按哪一列分组)
例:统计男生人数和女生人数,以性别和人数作为结果列名
select ssex(查询的列)性别(生成表的列名) , count ( * ) 人数(生成表的列名) from student group by ssex(按哪一列分组)