SQL初学者练习题

时间:2018-07-10 17:02:20

标签: mysql sql

给出两个表orders (order_id, date, $, customer_id)customers (ID, name)

这是我的方法,但我不确定它是否有效,我想知道是否有更快/更好的方法来解决这些问题:

1)找出在customers 2018年7月9日至少赚了一个order的{​​{1}}的人数

date

2)找出在2018年7月9日没有成为Select count (distinct customer_id) From ( Select customer_id from orders a Left join customer b On a.customer_id = b.ID Group by customer_id,date Having date = 7/9/2018 ) a 的{​​{1}}的人数

customers

3)找到销售额最高介于7/1和7/30之间的order

Select count (customer_id) from customer where customer_id not in
(
Select customer_id from orders a 
Left join customer b
On a.customer_id = b.ID 
Group by customer_id,date
Having date = 7/9/2018
) 

谢谢

2 个答案:

答案 0 :(得分:3)

对于问题1,有效的解决方案可能如下所示:

SELECT COUNT(DISTINCT customer_id) x
  FROM orders 
 WHERE date = '2018-09-07';  -- or is that '2018-07-09' ??

对于问题2,有效的解决方案可能如下所示:

SELECT COUNT(*) x
  FROM customer c
  LEFT
  JOIN orders o
    ON o.customer_id = x.customer_id
   AND o.date = '2018-07-09'
 WHERE o.crder_id IS NULL;

假设没有联系,问题3的有效解决方案可能如下所示:

SELECT date 
     , COUNT(*) sales 
  FROM orders 
 WHERE date BETWEEN '2018-07-01' AND '2018-07-30' 
 GROUP 
    BY date 
 ORDER 
    BY sales DESC 
 LIMIT 1;

答案 1 :(得分:1)

MySQL中日期的默认格式为YYYY-MM-DD,尽管可以自定义。您必须在其周围加上引号,否则它将被视为算术表达式。

您的查询都不需要与customer表联接。客户ID已在orders表中,并且您没有返回有关客户的任何信息(例如姓名或地址),而只是在计算他们。

1)您不需要子查询或分组。

SELECT COUNT(DISTINCT customer_id)
FROM orders
WHERE date = '2018-07-09'

2)再次,您不需要在子查询中使用GROUP BY。还有一种比NOT IN更好的模式来获取不匹配的行数。

SELECT COUNT(*)
FROM customer AS c
LEFT JOIN order AS o on c.id = o.customer_id AND o.date = '2018-07-09'
WHERE o.id IS NULL

有关各种模式,请参见Return row only if value doesn't exist

3)您不能在外部查询中使用MAX($),因为内部查询不会返回具有该名称的列。但是即使您解决了该问题,它也仍然无法使用,因为date列不一定来自具有最大值的同一行。有关更多说明,请参见SQL select only rows with max value on a column

您根本不需要子查询。使用查询返回每天的总销售额,然后使用ORDER BY获得最高的销售额。

SELECT date, SUM($) AS total_sales
FROM orders
WHERE date BETWEEN '2018-07-01' AND '2017-07-30'
GROUP BY date
ORDER BY total_sales DESC
LIMIT 1

如果“最多的销售”是指“最多的销售”,则将SUM($)替换为COUNT(*)