查询:涉及空值的查询,多重条件查询,对查询结果进行排序,使用聚合函数查询(汇总查询),分组查询

及空值的查询:

谓词 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 子句的区别:

                作用对象不同:

                where子句作用于基表视图,从中选择满足条件的元组。

                having 短语作用于组,从中选择满足条件的组。

例:统计选课学生的学号和选课门数,以学号和门数作为结果的列名

select sno(查询的列) as 学号(列名) , count(cno)from sc(查询的表名) group by sno(按哪一列分组)

例:统计男生人数和女生人数,以性别和人数作为结果列名

select ssex(查询的列)性别(生成表的列名) , count ( * ) 人数(生成表的列名) from student group by ssex(按哪一列分组)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值