11⭐全网首发☀️数据有道之数据库技术❤️干货大全【持续更新】❗❗❗

简介: ⭐全网首发☀️数据有道之数据库技术❤️干货大全【持续更新】❗❗❗

6.2 查询结果的并、交、差运算

考点1 并运算

(1)概述

并运算可将两个或多个查询语句的结果集合并为一个结果集,这个运算可以使用UNION运算符实现。UNION是一个特殊的运算符,通过它可以实现让两个或更多的查询产生单一的结果集。


(2)UNION与JOIN的区别


UNION操作与JOIN连接操作不同,UNION更像是将一个查询结果追加到另一个查询结果中(虽然各数据库管理系统对UNION操作略有不同,但基本思想是一样的)。JOIN操作是水平地合并数据(添加更多的列),而UNION是垂直地合并数据(添加更多的行)。


(3)语法格式


SELECT语句1


UNION[ALL]


SELECT语句2


UNION[ALL]



SELECT语句n


其中:ALL表示在结果集中包含所有查询语句产生的全部记录,包括重复的记录。如果没有指定ALL,则系统默认是删除合并后结果集中的重复记录。


(4)注意事项


①所有要进行UNION操作的查询,其SELECT列表中列的个数必须相同,而且对应列的语义应该相同。


②各查询语句中每个列的数据类型必须与其他查询中对应列的数据类型是隐式兼容的,即只要它们能进行隐式转换即可。例如,如果第一个查询中第二个列的数据类型是char(20),而第二个查询中第二个列的数据类型是varchar(40)是可以的。


③合并后的结果采用第一个SELECT语句的列标题。


④如果要对查询的结果进行排序,则ORDER BY子句应该写在最后一个查询语句之后,且排序的依据列应该是第一个查询语句中出现的列名。


【真题演练】


下述语句的功能是将两个查询结果合并为一个结果,其中正确的是(    )。[2014年3月真题]


A.


B.


C.


D.


【答案】B


考点2 交运算

(1)概述


交运算将返回同时在两个集合中出现的记录,即返回两个查询结果集中各个列的值均相同的记录,并用这些记录构成交运算的结果。实现交运算的运算符为INTERSECT。


(2)语法格式


SELECT语句1


INTERSECT


SELECT语句2


INTERSECT



SELECT语句n


INTERSECT运算对各查询语句的要求同UNION运算。


考点3 差运算

(1)概述


差运算将返回在第一个集合中有但第二个集合中没有的数据。实现差运算的SQL运算符为EXCEPT。


(2)语法格式


SELECT语句1


EXCEPT


SELECT语句2


EXCEPT



SELECT语句n


EXCEPT运算对各查询语句的要求同UNION运算。


6.3 相关子查询

考点1 概 述

(1)定义


在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。如果一个SELECT语句是嵌套在一个SELECT、INSERT、UPDATE或DELETE语句中,则称为子查询或内层查询,包含子查询的语句称为主查询或外层查询。


(2)子查询与外层查询的关系


一个子查询也可以嵌套在另外一个子查询中。为了与外层查询有所区别,总是把子查询写在圆括号中。与外层查询类似,子查询语句中也必须包含SELECT子句和FROM子句,并可以根据需要选择WHERE子句、GROUP BY子句和HAVING子句。


考点2 语法格式

·WHERE表达式 [NOT] IN(子查询)


·WHERE表达式 比较运算符(子查询)


·WHERE [NOT] EXISTS(子查询)


通常,子查询一般用在外层查询的WHERE子句或HAVING子句中,与比较运算符或逻辑运算符一起构成查询条件。对于返回结果为单值的子查询语句,可以出现在任何允许使用表达式的地方。


考点3 用 途

(1)使用子查询进行基于集合的测试


①使用子查询进行基于集合的测试时,通过运算符IN和NOT IN,将一个表达式的值与子查询返回的结果集进行比较。


②形式为:


WHERE表达式 [NOT] IN(子查询)


这种形式的子查询的语句是分步骤实现的,即先执行子查询,然后在子查询的结果基础上再执行外层查询。子查询返回的结果实际上就是一个集合,外层查询就是在这个集合上使用IN运算符进行比较。


(2)使用子查询进行比较测试


①使用子查询进行比较测试时,通过比较运算符(=、<>、<、>、<=、>=),将一个表达式的值与子查询返回的单值进行比较。如果比较运算的结果为True,则比较测试返回True;如果比较运算的结果为False,则比较测试返回False。


②形式为:


WHERE表达式 比较运算符(子查询)


使用子查询进行的比较测试要求子查询语句必须是返回单值的查询语句。


③注意:由于聚合函数不能出现在WHERE子句中,因此,当一个列的值与一个聚合函数的结果进行比较时,必须用子查询先得到聚合函数的结果,然后在此结果基础之上再执行外层查询的比较。


子查询的查询条件不依赖于外层查询,称这样的子查询为不相关子查询或嵌套子查询。


(3)使用子查询进行存在性测试


使用子查询进行存在性测试时,通常使用EXISTS谓词,其形式为:


WHERE [NOT] EXISTS(子查询)


带EXISTS谓词的子查询不返回查询的结果,只产生逻辑真值和逻辑假值。


①EXISTS的含义是:当子查询中有满足条件的数据时,EXISTS返回真值,否则返回假值。


②NOT EXISTS的含义是:当子查询中有满足条件的数据时,NOT EXISTS返回假值,当子查询中不存在满足条件的数据时,NOT EXISTS返回真值。


6.4 其他形式的子查询

