的匹配行并从关键字JOIN右边的表中返回所有不匹配的行。
完全连接:返回所有的匹配行和不匹配的行。
3.1左外连接
左外连接的查询结果集中包括指定左表中的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有找到相匹配的行,则结果集中的右表的相对应位置为NULL。
在左外连接查询的SELECT语句中,用LEFT OUTER JOIN关键字对两个基表进行连接。
例如,在数据库“珠宝营销系统”中,以在同一个城市的消费者和珠宝商为条件,对“消费者信息”和“珠宝商信息”表进行左外连接查询。
SELECT 消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名,珠宝商地址
FROM 顾客信息 A LEFT OUTER JOIN 珠宝商信息 B
ON A.消费者所在城市=B.珠宝商所在城市
执行后,查询其结果中包含了三行含有NULL值得数据,尽管这三行没有匹配列,但在查询结果中仍然被包括进去,原因就是这三行中列“消费者姓名”中的信息包含在左表中。这就是说,在进行左外连接查询时,无论左表中的行是否能够在右表中找到匹配的行,查询结果中都将被显示在该行,与其他行唯一不同的是,右表中与该行对应的位置用NULL值代替。
3.2右外连接
右外连接就是左外连接的反向连接,只不过在插叙结果集中包括的是指定右表的所有行。如果右表的某行在左表中没有找到相匹配的行,则结果集中的左表的相对应位置为NULL。
在右外连接查询的SELECET语句中,用RIGHT OUTER JOIN关键字对两个基表进行连接。
例如,在数据库“珠宝商营销系统”中,以在同一个城市的消费者和珠宝商为条件,对“消费者信息”和“珠宝商信息”表进行右外连接。
SELECT 消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名,珠宝商地址
FROM 顾客信息 A RIGHT OUTER JOIN 珠宝商信息 B
ON A.消费者所在城市=B.珠宝商所在城市
执行后,查询其结果中包含了两行含有NULL值得数据,尽管这两行没有匹配列,但在查询结果中仍然被包括进去,原因就是这两行中列“珠宝商姓名”中的信息包含在右表中。这就是说,在进行右外连接查询时,无论右表中的行是否能够在左表中找到匹配的行,查询结果中都将被显示在该行,与其他行唯一不同的是,左表中与该行对应的位置用NULL值代替。
3.3完全连接
完全连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表与之相对应列值为NULL。如果表之间右匹配行,则整个结果集包含基表的数据值。
在完全连接查询的SELECT语句中,用FULL OUTER JOIN关键字对两个基表进行连接。
例如,在数据库“珠宝商营销系统”中,以在同一个城市的消费者和珠宝商为条件,对“消费者信息”和“珠宝商信息”表进行完全连接。
SELECT 消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名,珠宝商地址
FROM 顾客信息 A FULL OUTER JOIN 珠宝商信息 B
ON A.消费者所在城市=B.珠宝商所在城市
执行后,查询其结果中包含了六行含有NULL值得数据,尽管这六行没有匹配列,但在查询结果中仍然被包括进去,原因就是这两行中列“珠宝商姓名”中的信息包含在右表中。这就是说,在进行完全连接查询时,无论左表中还是右表是否能够找到匹配的行,它都在查询结果中显示该行,而只是在找不到匹配的位置上用NULL值代替。
4.联合查询
如果有多个不同的查询结果,但又不希望将它们连接在一起,组成数据。在这种情况下,可以使用UNION子句。使用UNION子句的查询称为联合查询,它可以将两个或者更多查询的结果组合为一个单个结果集,该结果集包含联合查询中所有查询结果集中的全部行数据。联合查询不同于对两个表中的列进行连接查询,前者是组合两个表中的行,后者是匹配两个表中的列数据。联合查询的语法格式为:
SELECT
FROM
[WHERE ]
{UNION [ALL]
SELECT
FROM
[WHERE ]}
[ORDER BY ]
在进行联合查询时,UNION子句会自动删除重复的行,查询结果的列标题为第一个查询语句的列标题。因此,必须在第一个查询语句中定义列标题。
例如,从数据库”珠宝营销系统“的"顾客信息"表中,查询”消费者所在城市“为”北京市“的消费者的姓名、家庭住址和联系电话,并为其增加类型列为”类别“,列的内容为”消费者“;从”珠宝商信息“表中,查询”珠宝商所在城市“同样是”北京市“的珠宝商的相关信息,并增加一个列,列的内容为“珠宝商”;最后,将两个查询的结果联合在一起。
SELECT 消费者姓名 AS 姓名,消费者地址 AS 家庭住址,联系电话,'消费者' AS 类别
FROM 顾客信息
WHERE 消费者所在城市='北京市'
UNION
SELECT 珠宝商姓名,珠宝商地址,电话,'珠宝商'
FROM 珠宝商信息
WHERE 珠宝商所在城市='北京市'
在使用UNION的SELECT语句中,如果要对联合查询结果进行排序,则必须使用第一个查询语句中的列名、列标题或者列序号。并且排序子句ORDER BY中最好用数字来指定排序次序,如果不用数字,则联合查询的子查询中的列名就需要相同,也可以使用别名来统一列名。
另外,在对联合查询的结果进行排序的结果进行排序时,必须把ORDER BY子句放在SELECT子句的后面。
例如,从数据库“销售管理系统”的“客户信息”表中,查询“客户编号”不大于1005的客户的姓名、家庭住址和联系电话,并为其增加类型列“职能”,列的内容为“客户”;从“业务员信息”表中,查询“业务员编号”不大于1005的业务员的姓名、家庭住址和联系电话,并增加一个列,列的内容为“业务员”;最后,将两个查询结果联合在一起,并按类型“职能”的升序排列。
SELECT 客户姓名 AS 姓名,客户地址 AS 家庭住址,联系电话,'客户' AS 职能
FROM 客户信息
WHERE 客户编号<= 1005
UNION
SELECT 业务员姓名,家庭住址,电话,'业务员'
FROM 业务员信息
WHERE 业务员编号<=1005
ORDER BY 职能
UNION ALL是另外一种对表进行联合的方法。它与UNION唯一不同的区别是它不删除重复的行,也不对行进行自动排序。在对表进行联合查询时,如果以希望在查询结果中显示重复的行,就可以使用UNION ALL。在此,不再一一举例。
5.交叉连接和自连接
在连接查询中还有两个比较特殊的连接查询方式:交叉连接和自连接。在交叉连接的查询结果中,两个表中每两个可能成对的行占一行。自连接就是一个表与自身进行连接查询。
5.1交叉连接
两个表进行交叉连接将生成来自这两个表的各行的所有可能组合。交叉连接在不带WHERE子句时,返回的是被连接的两个表所有行的笛卡尔积,即返回到结果集中的行数等于第一个表中符合查询条件的行数乘以第二个表中符合查询条件的行数。当交叉连接带有WHERE子句时,返回的是连接两个表的所有行的笛卡尔积减去WHERE子句所现在而省略的所有行数。
交叉连接与前面介绍的基本连接操作非常相似。唯一不同的是,在FROM子句中,多个表名之间不是用逗号,而是用CROSS JOIN关键字隔开;并且在进行交叉连接时,不能像内连接和外连接一样使用ON 关键字来限定连接条件,但是可以将连接条件限定在WHERE子句中。
例如,在数据库“销售管理系统”中