使用内连接查询mysql

时间:2014-09-18 13:56:30

标签: mysql sql

我在这个jos_clientes_contratos表中有54567行;

执行查询时:

SELECT * FROM `jos_clientes_contratos` 
INNER JOIN jos_users 
ON jos_clientes_contratos.cpf_cnpj_cliente = jos_users.username;

它会返回54560行。这意味着结果中没有列出7行。如何列出jos_clientes_contratos中没有此条件{7}的这7行?

3 个答案:

答案 0 :(得分:4)

您可以进行反加入:

SELECT * FROM t1
LEFT JOIN t2 ON (t1.key = t2.key)
WHERE t2.key IS NULL

答案 1 :(得分:2)

SELECT * 
FROM `jos_clientes_contratos` 
LEFT JOIN jos_users 
 ON jos_clientes_contratos.cpf_cnpj_cliente = jos_users.username
WHERE jos_users.username is null

阅读联接:http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

LEFT Join基本上说...返回左表(jos_clientes_contratos)中的所有记录,只返回右边(jos_users)匹配的记录。这是外连接的本质。左,右或全外。它们返回来自一个或两个集合的所有数据,包括不匹配的记录。

由于您对不匹配的jos_clientes_contratos记录感兴趣,因此您希望jos_users_username为空的记录。

答案 2 :(得分:-1)

说'使用左"没关系,但为什么呢? 事实上,当你使用" INNER JOIN" ,Mysql开始搜索WHERE中的所有数据,然后将它们推入" INNER JOIN"结果,只获得WHERE中与INNER匹配的数据。

例:

 John -> Kansas
 Michael -> California
 Mike -> California
 Moshe -> Jerusalem
 Mathew-> no data in he location part


 SELECT name, location
 FROM TAB_NAME
 INNER JOIN TAB_TOWN
 ON tname_town = tlocation
 WHERE tname_name = "M%"

我就是那样你会得到

 Michael -> California
 Mike -> California
 Moshe -> Jerusalem
 but NOT Mathew as Mathew don't have location.

如果您想要所有人,即使他们没有位置,您也必须执行外部联接。

 SELECT name, location
 FROM TAB_NAME
 LEFT OUTER JOIN TAB_TOWN
 ON tname_town = tlocation
 WHERE tname_name = "M%"

这将返回

 Michael -> California
 Mike -> California
 Moshe -> Jerusalem
 Mathew-> undefined

希望这个帮助

啊,看看这里:简单,基本,好! http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins