欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【数据库知识扫描】 | SQL复习-中篇 第14课 组合查询

程序员文章站 2022-06-14 11:11:02
...

日有所思,夜有所梦。昨晚上正在梦里浏览网页,忽然跳出京东的笔试邀请链接,不小心点开了,居然就直接回答起来,第一道题问的是Python的语言特性,心里慌得握不住鼠标,居然写出来好几条。醒来才发现,我没有投京东,/笑哭。

闲话毕,稍微扫一扫前面的各种联结,就开始今天的组合查询学习,主要是利用UNION操作符将多条SELECT语句组合成一个结果集。

目录

14.1 组合查询

14.2 创建组合查询

① 使用UNION

② UNION规则

③ 包含或取消重复的行

④ 对组合查询结果排序


14.1 组合查询

SQL允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compoundquery)

可以先看看在哪些场景可以用上组合查询:

□ 在一个查询中从不同的表返回结构数据;

□ 对一个表执行多个查询,按一个查询返回数据。

组合查询和多WHERE问题:多数情况下,组合相同表的两个查询所完成的工作与具有多个WHERE子句条件的一个查询所完成的工作相同。换句话说,任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询

14.2 创建组合查询

可以来创建试试,就知道在说什么了,上一个多WHERE问题也能得到理解了:

① 使用UNION

给出每条SELECT语句,在各条语句之间放上关键字UNION

比如如果需要Illinois、Indiana和Michigan等美国几个州的所有顾客的报表,还想包括不管位于哪个州的所有的Fun4All。

WHERE子句可以用,不过为了熟悉并操作可以先使用UNION。走个实例:

【数据库知识扫描】 | SQL复习-中篇 第14课 组合查询

第一条SELECT把Illinois、Indiana、Michigan等州的缩写传递给IN子句,检索出这些州的所有行。第二条SELECT利用简单的相等测试找出所有Fun4All。

再来试试组合查询结果:

SELECT cust_name,cust_contact,cust_email FROM Customers  WHERE cust_state IN('IL','IN','MI') UNION SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_name = 'Fun4All';

【数据库知识扫描】 | SQL复习-中篇 第14课 组合查询

合并了上面结果,把输出组合成一个查询结果集。如果使用我们熟悉的多条WHERE子句呢?试试看。

【数据库知识扫描】 | SQL复习-中篇 第14课 组合查询

看起来语句要比上面UNION更为简洁。

书上提到在简单的例子中,使用UNION可能比使用WHERE子句更为复杂。但对于较复杂的过滤条件,或者从多个表(而不是一个表)中检索数据的情形,使用UNION可能会使处理更简单。牛刀和菜刀同样都能切开南瓜,什么时候用什么。

UNION限制问题:使用UNION组合SELECT语句的数目,SQL没有标准限制。具体每个DBMS可参考文档,了解它是否对UNION能组合的最大语句数目有限制。

性能问题:多数好的DBMS使用内部查询优化程序,在处理各条SELECT语句前组合它们。理论上讲,这意味着从性能上看使用多条WHERE子句条件还是UNION应该没有实际的差别。仅仅是从是理论上,实践中多数查询优化程序并不能达到理想状态,所以最好测试一下这两种方法,看哪种工作得更好。

② UNION规则

讲完使用,来讲范围,需要注意这样几点:

□ UNION必须由两条或两条以上的SELECT语句组成,语句间用关键字UNION分隔(组合四条SELECT语句,将要使用三个UNION关键字)。

□ UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。

列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。

遵照这些规则就行,基本上UNION就能用于任何数据检索操作。

③ 包含或取消重复的行

UNION从查询结果集中自动去除了重复的行;换句话说,它的行为与一条SELECT语句中使用多个WHERE子句条件一样。

上例中,因为Indiana州有一个Fun4All单位,所以两条SELECT语句都返回该行。使用UNION时,重复的行会被自动取消。

这是UNION的默认设置,如果愿意也可以修改。想返回所有的匹配行,可使用UNION ALL而不是UNION。

【数据库知识扫描】 | SQL复习-中篇 第14课 组合查询

UNION v.s WHERE:何时用谁?这是一个经典的适度问题,一般情况下两个都可以互用,UNION ALL为UNION的一种形式,它完成WHERE子句完成不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),就必须使用UNION ALL,而不是WHERE。

④ 对组合查询结果排序

SELECT输出用ORDER BY解决,在用UNION组合查询时,只能使用一条ORDER BY子句,它必须位于最后一条SELECT语句之后。对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY子句。

【数据库知识扫描】 | SQL复习-中篇 第14课 组合查询

ORDER用来排序返回的所有结果。

其他类型UNION:某些DBMS还支持其他的UNION,比如EXCEPT(有时称为MINUS)可用来检索只在第一个表中存在而在第二个表中不存在的行;而INTERSECT可用来检索两个表中都存在的行。实际上,这些UNION很少使用,因为相同的结果可利用联结得到。

操作多个表:本课中的例子都是使用UNION来组合针对同一表的多个查询。实际上,UNION在需要组合多个表的数据时也很有用,即使是有不匹配列名的表,在这种情况下,可以将UNION与别名组合检索一个结果集

这一课就pass了,说到pass,昨天做了一道编程题,其中pass与continue的换着用,有一点尝试。

总之嘞,学习没有别的技巧,多多练习叭~

去续杯热水,接着下一课!

刻意练习,每日精进! /懒腰~