附上文本方便拷贝
page247-表连接269 --表连接 --建表及测试数据 --T_Customer 客户信息表 --T_OrderType 订单类型 --T_Order 订单信息 CREATE TABLE T_Customer(Fid INT NOT NULL,FName VARCHAR(20 ) NOT NULL, Fage INT, PRIMARY KEY (Fid)) CREATE TABLE T_Order(Fid INT NOT NULL,FNumber VARCHAR(20 ) NOT NULL ,FPrice NUMERIC (10, 2),FCustomerId INT,FTypeId INT,PRIMARY KEY( Fid)) CREATE TABLE T_OrderType(Fid INT NOT NULL,FName VARCHAR(20 ) NOT NULL ,PRIMARY KEY(Fid )) INSERT INTO T_Customer(Fid ,FName, Fage) VALUES(1 ,'Tom', 21) INSERT INTO T_Customer(Fid ,FName, Fage) VALUES(2 ,'MIKE', 24) INSERT INTO T_Customer(Fid ,FName, Fage) VALUES(3 ,'JACK', 30) INSERT INTO T_Customer(Fid ,FName, Fage) VALUES(4 ,'Tom', 25) INSERT INTO T_Customer(Fid ,FName, Fage) VALUES(5 ,'LINDA',NULL) INSERT INTO T_OrderType(Fid ,FName) VALUES(1 ,'MarketCrder') INSERT INTO T_OrderType(Fid ,FName) VALUES(2 ,'LimitOrder') INSERT INTO T_OrderType(Fid ,FName) VALUES(3 ,'Stop Order') INSERT INTO T_OrderType(Fid ,FName) VALUES(4 ,'StopLimit Order') INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId) VALUES(1 ,'K001', 100,1 ,1) INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId) VALUES(2 ,'K002', 200,1 ,1) INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId) VALUES(3 ,'T003', 300,1 ,1) INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId) VALUES(4 ,'N002', 100,2 ,2) INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId) VALUES(5 ,'N003', 500,3 ,4) INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId) VALUES(6 ,'T001', 300,4 ,3) INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId) VALUES(7 ,'T002', 100,NULL,1 ) --JOIN关键字将一个或者多个表按照彼此间的关系连接为一个结果集 --inner join 内连接组合俩张表,并且基于俩张表的关联来联系他们 --使用内连接需要指表中哪些字段成关联关系 ,并且需要指定基于什么 --条件进行连接内连接语法 inner join table_name on condition --大多数系统中,inner join中的 inner是可选的,inner join 是默认的链接方式 SELECT * FROM T_Order SELECT * FROM T_Customer select * FROM T_Order INNER JOIN T_Customer ON T_Customer. Fid = T_Order .Fid --在使用表连接的时候,可以不局限于只连俩张表 ,因为在很情况下需要 --连接许多表 SELECT * FROM T_Order SELECT o. Fid, o .FNumber, o.FPrice ,c. FName, ot .FName from T_Order AS o INNER JOIN T_Customer AS c ON o. FCustomerId = c .Fid INNER JOIN T_OrderType AS ot ON o. FTypeId = ot .Fid --不等值连接 --上面演示的在on后面设置某字段必须等于另一个表中的字段 --除了等值连接,还存在一种不等值连接也就是在连接的条件中可以使用 --小于(<) 、大于(>)、不等于 (<>)等于运算, 而且还可以使用 like --,between and等甚至还可以使用函数 SELECT o. Fid, o .FNumber, o.FPrice ,c. FName from T_Order AS o INNER JOIN T_Customer AS c ON o. FPrice < c .Fage * 5 --在可以在等值连接后面添加 and 来添加限制 AND o. FCustomerId = c .Fid --交叉连接 --与内连接比起来,交叉连接非常简单 ,因为它不存ON子句 --交叉连接会将涉及到的所有记录都包含在结果集中可以采用俩种方式 --来定义交叉连接,分别是隐私连接和显示的连接 SELECT * FROM T_Order --7条数据 SELECT * FROM T_Customer --5条数据 SELECT * FROM T_Customer ,T_Order--35 条数据= 7*5 SELECT * FROM T_Customer CROSS JOIN T_Order --显示连接 ;隐式连接默认忽略CROSS JOIN --自连接 --上面讲的都是在不同数据表之间进行的 ,其实参与连接的表完全可以是 --同一张表, 也就是表与其自身的连接 ,这样的连接就被称为自连接 SELECT t1.*, t2.* FROM T_Customer t1 INNER JOIN T_Customer AS t2 ON t2. Fid = t1 .Fid --外部连接 --左外部连接left outer join 右外部连接 right outer join --全外部连接full outer join --外部连接的语法和内部连接几乎一样 ,主要区别就是对于空值的处理 --外部连接不需要俩个表具有匹配记录 ,这样可以指定某个表中的记录总是放 --到结果集中 --左外部连接以左表为基准去匹配数据 ,将左表的数据放到结果集中 , --无论是否在右表中存在匹配记录 --,能匹配到则显示,不能匹配则显示为 NULL SELECT * FROM T_Order --7条数据 SELECT * FROM T_Customer --5条数据 select o. FNumber, o .FPrice, o.FCustomerId , c. FName, c .Fage FROM T_Order AS o LEFT OUTER JOIN T_Customer AS c ON o. FCustomerId =c .Fid --右外部连接以右表为基准去匹配数据 ,将右表的数据放到结果集中 , --无论是否在左表中存在匹配记录 --,能匹配到则显示,不能匹配则显示为 NULL SELECT * FROM T_Order --7条数据 SELECT * FROM T_Customer --5条数据 select o. FNumber, o .FPrice, o.FCustomerId , c. FName, c .Fage FROM T_Order AS o RIGHT OUTER JOIN T_Customer AS c ON o. FCustomerId =c .Fid --全外部连接 --几乎所有的数据库都支持左外部连接和右外部连接 ,但是全外部连接 --则不是所有数据库都支持的 ,诸如MYsql. --全外部连接是左外部连接和右外部连接的合集 ,因为即使在右表中不存 --在匹配连接条件的数据,左表中的所有记录也将被放到结果集中 ,同样 --左表中不存在匹配记录,右表中的所有记录也将被放到结果集中 select o. FNumber, o .FPrice, o.FCustomerId , c. FName, c .Fage FROM T_Order AS o Full OUTER JOIN T_Customer AS c ON o. FCustomerId =c .Fid