sql 中使用 JOIN 关键字来使用表连接。表连接有多种不同的类型,被主流数据库系统支持的有交叉连接(CROSS JOIN) 、内连接(INNER JOIN) 、外连接(OUTTER JOIN) ,另外在有的数据库系统中还支持联合连接(UNION JOIN) 。
内连接(INNER JOIN)
内连接组合两张表,并且基于两张表中的关联关系来连接它们。使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接。内连接的语法如下:
INNER JOIN table_nameON condition
其中 table_name 为被关联的表名,condition 则为进行连接时的条件。
下面的 sql 语句检索所有的客户姓名为 MIKE 的客户的订单号以及订单价格:
SELECTFNumber,FPrice
FROMT_OrderINNER JOINT_Customer
ONFCustomerId= T_Customer.FId
WHERET_Customer.FName='TOM'
执行完毕我们就能在输出结果中看到下面的执行结果:
FNumber FPrice
K001 100.00
K002 200.00
T003 300.00
T001 300.00
在这个 sql 语句中,首先列出了组成结果集所需要的列名,而后则是在 FROM 关键字后指定需要的表,在 INNER JOIN 关键字后指明要被连接的表,而在 ON 关键字后则指定了进行连接时所使用的条件。由于T_Customer 和 T_Order 表中都有名称为 FId 的列,所以在 ON 关键字后的条件中使用 FId 字段的时候必须显示的指明这里使用 FId 字段属于哪个表。比如下面的 sql 语句在执行的时候则会报出“列名 FId 不明确”的错误信息:
FCustomerId= FId
同样如果在 SELECT 语句后的字段列表中也不能存在有歧义的字段,比如下面的 sql 语句执行会出错:
FId,FNumber,0); font-style:normal; background-color:inherit">必须为 FId 字段显式的指定所属的表,修正后的 sql 语句如下:
T_Order.FId,0); font-style:normal; background-color:inherit">
为了避免列名歧义并且提高可读性,这里建议使用表连接的时候要显式列所属的表,如下:
T_Order.FCustomerId= T_Customer.FId
指定列所属的表后,我们就可以很轻松的引用同名的字段了,比如下面的 sql 语句检索所有的订单以及它们对应的客户的相关信息:
T_Customer.FId,T_Customer.FName,T_Customer.FAge
T_Order.FCustomerId= T_Customer.FId
在大多数数据库系统中,INNER JOIN 中的 INNER 是可选的,INNER JOIN 是默认的连接方式。也就是下面的 sql 语句同样可以完成和检索所有的订单以及它们对应的客户的相关信息的功能:
JOIN为了明确指定字段所属的表,上面的 sql 语句中多次出现了 T_Order、T_Customer,当字段比较多的时候这样的 sql 语句看起来非常繁杂,为此可以使用表别名来简化 sql 语句的编写,比如下面的 sql 语句就与上面的 sql 语句是等价的:
o.FId,o.FNumber,o.FPrice,0); font-style:normal; background-color:inherit"> c.FId,c.FName,c .FAge
FROMT_Order oJOINT_Customer c
ONo.FCustomerId= c.FId
在使用表连接的时候可以不局限于只连接两张表,因为有很多情况下需要联系许多表。
不等值连接
等值连接,也就是在这种连接的ON子句的条件包含一个等号运算。等值连接是最常用的连接,因为它指定的连接条件是一个表中的一个字段必须等于另一个表中的一个字段。
处理等值连接, 还存在另外一种不等值连接, 也就是在连接的条件中可以使用小于 (<) 、大于(>) 、不等于(<>)等运算符,而且还可以使用LIKE、BETWEEN AND等运算符,甚至还可以使用函数。
例如,如果需要检索价格小于每个客户的年龄的五倍值的订单列表,那么就可以使用不等值连接,实现的sql语句如下所示:
SELECTT_Order.FNumber,
T_Customer.FName,T_Customer.FAge
FROMT_Order
INNER JOINT_Customer
T_Order.FPrice< T_Customer.FAge*5
执行完毕我们就能在输出结果中看到下面的执行结果:
FNumber FPrice FName FAge
K001 100.00 TOM 21
K001 100.00 MIKE 24
K001 100.00 JACK 30
K001 100.00 TOM 25
N002 100.00 TOM 21
N002 100.00 MIKE 24
N002 100.00 JACK 30
N002 100.00 TOM 25
T002 100.00 TOM 21
T002 100.00 MIKE 24
T002 100.00 JACK 30
T002 100.00 TOM 25
不等值连接产生了大量的查询结果,因为它是对被连接的两张表做了笛卡尔运算,所以如果只想查看与客户对应的订单,那么就要在不等值连接后添加等值连接匹配条件。实现的sql语句如下: SELECTT_Order.FNumber,T_Customer.FAge FROMT_Order INNER JOINT_Customer ONT_Order.FPrice< T_Customer.FAge*5 andT_Order.FCustomerId=T_Customer.FId这里添加了“andT_Order.FCustomerId=T_Customer.FId”这个条件来限制匹配规则。执行完毕我们就能在输出结果中看到下面的执行结果: FNumber FPrice FName FAge K001 100.00 TOM 21 N002 100.00 MIKE 24交叉连接与内连接比起来,交叉连接非常简单,因为它不存在ON子句。交叉连接会将涉及到的所有表中的所有记录都包含在结果集中。可以采用两种方式来定义交叉连接,分别是隐式的和显式的。隐式的连接只要在SELECT语句的FROM语句后将要进行交叉连接的表名列出即可,这种方式可以被几乎任意数据库系统支持。比如下面的sql语句为将T_Customer表和T_Order做交叉连接:
SELECT
T_Customer.FId,T_Customer.FAge,
内连接组合两张表,并且基于两张表中的关联关系来连接它们。使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接。内连接的语法如下:
INNER JOIN table_nameON condition
其中 table_name 为被关联的表名,condition 则为进行连接时的条件。
下面的 sql 语句检索所有的客户姓名为 MIKE 的客户的订单号以及订单价格:
SELECTFNumber,FPrice
FROMT_OrderINNER JOINT_Customer
ONFCustomerId= T_Customer.FId
WHERET_Customer.FName='TOM'
执行完毕我们就能在输出结果中看到下面的执行结果:
FNumber FPrice
K001 100.00
K002 200.00
T003 300.00
T001 300.00
在这个 sql 语句中,首先列出了组成结果集所需要的列名,而后则是在 FROM 关键字后指定需要的表,在 INNER JOIN 关键字后指明要被连接的表,而在 ON 关键字后则指定了进行连接时所使用的条件。由于T_Customer 和 T_Order 表中都有名称为 FId 的列,所以在 ON 关键字后的条件中使用 FId 字段的时候必须显示的指明这里使用 FId 字段属于哪个表。比如下面的 sql 语句在执行的时候则会报出“列名 FId 不明确”的错误信息:
FCustomerId= FId
同样如果在 SELECT 语句后的字段列表中也不能存在有歧义的字段,比如下面的 sql 语句执行会出错:
FId,FNumber,0); font-style:normal; background-color:inherit">必须为 FId 字段显式的指定所属的表,修正后的 sql 语句如下:
T_Order.FId,0); font-style:normal; background-color:inherit">
为了避免列名歧义并且提高可读性,这里建议使用表连接的时候要显式列所属的表,如下:
T_Order.FCustomerId= T_Customer.FId
指定列所属的表后,我们就可以很轻松的引用同名的字段了,比如下面的 sql 语句检索所有的订单以及它们对应的客户的相关信息:
T_Customer.FId,T_Customer.FName,T_Customer.FAge
T_Order.FCustomerId= T_Customer.FId
在大多数数据库系统中,INNER JOIN 中的 INNER 是可选的,INNER JOIN 是默认的连接方式。也就是下面的 sql 语句同样可以完成和检索所有的订单以及它们对应的客户的相关信息的功能:
JOIN为了明确指定字段所属的表,上面的 sql 语句中多次出现了 T_Order、T_Customer,当字段比较多的时候这样的 sql 语句看起来非常繁杂,为此可以使用表别名来简化 sql 语句的编写,比如下面的 sql 语句就与上面的 sql 语句是等价的:
o.FId,o.FNumber,o.FPrice,0); font-style:normal; background-color:inherit"> c.FId,c.FName,c .FAge
FROMT_Order oJOINT_Customer c
ONo.FCustomerId= c.FId
在使用表连接的时候可以不局限于只连接两张表,因为有很多情况下需要联系许多表。
不等值连接
等值连接,也就是在这种连接的ON子句的条件包含一个等号运算。等值连接是最常用的连接,因为它指定的连接条件是一个表中的一个字段必须等于另一个表中的一个字段。
处理等值连接, 还存在另外一种不等值连接, 也就是在连接的条件中可以使用小于 (<) 、大于(>) 、不等于(<>)等运算符,而且还可以使用LIKE、BETWEEN AND等运算符,甚至还可以使用函数。
例如,如果需要检索价格小于每个客户的年龄的五倍值的订单列表,那么就可以使用不等值连接,实现的sql语句如下所示:
SELECTT_Order.FNumber,
T_Customer.FName,T_Customer.FAge
FROMT_Order
INNER JOINT_Customer
T_Order.FPrice< T_Customer.FAge*5
执行完毕我们就能在输出结果中看到下面的执行结果:
FNumber FPrice FName FAge
K001 100.00 TOM 21
K001 100.00 MIKE 24
K001 100.00 JACK 30
K001 100.00 TOM 25
N002 100.00 TOM 21
N002 100.00 MIKE 24
N002 100.00 JACK 30
N002 100.00 TOM 25
T002 100.00 TOM 21
T002 100.00 MIKE 24
T002 100.00 JACK 30
T002 100.00 TOM 25
不等值连接产生了大量的查询结果,因为它是对被连接的两张表做了笛卡尔运算,所以如果只想查看与客户对应的订单,那么就要在不等值连接后添加等值连接匹配条件。实现的sql语句如下: SELECTT_Order.FNumber,T_Customer.FAge FROMT_Order INNER JOINT_Customer ONT_Order.FPrice< T_Customer.FAge*5 andT_Order.FCustomerId=T_Customer.FId这里添加了“andT_Order.FCustomerId=T_Customer.FId”这个条件来限制匹配规则。执行完毕我们就能在输出结果中看到下面的执行结果: FNumber FPrice FName FAge K001 100.00 TOM 21 N002 100.00 MIKE 24交叉连接与内连接比起来,交叉连接非常简单,因为它不存在ON子句。交叉连接会将涉及到的所有表中的所有记录都包含在结果集中。可以采用两种方式来定义交叉连接,分别是隐式的和显式的。隐式的连接只要在SELECT语句的FROM语句后将要进行交叉连接的表名列出即可,这种方式可以被几乎任意数据库系统支持。比如下面的sql语句为将T_Customer表和T_Order做交叉连接:
T_Order.FId,T_Order.FPrice
FROM
T_Customer,T_Order
执行完毕我们就能在输出结果中看到下面的执行结果: FId FName FAge FId FNumber FPrice 1 TOM 21 1 K001 100.00 1 TOM 21 2 K002 200.00 1 TOM 21 3 T003 300.00 1 TOM 21 4 N002 100.00 1 TOM 21 5 N003 500.00在交叉连接中同样可以对表使用别名,比如上面的sql语句来代替:
SELECT
c.FId,c.FAge,0); font-style:normal; background-color:inherit"> o.FId,o.FPrice
FROM
T_Customer c,T_Order o