我应该使用哪个查询?

时间:2011-10-27 14:28:51

标签: mysql

我正在尝试正确学习mysql。当我有一个使用2个表的查询时,我是否需要始终在字段名前写表名?

这是我得到的

SELECT 
owner.title, owner.forename, owner.surname,
pet.name, pet.breed
FROM
owner,pet
WHERE
owner.owner_id = pet.owner_id
ORDER BY
owner.surname ASC, pet.name ASC

如果我这样做也没关系吗?

SELECT 
title, forename, surname,
name, breed
FROM
owner,pet
WHERE
owner.owner_id = pet.owner_id
ORDER BY
surname ASC, name ASC 

4 个答案:

答案 0 :(得分:4)

在我看来,最好的形式是这样的(记住,形式主要是主观的):

SELECT o.title, o.forename, o.surname, p.name, p.breed
FROM pet p 
INNER JOIN owner o ON o.owner_id = p.owner_id
ORDER BY o.surname ASC, p.name ASC

我发现这样的查询最易读,最容易修改。如果我在查询中有多个表,我总是别名我的表,我总是在字段选择中使用该别名。我写的那种查询也是一个相当可移植的查询,这意味着它使用了非常基本的SQL特性和语法,所以你可以把它带到另一个DBMS,你可能不需要改变任何东西。

答案 1 :(得分:3)

自1992年以来:

FROM
  owner,pet
WHERE
  owner.owner_id = pet.owner_id

(按SQL-92标准)写成:

FROM
    owner
  JOIN                         --- or the equivalent: INNER JOIN
    pet
      ON owner.owner_id = pet.owner_id

为了回答你的问题,我宁愿选择第一种方法(如上所述进行修改),主要是为了提高可读性。其他人可能必须阅读您的代码(或者您,几天或几个月后),并知道每列所属的表格是有用的:

SELECT 
  owner.title, owner.forename, owner.surname,
  pet.name, pet.breed
FROM
    owner
  JOIN
    pet
      ON owner.owner_id = pet.owner_id
ORDER BY
  owner.surname ASC, pet.name ASC

另一个原因是要抓住你(或某人)以后在表上添加(或重命名)列的情况,并且你有一个“名称冲突”,这将使你的查询给出错误并停止工作或给出不同于预期的结果。


您还可以使用别名,如下所示:

SELECT 
  o.title, o.forename, o.surname,
  p.name, p.breed
FROM
    owner AS o
  JOIN
    pet AS p
      ON o.owner_id = p.owner_id
ORDER BY
  o.surname ASC, p.name ASC

答案 2 :(得分:2)

您不必使用表名。但是,如果您访问多个表,则可能会发生列冲突 - 在这种情况下,指定您所指的表是有帮助的。

如果不确定您指的是哪个列,某些数据库系统(特别是PostgreSQL)会抱怨。

答案 3 :(得分:0)

如果两个表都包含相同的列名,那么您需要使用列名指定表名以防止出现模糊情况,否则就不需要了。