Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带IN运算符的SQL查询_Mysql_Sql - Fatal编程技术网

Mysql 带IN运算符的SQL查询

Mysql 带IN运算符的SQL查询,mysql,sql,Mysql,Sql,我对SQL非常陌生,我正在尝试学习如何在operator中使用 有两个表(客户、国家),但国家名称信息不包括在客户表中。在customers表中,只有国家ID。因此,我获取国家名称的方法如下: SELECT C_ID,C_NAME,N_NAME FROM customers,nation WHERE N_NAME in(SELECT N_NAME FROM nation WHERE nation.N_NAME = "GERMANY") 问题是该查询返回一个包含所有国家的所有客户的表,并且在N_

我对SQL非常陌生,我正在尝试学习如何在operator中使用

有两个表(客户、国家),但国家名称信息不包括在客户表中。在customers表中,只有国家ID。因此,我获取国家名称的方法如下:

SELECT C_ID,C_NAME,N_NAME
FROM customers,nation
WHERE N_NAME in(SELECT N_NAME FROM nation WHERE nation.N_NAME = "GERMANY")
问题是该查询返回一个包含所有国家的所有客户的表,并且在
N_NAME
列中只显示“德国”,即使有许多不同的国家

所需结果是一个包含来自德国的客户的表格。请尝试下面的查询

  SELECT C_ID,C_NAME,N_NAME
  FROM customers
  WHERE EXISTS
  (
   SELECT 1 FROM nation WHERE nation.N_NAME = "GERMANY" AND nation.Nationid 
   = customers.Nationid
  ) 
尝试下面的查询

  SELECT C_ID,C_NAME,N_NAME
  FROM customers
  WHERE EXISTS
  (
   SELECT 1 FROM nation WHERE nation.N_NAME = "GERMANY" AND nation.Nationid 
   = customers.Nationid
  ) 

您是否尝试加入客户和国家表?请尝试以下查询:

选择C_ID、C_名称、N_名称 来自客户 客户的内部连接国家。C_NAME=国家。N_NAME
其中nation.N_NAME='GERMANY'

您是否尝试加入customers and nation表?请尝试以下查询:

选择C_ID、C_名称、N_名称 来自客户 客户的内部连接国家。C_NAME=国家。N_NAME
WHERE nation.N_NAME='GERMANY'

您的WHERE子句限制了nation表中的项目,但不限制Customers表中的项目。或者,从另一个角度来看,子查询选择了正确的行,但随后向查询(Customers)添加了一个新表,没有任何限制

解决这个问题的正确方法不是使用IN运算符,而是使用JOIN运算符。使用customer表中的nation键将两个表连接在一起。你没有给我们所有的列名,所以我只能猜测国家索引

SELECT c.C_ID, c.C_NAME, n.N_NAME FROM customers c
INNER JOIN nation n ON n.NATION_ID = c.NATION_ID;
这将为您提供客户及其各自国家的名称。要将其限制在德国,请添加WHERE条款:

SELECT c.C_ID, c.C_NAME, n.N_NAME FROM customers c
INNER JOIN nation n ON n.NATION_ID = c.NATION_ID
WHERE n.NATION_NAME='Germany';

where子句限制Nation表中的项目,但不限制Customers表中的项目。或者,从另一个角度来看,子查询选择了正确的行,但随后向查询(Customers)添加了一个新表,没有任何限制

解决这个问题的正确方法不是使用IN运算符,而是使用JOIN运算符。使用customer表中的nation键将两个表连接在一起。你没有给我们所有的列名,所以我只能猜测国家索引

SELECT c.C_ID, c.C_NAME, n.N_NAME FROM customers c
INNER JOIN nation n ON n.NATION_ID = c.NATION_ID;
这将为您提供客户及其各自国家的名称。要将其限制在德国,请添加WHERE条款:

SELECT c.C_ID, c.C_NAME, n.N_NAME FROM customers c
INNER JOIN nation n ON n.NATION_ID = c.NATION_ID
WHERE n.NATION_NAME='Germany';

问题是您正在交叉连接客户和国家表。试一试

SELECT C_ID,C_NAME,N_NAME
FROM customers 
INNER JOIN nation
    on customers.NationID = nation.NationID
WHERE N_NAME in(SELECT N_NAME FROM nation WHERE nation.N_NAME = "GERMANY")

交叉连接将把一个表中的每条记录连接到另一个表中的每条记录。内部联接将仅返回两个表中存在的记录,这些记录基于定义如何联接表的on子句。

问题在于您正在交叉联接客户表和国家表。试一试

SELECT C_ID,C_NAME,N_NAME
FROM customers 
INNER JOIN nation
    on customers.NationID = nation.NationID
WHERE N_NAME in(SELECT N_NAME FROM nation WHERE nation.N_NAME = "GERMANY")

交叉连接将把一个表中的每条记录连接到另一个表中的每条记录。内部联接将仅返回两个表中存在的记录,这些记录基于定义如何联接表的on子句。

能否请您向我解释一下我做错了什么,以及与您提供的查询的区别?什么是
nation.N\u NAME=customers.C\u NAME
比较?国家名称仅存在于表NATIONY中您不能在任何地方检查customer表。C_名称可能是客户名称,而不是国家名称。如果是国家名称,你根本不需要国家表。@Bampfer确切地说,你能向我解释一下我做错了什么,以及与你给我的查询的区别吗?什么是
nation.N\u NAME=customers.C\u NAME
比较?国家名称仅存在于表NATIONY中您不能在任何地方检查customer表。C_名称可能是客户名称,而不是国家名称。如果是国家名称,你根本不需要国家表。@Bampfer完全正确