我正在尝试正确学习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
答案 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)
如果两个表都包含相同的列名,那么您需要使用列名指定表名以防止出现模糊情况,否则就不需要了。