SQL加入基本问题

时间:2011-01-12 16:38:25

标签: sql join

当我必须从不同的表中选择多个字段时:

  1. 我是否总是需要加入桌子?
  2. 我需要加入哪些表?
  3. 我必须将哪些字段用于join / s?
  4. 连接效果是否反映在select子句中指定的字段或where where条件?
  5. 提前致谢。

4 个答案:

答案 0 :(得分:1)

非常广泛的问题,我建议先做一些阅读,但总结一下: 1.加入可以让生活变得更轻松,查询更快,在坚果壳中尝试 2.具有您正在寻找的数据的那些 3.两个表中的字段,并且通常在至少一个表中是唯一的 4.是的,基本上你是在创建一个带连接的大表。如果有两个具有相同名称的字段,则需要通过表name.columnname

引用它们

答案 1 :(得分:1)

将联接视为一种使用来自多个不同来源的数据创建新表(仅用于运行查询)的方法。如果没有一个具体的例子,我们假设我们有一个包含这两个表的汽车数据库:

CREATE TABLE car (plate_number CHAR(8), 
                  state_code CHAR(2), 
                  make VARCHAR(128), 
                  model VARCHAR(128),);

CREATE TABLE state (state_code CHAR(2),
                    state_name VARCHAR(128));

如果您想要获取数据库中所有Hondas的车牌列​​表,该信息已包含在car表中。您可以简单地SELECT * FROM car WHERE make='Honda';

同样,如果您想要一个以“A”开头的所有州的列表,您可以SELECT * FROM state WHERE state_name LIKE 'A%';

在任何一种情况下,由于您已经拥有了包含所需信息的表格,因此无需加入。

你甚至可能想要一张带有科罗拉多板块的汽车列表,但是如果你已经知道“CO”是科罗拉多州的州代码,你可以SELECT * FROM car WHERE state_code='CO';再一次,你需要的信息都在一个地方,所以不需要加入。

但是假设您想要一份Hondas列表,包括他们注册的州的名称。该信息尚未包含在数据库的表中。您需要通过联接“创建”一个:

car INNER JOIN state ON (car.state_code = state.state_code)

请注意,我完全没有说明我们SELECT的内容。这完全是一个单独的问题。我们还没有应用WHERE子句来限制结果中包含哪些行。这也是一个单独的问题。我们用连接解决的唯一问题是从两个表中获取数据。实际上,我们现在有一个名为car INNER JOIN state的新表,car中的每一行都加入了state中具有相同state_code的每一行。

现在,从这个新的“表格”我们可以应用一些条件并选择一些特定字段:

SELECT plate_number, make, model, state_name
FROM car
INNER JOIN state ON (car.state_code = state.state_code)
WHERE make = 'Honda'

那么,为了更直接地回答你的问题,你是否总是需要加入表格?是的,如果您打算从两者中选择数据。您无法从car表中选择不在car表中的字段。您必须先加入您需要的其他表格。

您需要加入哪些表格?无论哪个表包含您要查询的数据。

您必须使用哪些字段?无论哪个领域都相关。在这种情况下,汽车和州之间的关系是通过两个表中的state_code字段。我可以很容易地写出

car INNER JOIN state ON (state.state_code = car.plate_number)

对于每辆车,这将显示任何其缩写恰好与汽车的车牌号匹配的州。当然,这是荒谬的,可能没有结果,但就您的数据库而言,它是完全有效的。只有你知道state_code是相关的。

加入会影响SELECT ed字段或WHERE条件吗?并不是的。您仍然可以选择所需的任何字段,您仍然可以将结果限制为您想要的任何行。有两点需要注意。

首先,如果两个表中都有相同的列名(例如state_code),则无法在不明确要求的表的情况下选择它。在这种情况下,我可能会写SELECT car.state_code ...

其次,当您使用INNER JOIN(或在许多数据库引擎上只使用JOIN)时,仅返回符合您的加入条件的行。因此,在我寻找与汽车牌照相匹配的州代码的荒谬例子中,可能不会有任何匹配的状态。不会返回任何行。因此,尽管您仍然可以使用WHERE条款,但如果您有INNER JOIN,则您的结果可能已受到该条件的限制。

答案 2 :(得分:0)

  

我是否总是需要加入桌子?

不 - 如果您愿意,可以执行多项选择

  

我需要加入哪些表?

您想要数据的任何内容(并且需要彼此相关)

  

我必须使用哪些字段   加入/秒?

在连接中的任何表中都是相同的(通常是主键)

  

联接效果是否反映在select子句中指定的字段或其中的条件?

不,但是外连接可能会导致问题

答案 3 :(得分:0)

(1)除了表格,您还希望加入mySQL吗?

(2)您想要关联和检索字段(=数据)的那些

(3)最好使用索引字段(唯一标识符)来加入,因为这很快。例如加入 检索用户电子邮件和2表db中的所有用户注释 (使用表:tableA = user_settings,tableB = comments)并且都具有列uid以通过用户来区分用户 select * from user_settings as uset join comments as c on uset.uid = c.uid where uset.email =“test@stackoverflow.com”;

(4)两个......