数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL( 3.4 数据查询 )(三)

简介: 数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL( 3.4 数据查询 )(三)

4. 聚集函数

SQL提供的一些聚集函数:

部分聚集函数:

  • 如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。
  • 如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复值。

例:查询学生总人数

SELECT count(*)
FROM student;

例:查询选修了课程的学生人数

学生每选修一门课,在SC中都有一条相应的记录。一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT 短语

SELECT count( DISTINCT Sno)
FROM SC;

例:查询3号课程所有学生的成绩总和

聚集函数遇到空值时,除 COUNT(*)外,都跳过空值而只处理非空值。COUNT(*)是对元组进行计数,某个元组的一个或部分列取空值不影响COUNT的统计结果。

SELECT SUM(Grade)
FROM SC
WHERE Cno = '3';

SELECT *
FROM SC
WHERE Cno = '3';

注意,WHERE子句中是不能用聚集函数作为条件表达式的

聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句

5. GROUP BY 字句

GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组

查询结果分组的目的为了细化聚集函数的作用对象

如果未对查询结果分组聚集函数将作用于整个查询结果分组后聚集函数将作用于每一个组,即每一组都有一个函数值。

例:求各个课程号及相应的选课人数

SELECT Cno,count(Sno)
FROM sc
GROUP BY Cno;

如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件

例:查询选修了3门及以上课程的学生学号。

SELECT Sno
FROM sc
GROUP BY Sno 
HAVING count(Cno)>=3;

WHERE子句与 HAVING短语的区别在于作用对象不同WHERE子句作用于基本表或视图,从中选择满足条件的元组HAVING短语作用于,从中选择满足条件的组

WHERE子句中是不能用聚集函数作为条件表达式的.

例:查询平均成绩大于等于90的学生学号和平均成绩

SELECT Sno, AVG(Grade)
FROM sc
GROUP BY Sno
HAVING AVG(Grade)>=90;

3.4.2 连接查询

若一个查询同时涉及两个以上的表,则称之为连接查询

连接查询是关系数据库中最主要的查询,包括:

  • 等值连接查询
  • 自然连接查询
  • 非等值连接查询
  • 自身连接查询
  • 外连接查询
  • 复合条件连接查询

1. 等值与非等值连接查询

连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为

[<表名1>.]<列名1>  <比较运算符>  [<表名2>.]<列名2>
  • 其中比较运算符主要有=、>、<、>=、<、!=(或<>)等。

此外连接谓词还可以使用下面形式:

[<表名1>.]<列名1>  BETWEEN  [<表名2>.]<列名2>  AND  [<表名2>.]<列名3>

连接运算符为= 时,称为 等值连接

使用其他运算符称为非等值连接

连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必相同。

例:查询每个学生及其选修课程的情况

SELECT s.*, sc.*
FROM student AS s, sc
# 通过学号将两个表进行关联
WHERE s.Sno = sc.Sno;

若在等值连接中把目标列中重复的属性列去掉则为自然连接

SELECT s.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM student AS s, sc
WHERE s.Sno = sc.Sno;

由于Sname,Ssex,Sage,Sdept,Cno和 Grade属性列在Student表与SC表中是唯一的,因此引用时可以去掉表名前缀;而Sno在两个表都出现了,因此引用时必须加上表名前缀

加上表名前缀查询的效率会更高,因为不用判断是哪个表的属性。

一条SOL语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件

例:查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。

SELECT s.Sno, Sname
FROM student AS s, sc
# 先选出2号课程和90分以上的数据,再进行连接
# 查询效率更高
WHERE Cno = '2' AND
      Grade > 90 AND
      s.Sno = sc.Sno;

2. 自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接

注意:

  • 需要给表起别名以示区别
  • 由于所有属性名都是同名属性,因此必须使用表的别名前缀

例:查询每一门课的间接先修课(即先修课的先修课)

SELECT c1.Con, c2.Cpno
FROM mydb1.course c1, mydb1.course c2
# c1 的先修课为 c2 中的课程,c1 的间接先修课为 c2的先修课
WHERE c1.Cpno = c2.Con;

3. 外连接

在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。

有时想以Student表为主体列出每个学生的基本情况及其选课情况。若某个学生没有选课,仍把Student的悬浮元组保存在结果关系中,而在SC表的属性上填空值NULL,这时就需要使用外连接

SELECT s1.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student s1 LEFT OUTER JOIN SC s2 ON s1.Sno = s2.Sno;

左外连接列出左边关系(如本例 Student)中所有的元组右外连接列出右边关系中所有的元组

4. 多表连接

连接操作除了可以是两表连接、一个表与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接

关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作再将其连接结果与第三个表进行连接

例:查询每个学生的学号、姓名、选修的课程名及成绩。

SELECT s.Sno, Sname, Cname, Grade
FROM Student s, SC, Course c
# 先两张表,再第三张表
WHERE s.Sno = SC.Sno AND SC.Cno = c.Con;


相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
相关文章
|
9天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
32 11
|
8天前
|
运维 关系型数据库 MySQL
自建数据库迁移到云数据库RDS
本次课程由阿里云数据库团队的凡珂分享,主题为自建数据库迁移至云数据库RDS MySQL版。课程分为四部分:1) 传统数据库部署方案及痛点;2) 选择云数据库RDS MySQL的原因;3) 数据库迁移方案和产品选型;4) 线上活动与权益。通过对比自建数据库的局限性,介绍了RDS MySQL在可靠性、安全性、性价比等方面的优势,并详细讲解了使用DTS(数据传输服务)进行平滑迁移的步骤。此外,还提供了多种优惠活动信息,帮助用户降低成本并享受云数据库带来的便利。
|
23天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
22天前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
29天前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
29天前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
24天前
|
安全 关系型数据库 MySQL
体验自建数据库迁移到云数据库RDS,领取桌面置物架!
「技术解决方案【Cloud Up 挑战赛】」正式开启!本方案旨在帮助用户将自建数据库平滑迁移至阿里云RDS MySQL,享受稳定、高效、安全的数据库服务,助力业务快速发展。完成指定任务即可赢取桌面置物架等奖励,限量供应,先到先得。活动时间:2024年12月3日至12月31日16点。
|
1月前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
19 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
23 3