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中注明通讯地址,以便邮寄奖品。