数据库中的各个表中存储着不同的数据,用户往往需要用多个表中的数据来组合、提炼出所需要的信息。如果一个查询需要对多个表进行操作,就称为连接查询。连接查询的结果集或结果表称为表之间的连接。查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系型数据库查询最主要的特征。
实现连接的结果是在向数据库增添新类型的数据方面没有限制,具有很大的灵活性。通常总是通过连接创建一个新表,以包含不同表中的数据。如果新表有合适的域,就可以将它连接到现有的表。
1.简单连接操作
最简单的连接方式是在SELECT语句的FROM子句中用逗号将不同的基表隔开,使用WHERE子句创建的同等连接是使第一个基表中一个或者多个列中的值与第二个基表中相应的一个或者多个列的值相等的连接。这样在查询结果中只显示两个基表中列的值相匹配的行。但是值得注意的是,无论不同表中的列是否具有相同的列名,都相应的通过增加表名来限制列名。
例如,在数据库“销售关系系统”中,从“业务员信息”和“客户信息”连个表中,查询“业务员编号”大于1004,并且在SELECT列表中增加一个列“业务员编号”:
SELECT 业务员信息.业务员编号,业务员信息.业务员编号,客户信息.客户姓名,客户信息.客户地址,客户信息.联系电话
FROM 业务员信息,客户信息
WHERE 业务员信息.业务员编号=客户信息.所属业务员编号 AND 业务员信息.业务员编号>1004
执行后,便是我们条件的结果。
在该查询中,我们也可以使用相关名称,“业务员信息”表用别名A代替,“客户信息”表用B代替,当引用这连个表时,除了FROM子句外,在SELECT语句的任何地方都可以使用A和B,那么我们上述的语句就变成了:
SELECT A.业务员编号,A.业务员编号,B.客户姓名,B.客户地址,B.联系电话
FROM 业务员信息 A ,客户信息 B
WHERE A.业务员编号=B.所属业务员编号 AND A.业务员编号>1004
其执行结果,和前面的完全相同。
这也为后面的多个表的连接的 学习奠定了基础。例如,在数据库“珠宝销售系统”中,基于“珠宝信息”、“珠宝商信息”和“销售明细信息”三个表创建一个查询。要求返回“珠宝信息”表中的列“珠宝名称”,“珠宝商信息”表中的列“珠宝商姓名”和“销售明细信息”表中的列“利润”:
SELECT A.珠宝名称,B.珠宝商姓名,C.利润
FROM 珠宝商信息 AS A ,珠宝商信息 AS B,销售明细信息 AS C
WHERE A.珠宝代号=C.珠宝代号 AND A.珠宝商编号=B.珠宝商编号
执行后,便是所查询结果集。
2.内连接
内连接是最常用的连接查询,一般用INNER JION关键字来指定内连接。但是,INNER不是必需的。如果只用JOIN关键字,还必须定义一个ON子句。内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接的列值。
2.1等值连接
所谓等值连接解释在连接条件中使用等于号(=)运算符比较被连接列的值,其查询结果中列出被连接表中的所有列,包括其中的重复列。换句话说,基表之间的连接通过相等的列值连接起来的查询就是等值连接查询。
等值连接查询可以用两种表示方式来指定连接条件。例如,在数据库“销售关联系统”中,基于“商品信息”和“供应商信息”两个表创建一个查询。限定查询条件为两个表中的“供应商编号”相等时返回,并要求返回的列为“商品信息”表中的“商品名称”和“供应商信息”表中的列“供应商名称”、“联系人姓名”。
SELECT A.商品名称,B.供应商名称,B.联系人姓名,A.单价
FROM 商品信息 A,供应商名称 B
WHERE A.供应商编号=B.供应商编号
在上述语句的WHERE子句中,用"="指定查询为等值连接查询。
还可以在查询语句的FROM子句中使用INNER JOIN关键字连指定查询是等值连接查询。
SELECT A.商品名称,B.供应商名称,B.联系人姓名,A.单价
FROM 商品信息 A INNER JOIN 供应商信息 B
ON A.供应商编号=B.供应商编号
执行后,与上述语句所得结果相同。
也可以对连接查询所得的结果利用ORDER BY子句进行排序。例如,将上述的的等值连接查询的查询按列“单价”的降序进行排列。
SELECT A.商品名称,B.供应商名称,B.联系人姓名,A.单价
FROM 商品信息 A INNER JOIN 供应商信息 B
ON A.供应商编号=B.供应商编号
ORDER BY A.单价 DESC
运行后,唯一与上述结果不同的是,该查询的结果根据“单价”对查询的结果进行了降序排序。
2.2非等值连接
在等值连接查询的连接条件中不适用等号,而使用其他比较符就构成了非等值连接查询。也就是说,非等值连接查询是在连接条件中使用了等于运算符以外的其他比较运算符比较被连接列的列值。在非等值连接查询中,可以使用的比较傲运算符有:>、<、>=、<=、!=,还可以使用BETWEEN...AND之类的关键字。
例如,从数据库“销售管理系统”中,基于“供应商信息”和“入库单信息”两个表创建一个查询。限定查询条件为两个表中的“供应商编号”不相等,并返回列“供应商名称”和“供应商所在城市”。
SELECT 供应商名称,供应商所在城市
FROM 供应商信息 A INNER JOIN 入库单信息 B
ON A.供应商编号!=B.供应商编号
执行上述语句后,其查询结果返回80行,单大部分都是重复的。我们利用下述语句来消除重复行。
SELECT DISTINCT 供应商名称,供应商所在城市
FROM 供应商信息 A INNER JOIN 入库单信息 B
ON A.供应商编号!=B.供应商编号
该查询结果中信息与“供应商信息”表中列“供应商名称”和“供应商所在城市”中的信息完全相同,所以上述查询并没有实际应用价值,这就说明非等值连接查询往往需要同其他连接查询结合使用,尤其是与等值连接查询结合。
2.3自然连接
自然连接是在连接条件中使用等于号(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集中所包含的列,并删除连接表中的重复列。简单的说,在等值连接中去掉重复的属性列,即为自然连接。
自然连接为具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。SQL实现方式判断出具有相同名称的列然后形成匹配。然而,自然连接虽然可以指定查询结果包括的列,但是不能指定被匹配的列。
例如,在数据库“珠宝营销系统”中,基于“顾客信息”和“珠宝商信息”两个表创建了一个自然连接查询。这个连接查询的限定条件是两个表中“消费者所在城市”和“珠宝商所在城市”相同,并按照列“消费者姓名”、“消费者地址”、“珠宝商姓名”和“珠宝商地址”返回查询结果。
SELECT 消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名。珠宝商地址
FROM 顾客信息 A INNER JOIN B
ON A.消费者所在城市=B.珠宝商所在城市
执行上述语句后,对其结果进行分析。尽管利用自然查询能够消除查询结果中重复的行,但是从上述语句的查询结果中能够发现,该查询结果也是由笛卡尔积形成的。
3.外连接
当至少有一个同属于两个表的行符合连接条件时,内连接才返回行。而外连接返回所有的匹配航和一定的不匹配行,这主要取决于所建立的连接的类型。SQL支持的3种类型的外连接:
左外连接:返回所有的匹配行并从关键字JOIN左边的表中返回所有不匹配的行。
右外连接:返回所有