SQL查询相关 寻找今年具有正收入的客户 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Create  table  If Not  Exists  Customers (customer_id int , year  int , revenue int )Truncate  table  Customersinsert  into  Customers (customer_id, year , revenue) values  ('1' , '2018' , '50' )insert  into  Customers (customer_id, year , revenue) values  ('1' , '2021' , '30' )insert  into  Customers (customer_id, year , revenue) values  ('1' , '2020' , '70' )insert  into  Customers (customer_id, year , revenue) values  ('2' , '2021' , '-50' )insert  into  Customers (customer_id, year , revenue) values  ('3' , '2018' , '10' )insert  into  Customers (customer_id, year , revenue) values  ('3' , '2016' , '50' )insert  into  Customers (customer_id, year , revenue) values  ('4' , '2021' , '20' )+ |  Column  Name  |  Type | + |  customer_id  |  int   | |  year          |  int   | |  revenue      |  int   | +  (customer_id, year ) 是该表的主键(具有唯一值的列的组合)。 这个表包含客户 ID 和不同年份的客户收入。 注意,这个收入可能是负数。
编写一个解决方案来报告 2021 年具有 正收入 的客户。
可以以 任意顺序 返回结果表。
结果格式如下示例所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27  Input: Customers +-------------+------+---------+ | customer_id | year | revenue | +-------------+------+---------+ | 1           | 2018 | 50      | | 1           | 2021 | 30      | | 1           | 2020 | 70      | | 2           | 2021 | -50     | | 3           | 2018 | 10      | | 3           | 2016 | 50      | | 4           | 2021 | 20      | +-------------+------+---------+ Output: +-------------+ | customer_id | +-------------+ | 1           | | 4           | +-------------+ 客户 1 在 2021 年的收入等于 30 。 客户 2 在 2021 年的收入等于 -50 。 客户 3 在 2021 年没有收入。 客户 4 在 2021 年的收入等于 20 。 因此,只有客户 1 和 4 在 2021 年有正收入。
1 2 3 4 5 6 7 8 SELECT  customer_idFROM  customersWHERE  year  =  2021  AND  revenue >  0 ; # Write your MySQL query statement belowselect  t.customer_id     from  customers t         where  t.year =  '2021'  and  t.revenue >  0 ;
审题的时候注意一下这句话:“(customer_id, year) 是这个表的主键。” 表示是不会有重复值的。。。所以不需要去重!一个人在一年是主键,只有唯一一个,不需要分组sum了,直接where就行。我是这么理解的,不知道对不对
1 2 3 4 5 6 7 select  customer_idfrom  Customerswhere  revenue> 0  and  year = 2021 group  by  customer_id,year 
但是customer_id,year已经是主键了,就是唯一的所以不需要分组去重了
从不订购的客户 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Create  table  If Not  Exists  Customers (id int , name varchar (255 ))Create  table  If Not  Exists  Orders (id int , customerId int )Truncate  table  Customersinsert  into  Customers (id, name) values  ('1' , 'Joe' )insert  into  Customers (id, name) values  ('2' , 'Henry' )insert  into  Customers (id, name) values  ('3' , 'Sam' )insert  into  Customers (id, name) values  ('4' , 'Max' )Truncate  table  Ordersinsert  into  Orders (id, customerId) values  ('1' , '3' )insert  into  Orders (id, customerId) values  ('2' , '1' ) Customers 表:+ |  Column  Name |  Type    | + |  id          |  int      | |  name        |  varchar  | +  在 SQL  中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表:+ |  Column  Name |  Type | + |  id          |  int   | |  customerId  |  int   | +  在 SQL  中,id 是该表的主键。 customerId 是 Customers 表中 ID 的外键( Pandas 中的连接键)。 该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。
找出所有从不点任何东西的顾客。
以 任意顺序 返回结果表。
结果格式如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 示例 1: 输入: Customers table: +----+-------+ | id | name  | +----+-------+ | 1  | Joe   | | 2  | Henry | | 3  | Sam   | | 4  | Max   | +----+-------+ Orders table: +----+------------+ | id | customerId | +----+------------+ | 1  | 3          | | 2  | 1          | +----+------------+ 输出: +-----------+ | Customers | +-----------+ | Henry     | | Max       | +-----------+
判断客户是否曾经下过订单的条件是:如果一个客户 ID 在 orders 表中不存在,这就意味着他们从未下过订单。
因此,我们可以使用行过滤来移除不满足条件的客户 ID。请注意,要求只返回满足条件的名称,并将列 name 重命名为 Customers。
思路是基于共同的客户 ID(在 customers 表中的 id 列和 orders 表中的 customerId 列),将表 customers 与表 orders 进行连接。
通过进行左连接,并选择 customerId 为 null 的记录,我们可以确定哪些客户没有下过订单。
我们使用左连接(Left Join)在 customers 上,因为我们希望将所有来自 customers 的客户都包括进来,无论他们是否下过订单。 因此,通过使用左连接,我们可以保留所有来自左表(customers)的行,并将它们与右表(orders)中基于 id 和 customerId 进行匹配的相应行分别对应。
1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT  customers.name AS  'Customers' FROM  customerswhere  customers.id not  in  (     select  customerid from  orders );SELECT  customers.name AS  'Customers' FROM  CustomersLEFT  JOIN  Orders ON  Customers.Id =  Orders.CustomerIdWHERE  Orders.CustomerId IS  NULL 
计算特殊奖金 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Create  table  If Not  Exists  Employees (employee_id int , name varchar (30 ), salary int )Truncate  table  Employeesinsert  into  Employees (employee_id, name, salary) values  ('2' , 'Meir' , '3000' )insert  into  Employees (employee_id, name, salary) values  ('3' , 'Michael' , '3800' )insert  into  Employees (employee_id, name, salary) values  ('7' , 'Addilyn' , '7400' )insert  into  Employees (employee_id, name, salary) values  ('8' , 'Juan' , '6100' )insert  into  Employees (employee_id, name, salary) values  ('9' , 'Kannon' , '7700' ) 表: Employees+ |  列名        |  类型     | + |  employee_id |  int      | |  name        |  varchar  | |  salary      |  int      | +  employee_id 是这个表的主键(具有唯一值的列)。 此表的每一行给出了雇员id ,名字和薪水。
编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 'M' 开头,那么他的奖金是他工资的 100% ,否则奖金为 0 。
返回的结果按照 employee_id 排序。
返回结果格式如下面的例子所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 输入: Employees 表: +-------------+---------+--------+ | employee_id | name    | salary | +-------------+---------+--------+ | 2           | Meir    | 3000   | | 3           | Michael | 3800   | | 7           | Addilyn | 7400   | | 8           | Juan    | 6100   | | 9           | Kannon  | 7700   | +-------------+---------+--------+ 输出: +-------------+-------+ | employee_id | bonus | +-------------+-------+ | 2           | 0     | | 3           | 0     | | 7           | 7400  | | 8           | 0     | | 9           | 7700  | +-------------+-------+ 解释: 因为雇员id是偶数,所以雇员id 是2和8的两个雇员得到的奖金是0。 雇员id为3的因为他的名字以'M'开头,所以,奖金是0。 其他的雇员得到了百分之百的奖金。
在 SQL 中,我们使用条件函数 IF 来执行条件检查,并根据条件的结果返回不同的值。IF 函数的语法如下:
1 IF(condition , value_if_true, value_if_false)
condition 由两部分组成,用关键字 AND 分隔:
employee_id % 2 = 1:这个条件检查 employee_id 是否为奇数。name NOT REGEXP '^M':我们使用关键字 REGEXP 进行正则表达式模式匹配,它检查名字是否不以字母 “M” 开头(^M 表示一个正则表达式模式,匹配任何以 “M” 开头的名字)。因此,在我们的情况下,IF 函数如下所示:
1 IF(employee_id %  2  =  1  AND  name NOT  REGEXP '^M' , salary, 0 )
AS子句用于给上面计算的列一个别名 bonus。如果两个条件都满足,则 bonus 将设置为员工的工资。否则,它将设置为0。然后,结果集根据 employee_id 列按升序排序。完整的代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 SELECT       employee_id,     IF(employee_id %  2  =  1  AND  name NOT  REGEXP '^M' , salary, 0 ) AS  bonus FROM       employees ORDER  BY       employee_idselect  employee_id, if(employee_id% 2 = 1  and  left (name,1 )!= 'M' ,salary,0 )as  bonusfrom  Employeesorder  by  employee_id
每位学生的最高成绩 购买了产品 A 和产品 B 却没有购买产品 C 的顾客