MySql - 您需要在哪里列出从中提取数据的表?

时间:2016-01-27 00:10:04

标签: mysql join

我认为您需要在FROM子句中列出您将使用的表格,如下所示:

SELECT * FROM a, b WHERE a.id = b.id

我正在学习加入并看到以下内容:

SELECT a.account_id, a.cust_id, a.open_date, a.product_cd
FROM account a INNER JOIN employee e
    ON a.open_emp_id = e.emp_id
        INNER JOIN branch b
        ON e.assigned_branch_id = b.branch_id
        WHERE e.start_date < '2007-01-01'
        AND (e.title = 'Teller' OR e.title = 'Head Teller')
        AND b.name = 'Woburn Branch';

FROM子句中仅列出了两个表,如下所示:

FROM account a INNER JOIN employee e

另一个表列在FROM子句之外的另一个join子句中,如下所示:

INNER JOIN branch b

我的第一个想法是抛出了无效的语法错误,因为FROM子句中没有列出分支表,但我错了。

列出要从中提取数据的表时有哪些规则。任何官方文档的链接都会有很大的帮助。

2 个答案:

答案 0 :(得分:1)

INNER JOIN子句可能会根据其ON子句的结果来抑制结果集中的记录。

FROM a INNER JOIN b ON a.colx = b.coly

的含义完全相同
FROM a, b WHERE a.colx = b.coly

并且其中任何一个都将省略未通过ON或WHERE子句的行。

如果你在20世纪90年代的老甲骨文工作,你可以写这个所谓的omega join

FROM a, b WHERE a.colx = b.coly(+)

而不是

FROM a LEFT JOIN b ON a.colx = b.coly

无论哪种方式,您都会从该结果集中获取每一行,即使是那些通过ON或WHERE子句与b中的行不匹配的行。

非聚合MySQL SELECT语句的基本结构如下:

 SELECT a bunch of columns
   FROM a bunch of tables joined together
  WHERE a bunch of filtering predicates
  ORDER BY a bunch of columns
  LIMIT start,count

FROM子句中的内容包括所有JOINed表。 SELECT子句中的内容选择要包含在结果集中的列。绝对没有任何内容表明您不能在FROM子句中提及表,而是从WHERE子句中省略所有列。

答案 1 :(得分:0)

使用关键字“JOIN”加上逗号(“,”)或“显式连接”表示的连接,加上任何ON,都是FROM子句的 part

逗号给出与CROSS JOIN相同的结果。逗号只比使用“JOIN”的连接更弱。在MySQL中,(INNER)JOIN可以在没有ON的情况下编写,在这种情况下,它意味着CROSS JOIN。

另见this (product-independent) answer这些不同的内部联接和&amp;进一步联系OUTER JOINs。

请参阅MySQL documentation重新选择&amp;联接。