SQL(for)中的JOIN是什么?

时间:2010-03-26 16:09:54

标签: sql mysql

我已经使用MySQL 2年了,但我仍然不知道你对JOIN语句的实际操作。我真的没有遇到任何我无法解决我已经知道的语句和语法问题的情况(SELECTINSERTUPDATE,排序,...)

  • JOIN在MySQL中做了什么?
  • (Where)我需要它吗?
  • 我一般应该避免吗?

7 个答案:

答案 0 :(得分:7)

  

每当使用SQL JOIN子句时   我们必须选择2个或更多的数据   表。

     

能够使用SQL JOIN子句   从2个(或更多)表中提取数据,   我们需要某种关系   这些表中的列。

来源(请查看此示例):http://www.sql-tutorial.net/SQL-JOIN.asp

答案 1 :(得分:7)

如果你曾经一次查询多个表格,你可能在不知情的情况下使用它。

如果您执行类似

的查询
SELECT comment_text
FROM users, comments
WHERE users.user_id = 'sabwufer'
AND comments.user_id = users.user_id  <-- this line is your JOIN condition

然后,即使您没有使用JOIN关键字,您也可以进行连接(INNER JOIN)。

(旁白:上面的查询相当于

SELECT comment_text
FROM users
JOIN comments ON (comments.user_id = users.user_id)
WHERE users.user_id = 'sabwufer'

如果你所做的都是INNER JOINS,那么你不需要使用JOIN关键字,虽然它可以让你做得更清楚。

但是,还有其他有用的连接类型(例如,参见教程XpiritO链接),值得理解。

答案 2 :(得分:3)

如果您不必经常使用JOINS,那么您的数据库设计很可能不是很好,并且有很多冗余。

JOINS允许您(如XpiritO所说)从2个或更多表中选择数据。当你有一个带有外键的表(对另一个表中的一行数据的引用)时,这一点非常重要。

例如,假设您有一个包含以下数据的Customer表:

firstName, lastName, customerId, address

'customerId'是每个客户的关键。然后说你有一个产品表:

category, name, price, productId

productId是产品的关键。

然后你可以有一个购买表:

customerId, productId

您跟踪客户购买的产品的位置。使用JOIN语句,您可以查询数据库,了解客户购买的产品,或者客户购买了哪些产品。此外,您可以在购买表上存储有关购买的更多信息,例如购买时间,使用的折扣等。

示例查询将是:

SELECT * FROM Customer INNER JOIN Purchases on Customer.customerID=Purchases.customerID

答案 3 :(得分:3)

你不应该避免它 - 你应该接受它。如果您还没有使用过JOIN,那么您的数据库可能不是normalizing

这是一个简单的例子。假设你有这张桌子

play_id  play_title                 play_category
1        All's Well That Ends Well  Comedy
2        As You Like It             Comedy
3        Antony and Cleopatra       Tragedy
4        Cymbeline                  Romance
5        Henry IV, Part 1           History
6        Henry IV, Part 2           History

您可以在没有加入的情况下全天查询。但是,数据没有“标准化”,这意味着您有冗余。注意“喜剧”和“历史”是如何重复的。存储这些标签的更合适的方法是在专用表中:

play_category_id  play_category_name
1                 Comedy
2                 Tragedy
3                 History
4                 Romance

现在你可以“规范化”游戏桌了,

play_id  play_title                 play_category
1        All's Well That Ends Well  1
2        As You Like It             1
3        Antony and Cleopatra       2
4        Cymbeline                  4
5        Henry IV, Part 1           3
6        Henry IV, Part 2           3

这不仅效率更高,而且更不容易出错。

问题是,如何回到显示有意义标签的视图。 (因为我们用任意键替换了一个有意义的字段,play_category_id。)

这是JOIN的用武之地。

SELECT play_id, play_title, play_category_name
  FROM play
  LEFT OUTER JOIN play_category ON play_category = play_category_id

JOIN的机制和艺术还有很多,但基本原因通常归结为这种情况。

希望这有帮助。

答案 4 :(得分:1)

使用特定示例扩展@ XpiritO的答案:

想象一下,你有一张顾客表:

Customer_ID
FirstName
LastName
...

和订单表..

Order_ID
Customer_ID
(description)

根据订单ID,您希望获得客户的姓名。所以:

select top 1 tbl_customer.* from tbl_customers inner join tbl_orders on tbl_orders.customer_id = tbl_customers.id and tbl_orders.id={the order id you started with}.

您将获得一个看起来像

的结果集
customer_id first_name last_name order_id description

答案 5 :(得分:0)

这是一个例子。

假设您有一个包含作者的表格和一个包含书籍的表格。

你可以这样做:

SELECT * FROM authors LEFT JOIN books ON authors.id = books.author_id

这将产生与

不同的结果
SELECT * FROM authors, books WHERE authors.id = books.author_id

在JOIN的情况下,即使是那些没有任何书籍的作者,你也会进入你的结果集。在第二个陈述的情况下,你只会得到那些在书籍表中有书籍的作者。它可能看起来不是什么大问题,但请考虑与客户和付款的表格。

如果您加入 - 您将能够看到所有客户,即使是那些没有任何付款的客户,如果您执行第二种选择 - 您也不会看到任何没有付款的客户。您可以通过运行

找到它们
SELECT * FROM authors, books WHERE authors.id <> books.author_id

SELECT * FROM authors WHERE authors.id NOT IN (SELECT DISTINCT(books.author_id) FROM books)

这些是获取数据的有效方法 - 但它们提供的结果与JOIN不同,如果你理解 - 那么不使用join我猜也好 - 但你限制自己 - 加上这些方法在大多数用例中都比较慢。

答案 6 :(得分:0)

正如其他人已经说过的那样,当您需要依赖于另一个表中信息的信息时,INNER JOIN会频繁出现。还有其他有效点,例如规范化。如果您在询问是否应该对JOIN语法进行任何操作,请尝试进行OUTER JOIN。