【SQL 必知必会】- 第十四课 组合查询

目录

组合查询

创建组合查询

        使用UNION

        UNION规则

        包含或取消重复的行

        对组合查询结果排序

        其他类型的UNION

        操作多个表


组合查询

        多数SQL 查询只包含从一个或多个表中返回数据的单条SELECT 语句。但是,SQL 也允许执行多个查询(多条SELECT 语句),并将结果作为一个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。

        主要有两种情况需要使用组合查询:

  • 在一个查询中从不同的表返回结构数据;
  • 对一个表执行多个查询,按一个查询返回数据。

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


创建组合查询

        可用UNION 操作符来组合数条SQL 查询。


        使用UNION

        使用UNION 很简单,所要做的只是给出每条SELECT 语句,在各条语句之间放上关键字UNION。

        创建UNION 涉及编写多条SELECT 语句。首先来看单条语句:

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

        第一条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';

        为了便于参考,这里给出使用多条WHERE 子句而不是UNION 的相同查询:

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

        UNION规则

        可以看到,UNION 非常容易使用,但在进行组合时需要注意几条规则。

  • UNION 必须由两条或两条以上的SELECT 语句组成,语句之间用关键字UNION 分隔(因此,如果组合四条SELECT 语句,将要使用三个UNION关键字)。
  • UNION 中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。
  • 列数据类型必须兼容:类型不必完全相同,但必须是DBMS 可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。

        只要查询栏位是一样的即可,前后顺序没有严格的要求。

        如果遵守了这些基本规则或限制,则可以将UNION 用于任何数据检索操作。


        包含或取消重复的行

        使用UNION 时,重复的行会被自动取消。这是UNION 的默认行为,如果愿意也可以改变它。事实上,如果想返回所有的匹配行,可使用UNION ALL 而不是UNION。

        简单来说:

  •    union  :去除重复行
  • union all:保留重复行

        注意此处的重复是什么意思:

        重复的意思是,在你查询的栏位中是否重复,你没有查询的栏位重复与否并不影响结果,影响你结果的只有查询的栏位。

        而使用where的话,重复的意思就是所有的列重复,你没有查询的栏位重复与否会影响结果。


        对组合查询结果排序

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

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'
ORDER BY cust_name, cust_contact;

        这条UNION在最后一条SELECT语句后使用了ORDER BY子句。虽然ORDERBY 子句似乎只是最后一条SELECT 语句的组成部分,但实际上DBMS 将用它来排序所有SELECT 语句返回的所有结果


        其他类型的UNION

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


        操作多个表

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

猜你喜欢

转载自blog.csdn.net/qq_57163366/article/details/130102099