写点什么

数据库每日一题 --- 第 9 天:销售员

作者:知心宝贝
  • 2022 年 6 月 11 日
  • 本文字数:1906 字

    阅读完需:约 6 分钟

一、问题描述

SalesPerson


+-----------------+---------+| Column Name     | Type    |+-----------------+---------+| sales_id        | int     || name            | varchar || salary          | int     || commission_rate | int     || hire_date       | date    |+-----------------+---------+sales_id 是该表的主键列。该表的每一行都显示了销售人员的姓名和 ID ,以及他们的工资、佣金率和雇佣日期。
复制代码


Company


+-------------+---------+| Column Name | Type    |+-------------+---------+| com_id      | int     || name        | varchar || city        | varchar |+-------------+---------+com_id 是该表的主键列。该表的每一行都表示公司的名称和 ID ,以及公司所在的城市。
复制代码


Orders


+-------------+------+| Column Name | Type |+-------------+------+| order_id    | int  || order_date  | date || com_id      | int  || sales_id    | int  || amount      | int  |+-------------+------+order_id 是该表的主键列。com_id 是 Company 表中 com_id 的外键。sales_id 是来自销售员表 sales_id 的外键。该表的每一行包含一个订单的信息。这包括公司的 ID 、销售人员的 ID 、订单日期和支付的金额。
复制代码


编写一个 SQL 查询,报告没有任何与名为  “RED”  的公司相关的订单的所有销售人员的姓名。


以 任意顺序 返回结果表。


题目链接:销售员

二、题目要求

样例

输入:SalesPerson 表:+----------+------+--------+-----------------+------------+| sales_id | name | salary | commission_rate | hire_date  |+----------+------+--------+-----------------+------------+| 1        | John | 100000 | 6               | 4/1/2006   || 2        | Amy  | 12000  | 5               | 5/1/2010   || 3        | Mark | 65000  | 12              | 12/25/2008 || 4        | Pam  | 25000  | 25              | 1/1/2005   || 5        | Alex | 5000   | 10              | 2/3/2007   |+----------+------+--------+-----------------+------------+Company 表:+--------+--------+----------+| com_id | name   | city     |+--------+--------+----------+| 1      | RED    | Boston   || 2      | ORANGE | New York || 3      | YELLOW | Boston   || 4      | GREEN  | Austin   |+--------+--------+----------+Orders 表:+----------+------------+--------+----------+--------+| order_id | order_date | com_id | sales_id | amount |+----------+------------+--------+----------+--------+| 1        | 1/1/2014   | 3      | 4        | 10000  || 2        | 2/1/2014   | 4      | 5        | 5000   || 3        | 3/1/2014   | 1      | 1        | 50000  || 4        | 4/1/2014   | 1      | 4        | 25000  |+----------+------------+--------+----------+--------+输出:+------+| name |+------+| Amy  || Mark || Alex |+------+解释:根据表 orders 中的订单 '3' 和 '4' ,容易看出只有 'John' 和 'Pam' 两个销售员曾经向公司 'RED' 销售过。所以我们需要输出表 salesperson 中所有其他人的名字。
复制代码

考察

1.查询语句、连接问题2.建议用时10~25min
复制代码

三、问题分析

1.子查询

第一种方法是比较普通,容易想到的方式。


我们可以先在Company 和Orders 两个表中筛选出符合题目条件的id编号,最后加上一步判断SalesPerson里面的编号只要不在子条件语句里里面就可以了。

2.左连接

我们通过left join语句先进行左连接,结果如下图所示:


| order_id | date     | com_id | sales_id | amount | com_id | name | city   ||----------|----------|--------|----------|--------|--------|------|--------|| 3        | 3/1/2014 | 1      | 1        | 50000  | 1      | RED  | Boston || 4        | 4/1/2014 | 1      | 4        | 25000  | 1      | RED  | Boston |
复制代码


其实看到上面的表,剩下的步骤其实就是判断SalesPerson表的是不是sales_id 是不是在上面的表中出现过。

四、编码实现

1.子查询

select s.namefrom SalesPerson swhere s.sales_id not in(    select o.sales_id     from Company c,Orders o     where  c.name='RED' and c.com_id=o.com_id)
复制代码

2.左连接

select s.namefrom SalesPerson swhere s.sales_id not in(    select o.sales_id    from Orders o    left  join Company c on c.com_id=o.com_id    where c.name='RED')
复制代码

五、测试结果




发布于: 刚刚阅读数: 3
用户头像

知心宝贝

关注

公众号:穿越计算机的迷雾 2022.03.07 加入

生于尘埃 溺于人海 死于理想高台

评论

发布
暂无评论
数据库每日一题---第9天:销售员_数据库_知心宝贝_InfoQ写作社区