需要一些2个SQL查询的帮助

时间:2017-02-09 20:16:22

标签: sql

我的考试需要一些帮助,有2个问题,但我不知道如何加入它们以及我需要哪些SQL语句。

  1. 编写一条SQL语句,显示薪水高于最贵产品价格的员工的员工ID,姓氏和工资。

  2. 编写一条SQL语句,显示使用product_id 1购买产品的客户的客户ID,但到目前为止从未使用product_id 3购买产品。

  3. 如果有人向我解释解决方案,那就太好了。

    enter image description here

1 个答案:

答案 0 :(得分:0)

理解这是一个练习考试,并且您无权访问表格/值....

你真的应该展示你尝试过的东西......但是因为你是新手......

问题1: 返回薪水高于最昂贵产品价格的所有员工的员工ID,姓氏和工资(比如他们如何避免使用max there那里......)

因此,这使用子查询从产品中获取最高价格,并简单地将薪水与其进行比较。

SELECT Employee_ID, Last_Name, Salary
FROM employees
WHERE salary > (Select max(price) from Products);

问题2:

为product_ID为3生成两个集合,其中product_ID为1,并确保1的那些不在3的组中。

并使用相关的子查询(注意PUR别名在子查询中是如何的?这就是它相关的原因)

因此,第一个查询获得所有购买产品1的客户。第二个查询查找所有购买产品3的客户。由于我们只想要购买1而不是3的客户,我们将查询关联使用不存在我们有答案。

存在 - 通常最快,因为一旦找到客户的单个记录,就可以提前退出子查询。

SELECT Distinct PUR.Customer_ID 
FROM purchases PUR
WHERE PRODUCT_ID = 1
  and not exists (SELECT 1 
                  FROM Purchases PUR2
                  WHERE Product_ID = 3
                    and PUR.Customer_ID = PUR2.Customer_I

有2-3种方法可以做到这一点。在大多数情况下,我发现上述效率最高。不过你也可以通过...自我加入;或使用非IN语句

Self LEFT join(如果您需要来自多个表的数据,则效果很好

我们自行加入购买,但过滤每个表格实例以用于特定产品。我们使用左连接,因为我们想要所有带有产品ID 1的记录以及在p2中找到匹配的记录,我们想要排除那些记录,所以如果customer_ID为空,则表示他们没有产品3购买

SELECT Distinct P1.customer_ID
FROM Purchases P1
LEFT JOIN Purchase P2
 on P1.customer_Id = P2.customer_ID
and P2.Product_ID = 3
WHERE P1.Product_ID = 1
 and P2.customer_ID is null

不在(通常最慢,但如果子查询适用于非常小的数据集,则工作正常)

SELECT Distinct PUR.Customer_ID 
FROM purchases PUR
WHERE PRODUCT_ID = 1 
  and customer_ID not in (SELECT Customer_Id 
                          FROM Purchases
                          WHERE Product_ID = 3)

请注意,前两个答案都没有使用连接;虽然相关的子查询很接近。