考点1 替代表达式的子查询

替代表达式的子查询是指在SELECT语句的选择列表中嵌入一个只返回一个标量值的 SELECT语句,这个查询语句通常都是通过一个聚合函数来返回一个单值。


考点2 派生表

(1)概述


派生表(有时也称为内联视图)是将子查询作为一个表来处理,这个由子查询产生的新表就被称为“派生表”,可在查询语句中用派生表来建立与其他表的连接关系,在生成派生表后,在查询语句中对派生表的操作与普通表一样。


(2)优点


使用派生表可以简化查询,从而避免使用临时表,而且相比手动生成临时表的方法性能更优越。


(3)出现


派生表与其他表一样出现在查询语句的FROM子句中。例如:


这里的temp就是派生表。


6.5 其他一些查询功能

考点1 开窗函数

(1)概述


在SQL Server中,一组行被称为一个窗口,开窗函数是指可以用于“分区”或“分组”计算的函数。这些函数结合OVER子句对组内的数据进行编号,并进行求和、计算平均值等统计。从这个角度来说,SUM、AVG以及ROW_NUMBER(对数据进行编号的函数)等都可以称为开窗函数。


开窗函数可以分别应用于每个分区,把每个分区看成是一个窗口,并为每个分区进行计算。开窗函数必须放在OVER子句前边。


(2)分类


排名开窗函数和聚合开窗函数。


(3)将OVER子句与聚合函数结合使用


①使用方法与语法格式


OVER子句用于确定在应用关联的开窗函数之前对行集的分区和排序。


将OVER子句与聚合函数结合使用的语法格式为:


②参数说明


a.PARTITION BY:将结果集划分为多个分区。开窗函数分别应用于每个分区,并为每个分区计算函数值。


b.value_expression:指定对行集进行分区所依据的列,该列必须是在FROM子句中生成的列,而且不能引用选择列表中的表达式或别名。value_expression可以是列表达式、替代表达式的子查询、标量函数或用户定义的变量。


注意:可以在单个查询中使用多个开窗函数,每个函数的OVER子句在分区和排序上可以不同。


(4)将OVER子句与排名函数一起使用


排名函数为分区中的每一行返回一个排名值。根据所用函数的不同,某些行可能与其他行具有相同的排名值。排名函数具有不确定性。


SQL Server提供了四个排名函数:RANK、DENSE_RANK、NTILE和ROW_NUMBER。下面分别介绍这些排名函数。


①RANK()函数


a.语法格式


b.参数含义


<partition_by_clause>:将FROM子句生成的结果集划分成排名函数适用的分区。


<order_by_clause>:指定应用于分区中的行时所基于的排序依据列。


RANK()函数返回结果集中每行数据在每个分区内的排名。每个分区内行的排名从1开始。


注意:如果排序时有值相同的行,则这些值相同的行具有相同的排名。例如,如果两位销售人员有相同的年销售量,则他们将并列第一,并且下一个销售人员的排名是第三。因此,RANK()函数并不一定返回连续整数。


【例2】查询订单号、产品号、订购数量以及每个产品在每个订单中的订购数量排名。


分析:该查询需要用订单号进行分区,用订购数量作为排名依据列。


②DENSE_RANK()函数


DENSE_RANK()函数与RANK()函数的作用基本一样,使用方法也一样,唯一的区别是DENSE_RANK()函数的排名中间没有任何间断,即该函数返回的是一个连续的整数值。


【例3】将【例2】的查询改为用DENSE_RANK()函数实现。


③NTILE()


a.作用


将有序分区中的行划分到指定数目的组中,每个组有一个编号,编号从1开始。对于每一行,NTILE()函数将返回此行所属的组的编号。


b.语法格式


各参数含义同RANK()函数。


考点2 公用表表达式

(1)定义


将查询语句产生的结果集指定一个临时命名的名字,这些命名的结果集就称为公用表表达式(CTE)。命名后的公用表表达式后可以在SELECT、INSERT、UPDATE、DELETE等语句中被多次引用。公用表表达式还可以包括对自身的引用,这种表达式称为递归公用表表达式。


(2)优点


①可以定义递归公用表表达式。


②使数据操作代码更加清晰简洁。


③GROUP BY子句可以直接作用在子查询所得的标量列上。


④可以在一个语句中多次引用公用表表达式。


(3)语法格式


(4)参数说明


①expression_name:公用表表达式的标识符。expression_name必须与在同一WITH< common_table_expression>子句中定义的任何其他公用表表达式的名称不同,但该名可以与基本表或视图名相同。在查询中对expression_name的任何引用都会使用公用表表达式。


②column_nanle:在公用表表达式中指定列名。在一个CTE定义中不允许出现重名的列名,


③SELECT语句:指定一个用其结果集填充到公用表表达式的SELECT语句。


每文一语

闲下来,才能惰性的灵魂


相关文章
|
2月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
192 61
|
5天前
|
人工智能 物联网 大数据
解密时序数据库的未来:TDengine Open Day技术沙龙精彩回顾
在数字化时代,开源已成为推动技术创新和知识共享的核心力量,尤其在数据领域,开源技术的涌现不仅促进了行业的快速发展,也让更多的开发者和技术爱好者得以参与其中。随着物联网、工业互联网等技术的广泛应用,时序数据库的需求愈发强烈,开源的兴起更是为这一技术的创新与普及提供了强有力的支持。
17 3
|
16天前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
52 15
|
5天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
17 1
|
9天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
12天前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
41 5
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
13天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
13天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
13天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2