8.1 并集
8.1.1 UNION
UNION用于合并多个结果集,并去掉重复的行。
对于订单表,为了避免该表保存过多的数据使得表的性能下降,在项目中,通常使用分区表的方式,将不同时间范围的数据保存到对应分区表中。如以下SOMaster和SOMaster_201705表的数据:
SOMaster表:
SOMaster_201705表:
通过数据可以看到,两张表的数据,前三条的数据是一样的。
SQL语句:
查询结果如下:
可以看到,使用UINON将两个结果集连起来之后,重复的数据被过滤了。
8.1.2 UNION ALL
UNION用于合并多个结果集,但不会去掉重复的行。
如果将上述语句修改如下:
查询结果如下:
可以看到,这个重复的数据没有被过滤,而是全部显示出来了。
8.2 笛卡尔积
笛卡尔积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
8.3 等连接(INNER JOIN)
等连接就是将两张表中,能匹配得到的数据显示出来,匹配不到的数据不显示。
语法:
SELECT
`字段1`,
`字段2`,
`字段3`,
……
`字段4`,
FROM 表1 表1别名
INNER JOIN 表2 表2别名
ON表1别名.连接字段 =表2别名.连接字段
示例:
客户信息表数据:
订单信息表数据:
从两张表的数据可以看出,订单表中没有客户编号为2的订单信息,对于客户编号为6的订单信息,该客户编号在客户表中不存在。
SQL语句:
查询数据:
由此可见,INNER JOIN是将连接条件的在两张表都有的数据显示出了,如果存在任意一条数据在其中一张表中不存在,则不会在查询结果中显示出来。
8.4 左连接(LEFT JOIN)
左连接,是指将左边的表作为主表,在用两张表的连接字段相关联,之后,只要是按照左边的表为标准能够连接到的右边表的数据就显示出来,否则不显示出来。
简言之就是,左连接会将左边表的数据都显示出来,但右边表的数据,只有能够关联上的数据才显示,关联不上的数据不会显示。
语法:
SELECT
`字段1`,
`字段2`,
`字段3`,
……
`字段4`,
FROM 表1 表1别名
LEFT JOIN 表2 表2别名
ON表1别名.连接字段 =表2别名.连接字段
示例:
同样是上面的客户信息表和订单信息表的数据,按照下面的SQL语句查询后,结果则有所不同。
结果如下:
可以看到,订单表中客户编号为6的订单数据也显示出来了,只是对应的客户名称为NULL,那是因为在客户信息表中,没有编号为6的客户,所有客户名称为NULL。
8.5 右连接(RIGHT JOIN)
右连接与左连接相反,是指将右边的表作为主表,在用两张表的连接字段相关联,之后,只要是按照右边的表为标准能够连接到的左边表的数据就显示出来,否则不显示出来。
但这个连接方式不常用。
语法:
SELECT
`字段1`,
`字段2`,
`字段3`,
……
`字段4`,
FROM 表1 表1别名
RIGHT JOIN 表2 表2别名
ON表1别名.连接字段 =表2别名.连接字段
示例:
仍然还是上面的客户信息表和订单信息表的数据,按照下面的SQL语句查询后,结果则有所不同。
查询结果如下:
可以看到,虽然客户编号为2的客户在订单表中没有订单信息,但还是现实出来了,只是没有订单的相关数据。