leetcode数据库简单题 —— 5与6

  • 找出没有购物的用户的名字

  • 某网站包含两个表,Customers 表和 Orders表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

    Customers 表:

    +----+-------+
    | Id | Name  |
    +----+-------+
    | 1  | Joe   |
    | 2  | Henry |
    | 3  | Sam   |
    | 4  | Max   |
    +----+-------+
    

    Orders 表:

    +----+------------+
    | Id | CustomerId |
    +----+------------+
    | 1  | 3          |
    | 2  | 1          |
    +----+------------+
    

    例如给定上述表格,你的查询应返回:

    +-----------+
    | Customers |
    +-----------+
    | Henry     |
    | Max       |
    +-----------+
  • 解答

  1.  可以找出购物用户的表,作为一个子表,再在整张表中查询。如下:

     select Name as Customers  from Customers  where Customers.Id not in (select  CustomerId  from Orders );

    2. 也可以使用连表查询,找出customerId 是null的id所对应的name,使用left join

    select Name as Customers  from Customers c  left join Orders as o on c.Id = o.CustomerId where o.CustomerId is null;

    3.on和where的用法:

    我的理解,在on之后先展出相同的数,但是是左连接,会显示左边所有的数,当使用where是,会去掉符合on条件的数据,进而可以得出on与where的执行顺序,on在前where在后。

  • 删除重复的电子邮箱

     

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
| 3  | [email protected] |
+----+------------------+
Id 是这个表的主键。

例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
+----+------------------+

思路:先找出每个邮箱所对应的最小的id;进行分组,分组之后放入一个表中,再从这个表中选出id;重新回到最初的表,当最初的表中的id与新表中的id不相等时,删除最初表中的id。

第一步:按照Email找出id分组,放入一张表中

select min(id) id,Eamil from Person group by Email

第二步:选出上述表中的id

select id from (select min(id) id,Eamil from Person group by Email) t

这个t必不可少,因为都是基于表查询的,需要有表名

最后:

delete from Person where Id not in (select Id from (select min(Id) Id,Eamil from Person group by Email) t

今日份总结:在简单的SQL查询中,最常用的就是join连表查询,以及套接子查询,在这之中要关注每个关键字的位置以及基于表查询的特点。

你可能感兴趣的:(MySQL数据库)