Mysql 在子查询中使用count
我目前正在学习mysql中的子查询,只是想澄清一下我的思路是否正确。下面的代码确实带来了一个结果,但我不确定我是否做得正确。问题是 “使用in声明查找在1997年4月至少提交了一份订单的所有客户的代码和公司名称。” 我检查了插入到表中的值,结果似乎不正确 (旁注,使用EXIST子句是否与IN子句相同,但不是使用其中的WHERE CUSTOMER_代码是WHERE EXISTS 我试过这个Mysql 在子查询中使用count,mysql,Mysql,我目前正在学习mysql中的子查询,只是想澄清一下我的思路是否正确。下面的代码确实带来了一个结果,但我不确定我是否做得正确。问题是 “使用in声明查找在1997年4月至少提交了一份订单的所有客户的代码和公司名称。” 我检查了插入到表中的值,结果似乎不正确 (旁注,使用EXIST子句是否与IN子句相同,但不是使用其中的WHERE CUSTOMER_代码是WHERE EXISTS 我试过这个 SELECT CUSTOMER_CODE, COMPANY_NAME FROM CUSTOMER WHERE
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通常效率更高。您想要表格吗?任何指示您正在查询的数据的内容,以便了解这两个查询为什么不返回相同的结果。编辑:我添加了我正在使用的两个表格!