SQL乐园(18):实现多表查询的“新”方法
软件世界
实现多表查询的“新”方法
上期我们讲了实现多表查询的一种方法,之所以把它称之为“老”方法,是因为这种方法在SQL-2标准(ANSI SQL组制定的标准之一,又称SQL-92)出现以前就已经在使用,现有的数据库管理系统都还支持这种方法。这次我们介绍一种SQL-2标准引进的“新”方法。
引例
实现跟上期例子中同样的功能,我们看看用新方法是怎样做的。
SELECT A.ProductID,A.ProductName,A.Unit Price,
B.OrderID,B.UnitPrice,
jiagecha=B.UnitPrice-A.UnitPrice
FROM Products AS A INNER JOIN "Order Details" AS B
ON A.ProductID=B.ProductID
AND A.ProductID=3
跟“老”方法相比,我们很容易看出“新”方法的特点:
1.没有WHERE子句,而用ON子句代替;
2.多表之间用INNER JOIN显式连接,而不是用“,”并列。
一般来说,要在两个表之间进行查询,它们需要有某些共享信息,比如上例中的ProductID,它相当于两个表之间的联系人。也可以这样理解,Products里的ProductID字段相当于一个外部关键字,它被用来引用“Order Details”表中的ProductID字段。
工作原理简介
在上句中,JOIN表示将两个表联系起来,INNER表示这种连接是内部连接。同样地,我们用AS给数据表取别名,这样可以大大简化代码数量,便于阅读。具体的实现原理和上期介绍的“老”方法的实现原理一样,这里就不再赘述了。
语句的进一步简化
虽然我们用别名已经把语句简化了,不过还可以进一步简化,两个表不同时拥有的字段可以不指明数据表名称,像上例中的Product Name和OrderID字段。简化后的语句如下:
SELECT A.ProductID, ProductName,A.U nitPrice,OrderID,B.UnitPrice,
jiagecha=B.UnitPrice-A.UnitPrice
FROM Products AS A INNER JOIN "Order Details" AS B
ON A.ProductID=B.ProductID
AND A.ProductID=3
预告:下期我们讲交叉连接。
上期问题:在Northwind数据库Products表和“Order Details”表中,找出卖价(在“Order Details”表中的UnitPrice)比定价(在Products表中的UnitPrice)便宜的产品的编号、名称、订单编号、卖价、定价和价格差,并分别用中文命名。
参考答案:
SELECT A.ProductID AS 产品编号,
A.ProductName AS 产品名称,
B.OrderID AS 订单编号,
A.UnitPrice AS 定价,
B.UnitPrice AS 卖价,
B.UnitPrice-A.UnitPrice AS 价格差
FROM Products AS A,
"Order Details" AS B
WHERE A.ProductID=B.ProductID
AND A.UnitPrice> B.UnitPrice
本期问题:用“新”方法解决上期的问题。
本期的幸运读者是湖南的陈汪延,他将获得《全民学电脑──电脑入门》(含1CD)一本。请朋友们在答题的E-mail中注明通讯地址,以便邮寄奖品。