Mysql 我应该使用哪个查询?

Mysql 我应该使用哪个查询?,mysql,Mysql,我正在努力正确地学习mysql。当我有一个使用两个表的查询时,我是否需要始终在字段名之前写入表名 这就是我买的那件 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,

我正在努力正确地学习mysql。当我有一个使用两个表的查询时,我是否需要始终在字段名之前写入表名

这就是我买的那件

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 

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


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

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

我认为最好的形式是这样的(记住,形式在很大程度上是主观的):

我发现这样的查询最具可读性,也最容易修改。如果我在一个查询中有多个表,我总是给我的表加上别名,并且我总是在字段选择中使用别名。我编写的这种查询也是一种相当可移植的查询,这意味着它使用了非常基本的SQL功能和语法,因此您可以将它带到另一个DBMS和您可能不需要改变任何东西。

自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

我不会说上面的任何一个。使用
内部联接
而不是whera a.id=b.id。were a.id=b.id隐藏了意图;内部联接使您加入的字段非常明确。它提高了可读性。这两个查询都是correct@baris22如果不想键入长表名,则始终可以为表名添加别名。例如:
s从所有者a中选择a.title、a.forename、a.姓氏、b.name、b.breed,其中a.owner\u id=b.owner\u id按a.username、b.name排序,隐式连接语法没有帮助,因为它使调试复杂查询变得困难,将连接条件与连接的表分离,使重写内部连接变得困难一个外部连接和许多其他原因导致cogh意外交叉连接cogh。最好像瘟疫一样避免它们。@PanayotisMatsinopoulos,此外,如果表
owner
也有一个名为
name
的字段,那么查询2将给出一个错误。因此,qry2的正确性不如qry1。如果无法确定您使用的字段,所有数据库都会抱怨.你是对的。这两个查询都是正确的,但你的答案很好地证明了为什么你应该习惯使用表名。这很有意义,谢谢Marc。我想我已经考虑到了使用SELECT*时的不同行为-大多数数据库都会重命名重复的列名(因此名称类似于名称1),而PostgreSQL没有自动别名。@baris:您已经学会了如何连接表。但是使用了非常古老的方法。@baris22:如果这是一门课,那么按照您的导师希望您的方式来做。但我仍然坚持我的答案,认为“正确”做你想做的事情的方法。记住,养成新习惯很容易,改变既定习惯很难。从一开始就正确地做这件事,你会有一段轻松得多的时间。在教授SQL方面工作了10多年,如果你使用
JOIN
语法,我想你的老师不会抱怨的。或者两种方式都可以选择,以防他有糟糕的一天:)
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