SQL乐园(17):进行多表查询的“老”方法

软件世界

  我们已经学会了最基本的SELECT语句,不知道朋友们发现没有,我们曾经从一个表中取出一列或多列数据,也曾经对很多数据进行运算,最后得到一个结果,但是这些SELECT语句都有一个共同的特点──只针对一个表进行操作。能不能用一条语句把不同数据表中符合某种关系的数据查询出来呢?这就是我们今天要讲的多表查询。

  引例

  还是以一个例子开头。朋友们看看下面的语句,先不要看后面的讲解,能不能猜出语句的功能?

  SELECT A.ProductID,A.Product Name, B.OrderID,

  A.UnitPrice,B.UnitPrice,

  jiagecha=B.UnitPrice-A.UnitPrice

  FROM Products AS A,

  "Order Details" AS B

  WHERE A.ProductID=B.ProductID

  AND A.ProductID=3

  上句中最能迷惑我们的是A和B的含义。不过根据我们第14期学的“给列取别名”的知识可以猜测,这是给数据表取的别名。不错,在上句中,我们分别给Products和“Order Details”取别名为A和B。而WHRER子句中的条件是两个,用AND关键字连接。

  上期我们还讲了SQL语句的格式化问题,在上句中,我们把要SELECT的不同字段、给不同的表取别名和两个不同的条件语句,分别放在不同的行中,阅读更方便了。

  现在朋友们应该可以“推导”出上句的意思了:在Products和“Order Details”表中取出ProductID等于3的产品编号(ProductID)、产品名称(ProductName)、订单编号(OrderID)、产品定价(UnitPrice)和卖价(UnitPrice)。

  工作原理

  为了更好地说明多表查询的工作原理,我们先给出下面两个样例表Table1和Table2。

  我们一起来看看下面的语句是怎么执行的。

  SELECT * FROM Table1,Table2 WHERE Table1.Column12=Table2.Column21

  当查询引擎处理这个查询语句时,它从语句中的第一个表(Table1)的第一条记录开始查找,首先比较Table1第一条记录的Column12值是否与Table2第一条记录的Column21值相同,结果是A≠B,所以这条记录不进入结果集,这时结果集还是空的。

  接着查看第二条记录,结果A=A,所以把这条记录收入结果集,依此类推,最后得到结果集。

  要注意的是,当取Table1表中的第N条记录时,也取Table2表的第N条记录进行比较。

  上期问题:找出Northwind数据库Products表中价格(UnitPrice)差值的最大值,并命名为MAXDIF。

  参考答案:SELECT MAX(UnitPrice)-MIN(UnitPrice) FROM Products AS MAXDIF

  本期问题:在Northwind数据库Products表和“Order Details”表中,找出卖价(在“Order Details”表中的UnitPrice)比定价(在Products表中的UnitPrice)便宜的产品的编号、名称、订单号、卖价和定价,并分别用中文命名。

  本期的幸运读者是北京的郭丽梅,她将获得《全民学电脑──电脑入门》(含1CD)一本。请朋友们在答题的E-mail中注明通讯地址,以便邮寄奖品。