当前课程知识点:数据库概论 > 第三章 结构化查询语言SQL > 3.5 复杂SQL查询操作2 > 复杂SQL查询操作2
各位同学大家好
我是来自云南大学软件学院的张璇
我们在前面介绍过
我们可以在SQL命令中使用函数
下面
我们先介绍非常常用的聚合函数
它们是COUNT
MAX
MIN
SUM and AVG
这里的DISTINCT
和ALL我们前面解释过
下面我们在举例过程中会进一步解释
我们来举几个简单的例子
首先
假设我们要查询学生的总人数
本质上
是查询学生表S的所有的记录个数
于是就需要用到count这个函数
这么写SQL命令
Select count括弧星号from S
这里是统计学生表的所有记录个数
也就是学生总数了
而如果要查询选修了课程的学生人数
就应该统计成绩表SC
但注意
一个学生可以选修多门课程
这里我们需要增加
dinstinct的这个限制
统计不重复的学生人数
SQL命令这么写
Select count括弧distinct s#
在这里把所有的学生选取出来
但是去掉重复的
from SC
从SC表里面选取
最后
我们再试试计算C3号课程的
学生的平均成绩
用AVG这个函数
从成绩表中把课程号为c3 的课程成绩
选取出来进行平均值运算
所以
Select后面呢我们写上
AVG括弧grade求平均值
其他和前面都是一样的
这里
我们是对一门课程统计平均成绩
如果我们需要对所有课程
进行平均成绩的统计
where条件不指定就可以了
但是不写where条件
就变成对所有课程求平均成绩
那也不行
怎么办呢
这里
我们可以使用一个新的子句
GROUP BY
帮助我们进行分组
GROUP BY子句
将查询结果按一列或多列值进行分组
值相等的即为一列
如果要查询各门课程的选课人数
这么写SQL命令
Select C#逗号count括弧distinct s#
这里呢是按照c#
来相应的统计相应的学生人数
from后面是SC
最后呢group by c#
这里呢按照课程号c#分组
也就是每一门课程呢我们用count
统计学生个数
这样就可以列出所有课程的选课人数了
那么如果我们进一步限定条件
仅把选课人数超过一定人数的课程查询出来
这时候我们要再增加一个子句
要用HAVING子句
这里
我们如果要查询
选课人数超过3人的课程的课程号
和相应的选课人数
这么写
前面Select是一样的
from是一样的
GROUP BY 是一样的
不过要加入HAVING
HAVING后面呢写
count括弧s#大于3
也就是说这里
是学生人数大于3的我们就把它选取出来
在这里我们注意了
这里因为条件使用了聚合函数count
不能用where子句
这也就是为什么我们会增加
HAVING子句的原因
也就是说
Where子句应用于表中的单个条件
HAVING子句通常用于分组查询
并且放在GROUP BY子句之后
HAVING子句中的查询条件
只能是包含在GROUP BY子句中的列
或者聚合函数
所以大家需要区分好
where和having分别如何
使用设置条件
最后
在使用函数进行查询时
我们还可以使用一个新的子句
COMPUTE
生成一个独立的结果
这个独立的结果以附加行的形式返回
比如说
我们查询每门课程的选课情况
和所有课程的总平均分
这个查询由两个部分构成
一个部分是查询选课情况
另一部分是所有课程的平均分
所有课程平均分没有办法
和选课数据放在同一张数据表
因此
这里用COMPUTE
独立的返回这个值
所以SQL命令这么写
Select后面我们不说了
就是课程号
学号
成绩
from成绩表SC
增加一个compute
后面写上所有课程的
平均成绩的一个运算函数
avg括弧grade
那么在这里呢
我们就独立的通过compute
查询出所有课程的平均成绩
并且独立显示
最后
我们还有几个可用的SQL子句介绍给大家
第一个是ORDER BY子句
ORDER BY子句可以用来对查询结果
按照一个或多个列的升序或降序形式排列
缺省排序顺序为升序
比如说
我们要查询
选修了C3课程的学生的学号和成绩
这里要求查询结果按分数降序排列
那么
在这里我们在语句最后要写一个
order by grade加上DESC
是表示降序排列
前面SELECT
FROM和WHERE用来从成绩表中
把选修了c3课程的学生学号
成绩查询出来
由于查询结果要按照成绩分数的降序排列
高分在前
那么
就用order by将grade
进行一个降序排列就可以了
如果要按照成绩分数升序排列
那么order by后面直接写grade
因为默认方式是升序排列的
下面再看一下
如果Where条件是指定一个条件范围
我们可以使用谓词
BETWEEN …AND…
或者NOT BETWEEN …AND
用来它来进行一个查找属性范围值
在指定范围内的数据
比如说
如果我们要查询
入学年龄在17至20之间的学生的姓名
系和入学年龄
那么我们在Where条件里面这么写
把age写成
between 17 and 20就可以了
在接下来我们看看
如果我们的查询条件不是明确的
比如说
我们要找姓欧阳
并且全名为三个汉字的学生的姓名
这时候
在where子句里面
可以使用like谓词
并且加上通配符百分号
或者下划线表示一个模糊匹配的字符
百分号表示任意多个字符
下划线表示任意一个字符
于是
要找姓欧阳且全名为三个汉字的学生的姓名
那么在SQL命令里面
where后面是这样写的
sname LIKE 单引号引起来
欧阳下划线
也就是
学生姓名sname前两个字符是欧阳
最后一个字符是任意字符的
而如果
我们要查询所有叫某某琦的学生的姓名
学号和性别
那么可以这么写
在where后面sname LIKE
这里的单引号引起来里边呢
百分号表示可以代表多个字符
最后一个字是琦就可以了
那么就表示
学生姓名前面什么字符我们不管
只管最后一个字符是琦就可以了
最后
我们介绍一下涉及空值NULL的查询
如果我们要查询缺少成绩的学生的学号
和相应的课程号
也就是在成绩表中要查询出成绩grade
为空的学生和对应的课程
这时候
我们在写关于空值的查询的时候
where条件是
grade IS NULL
这里的is
不能用等号来代替因为是和空值进行比较
而如果我们要查询
所有有成绩的学生学号和课程号
那么在where后面的grade是写
IS NOT NULL
就是成绩不为空的
就是有成绩的学生那么我们把它返回出来
以上
我们介绍了如何在SQL中使用函数
主要介绍了经常使用的聚合函数
并且伴随着聚合函数的使用
我们介绍了group by子句
having子句
compute子句
它们分别用来完成分组
指定聚合函数条件和统计会总的功能
最后
我们还介绍了一些常见的SQL命令子句
包括排序用order by
设置条件范围用between...and...
模糊查询用like
和设计空值null的查询
到此为止
我们介绍完了SQL语言的基本概念
结构成分
语法形式
并用一些示例
给大家讲解了SQL语言的使用
不过
使用SQL语言进行数据操作时
我们并没有把所有的结果展示给大家
目的是请大家自己
到一个数据库管理系统中进行尝试
看看会得到什么样的结果
加深学习印象
同时
也保证你能写出正确的SQL命令
SQL语言介绍完了
谢谢大家
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video