-
找出没有购物的用户的名字
-
某网站包含两个表,
Customers
表和Orders
表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。Customers
表:+----+-------+ | Id | Name | +----+-------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | +----+-------+
Orders
表:+----+------------+ | Id | CustomerId | +----+------------+ | 1 | 3 | | 2 | 1 | +----+------------+
例如给定上述表格,你的查询应返回:
+-----------+ | Customers | +-----------+ | Henry | | Max | +-----------+
-
解答
- 可以找出购物用户的表,作为一个子表,再在整张表中查询。如下:
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 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person
表应返回以下几行:
+----+------------------+
| Id | Email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+------------------+
思路:先找出每个邮箱所对应的最小的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连表查询,以及套接子查询,在这之中要关注每个关键字的位置以及基于表查询的特点。