Mysql 在子查询中使用count

Mysql 在子查询中使用count,mysql,Mysql,我目前正在学习mysql中的子查询,只是想澄清一下我的思路是否正确。下面的代码确实带来了一个结果,但我不确定我是否做得正确。问题是 “使用in声明查找在1997年4月至少提交了一份订单的所有客户的代码和公司名称。” 我检查了插入到表中的值,结果似乎不正确 (旁注,使用EXIST子句是否与IN子句相同,但不是使用其中的WHERE CUSTOMER_代码是WHERE EXISTS 我试过这个 SELECT CUSTOMER_CODE, COMPANY_NAME FROM CUSTOMER WHERE

我目前正在学习mysql中的子查询,只是想澄清一下我的思路是否正确。下面的代码确实带来了一个结果,但我不确定我是否做得正确。问题是

“使用in声明查找在1997年4月至少提交了一份订单的所有客户的代码和公司名称。”

我检查了插入到表中的值,结果似乎不正确

(旁注,使用EXIST子句是否与IN子句相同,但不是使用其中的WHERE CUSTOMER_代码是WHERE EXISTS

我试过这个

SELECT CUSTOMER_CODE, COMPANY_NAME
FROM CUSTOMER
WHERE NOT EXISTS (SELECT CUSTOMER_CODE
     FROM ORDERS
        WHERE ORDER_DATE BETWEEN  '1997-04-01' AND '1997-04-30'
        GROUP BY CUSTOMER_CODE );  
这是我使用的两个塔布

CREATE TABLE CUSTOMER
(
    CUSTOMER_CODE   VARCHAR(5)  NOT NULL,
    COMPANY_NAME    VARCHAR(40) NOT NULL,
    CONTACT_NAME    VARCHAR(30),
    CONTACT_TITLE   VARCHAR(30),
    ADDRESS         VARCHAR(60),
    CITY        VARCHAR(15),
    REGION      VARCHAR(15),
    POSTAL_CODE     VARCHAR(10),
    COUNTRY         VARCHAR(15),
    PHONE       VARCHAR(24),
    FAX         VARCHAR(24),
    CONSTRAINT PK_CUSTOMER PRIMARY KEY (CUSTOMER_CODE)
);
但我收到一套空的
感谢大家抽出时间

您可以使用基于同一子查询的内部联接,而不是IN子句

通常这比In子句的性能更好

  SELECT CUSTOMER_CODE, COMPANY_NAME
  FROM CUSTOMER
  INNER JOIN (
      SELECT DISTINCT CUSTOMER_CODE
      FROM ORDERS
      WHERE ORDER_DATE BETWEEN  '1997-04-01' AND '1997-04-30'
  ) t on t.CUSTOMER_CODE = CUSTOMER.CUSTOMER_CODE 
如果不使用聚合函数,则不应使用GROUPBY for(在最新版本的mysql中,默认情况下这不起作用)
使用DISTINCT如果只需要DISTINCT result而不是IN子句,则可以基于同一子查询使用内部联接

通常这比In子句的性能更好

  SELECT CUSTOMER_CODE, COMPANY_NAME
  FROM CUSTOMER
  INNER JOIN (
      SELECT DISTINCT CUSTOMER_CODE
      FROM ORDERS
      WHERE ORDER_DATE BETWEEN  '1997-04-01' AND '1997-04-30'
  ) t on t.CUSTOMER_CODE = CUSTOMER.CUSTOMER_CODE 
如果不使用聚合函数,则不应使用GROUPBY for(在最新版本的mysql中,默认情况下这不起作用)
如果只需要不同的结果,请使用不同的

您必须使用存在而不是不存在:

SELECT c.CUSTOMER_CODE, c.COMPANY_NAME
FROM CUSTOMER c
WHERE EXISTS (
  SELECT CUSTOMER_CODE FROM ORDERS
  WHERE 
  CUSTOMER_CODE = c.CUSTOMER_CODE
  AND
  ORDER_DATE BETWEEN '1997-04-01' AND '1997-04-30'
);
您还可以通过以下方式检查订单日期:

YEAR(ORDER_DATE) = 1997 AND MONTH(ORDER_DATE) = 4 
您还可以在中使用:

SELECT CUSTOMER_CODE, COMPANY_NAME
FROM CUSTOMER
WHERE CUSTOMER_CODE IN (
  SELECT CUSTOMER_CODE FROM ORDERS
  WHERE YEAR(ORDER_DATE) = 1997 AND MONTH(ORDER_DATE) = 4 
);
如果要查找未提交订单的所有客户的总数:


您必须使用EXISTS而不是NOT EXISTS:

SELECT c.CUSTOMER_CODE, c.COMPANY_NAME
FROM CUSTOMER c
WHERE EXISTS (
  SELECT CUSTOMER_CODE FROM ORDERS
  WHERE 
  CUSTOMER_CODE = c.CUSTOMER_CODE
  AND
  ORDER_DATE BETWEEN '1997-04-01' AND '1997-04-30'
);
您还可以通过以下方式检查订单日期:

YEAR(ORDER_DATE) = 1997 AND MONTH(ORDER_DATE) = 4 
您还可以在中使用:

SELECT CUSTOMER_CODE, COMPANY_NAME
FROM CUSTOMER
WHERE CUSTOMER_CODE IN (
  SELECT CUSTOMER_CODE FROM ORDERS
  WHERE YEAR(ORDER_DATE) = 1997 AND MONTH(ORDER_DATE) = 4 
);
如果要查找未提交订单的所有客户的总数:



你是说查询得到的结果不正确,你的问题中不清楚int吗?更一般地说,当做这样的子查询时,最好使用DISTINCT以避免in中的重复值,
选择DISTINCT CUSTOMER\u code…
我返回结果,但我只是不确定我做的是否正确。前面的DISTINCT也是吗T选择还是子查询?我指的是子查询。没有任何聚合函数的组总是有点可疑。应该考虑连接(而不是子查询)。使用group by和having子句。任务要求我们使用嵌套的SELECTS您是说查询得到的结果不正确,int不清楚您的问题吗?更一般地说,当执行这样的子查询时,最好使用DISTINCT以避免in中的重复值,
SELECT DISTINCT CUSTOMER\u code…
I返回结果我只是不确定如果我做的正确。在第一个选择还是在子查询中是不同的?我指的是子查询。一个没有任何聚合函数的组总是有点可疑。你应该考虑一个连接(不是子查询)。使用group by和having子句。任务要求我们使用嵌套选择他们希望我们使用IN子句和NOT IN子句:/n内部连接相当于IN子句而不是NOT IN。如果您需要NOT IN子句,您可以使用NOT EXISTS。无论如何,注释似乎与您的问题不一致。我的意思是IN和NOT IN是两个独立的ate querys,很抱歉造成混淆。对于相同的结果,我还需要使用NOT EXISTS子句。请参阅我编辑的问题您的评论不清楚。。您的代码是关于基于IN子句的子查询。。(您的问题未提及NOT IN子句)你应该看看IN..NOT IN..EXISTS和NOT EXISTS..之间的区别,正如我对内部联接的等效结果的回答所建议的那样..他们希望我们先使用IN子句,然后使用NOT IN子句:/内部联接相当于IN子句而不是NOT IN..如果你需要NOT IN子句,你可以使用a NOT EXISTS…无论如何,注释似乎与您的问题不一致。我是说In和NOT In是两个独立的查询,很抱歉造成混淆。我还需要使用NOT EXISTS子句来获得相同的结果。请参阅我编辑的问题。您的注释不清楚。您的代码是关于基于In子句的子查询…(您的问题未提及NOT In子句)你应该看看IN..NOT IN..EXISTS和NOT EXISTS..之间的区别,正如我在内部联接的等效结果中的回答所建议的那样….我试过了,但是没有得到与使用INGA发布示例数据相同的结果?因为这两条语句应该返回相同的结果,尽管EXISTS通常是效率更高。您想要表格吗?任何表示您正在查询的数据的内容,以便了解为什么这两个查询不返回相同的结果。编辑:我添加了我使用的两个表格!我尝试过了,但它没有得到与使用INGA发布示例数据相同的结果?因为这两个语句应该返回相同的结果,尽管h EXISTS通常效率更高。您想要表格吗?任何指示您正在查询的数据的内容,以便了解这两个查询为什么不返回相同的结果。编辑:我添加了我正在使用的两个表格!