使用IN运算符的SQL查询

时间:2017-04-17 12:47:10

标签: mysql sql

我是SQL的新手,我正在尝试学习如何使用IN运算符。

有2个表(客户,国家),但国家/地区名称信息不包含在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列中只显示“德国”,即使有很多不同的国籍

所需的结果是包含来自德国的客户的表格。

4 个答案:

答案 0 :(得分:3)

您的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';

答案 1 :(得分:1)

尝试以下查询

  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
  ) 

答案 2 :(得分:0)

你有没有加入客户和国家表?试试这个问题:

选择C_ID,C_NAME,N_NAME   来自客户   关于customers.C_NAME = nation.N_NAME的INNER JOIN国家/地区   WHERE nation.N_NAME ='德国'

答案 3 :(得分:0)

问题是您正在交叉加入客户和国家/地区表。尝试

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")

交叉连接会将一个表中的每条记录连接到另一个表中的每条记录。 INNER JOIN将仅根据定义表连接方式的on子句返回两个表中存在的记录。