Suppose that a website contains two tables, the Customers
table and the Orders
table. Write a SQL query to find all customers who never order anything.
Table: Customers
.
+----+-------+
| Id | Name |
+----+-------+
| 1 | Joe |
| 2 | Henry |
| 3 | Sam |
| 4 | Max |
+----+-------+
Table: Orders
.
+----+------------+
| Id | CustomerId |
+----+------------+
| 1 | 3 |
| 2 | 1 |
+----+------------+
Using the above tables as example, return the following:
+-----------+
| Customers |
+-----------+
| Henry |
| Max |
+-----------+
这个很简单的问题有三种解法。
今天我只说一种。not in,顺便记录一下not的用法。
先写出正确的解法:
SELECT Name
FROM Customers as c
WHERE c.Id NOT IN
(SELECT CustomersId from Orders);
这个主要就是用到了not in 这个子句。
not:否定他后面所跟的条件。
=======分析一下我们这个问题(这么脑残的问题都要分析?)========
我们就是要知道不在Orders表中的客户id。所以我们先select 出所有在Orders表中的客户id。
然后用not in 来否定一下,就ok了。
========================================================
mysql中,支持not对 in、between、exit的取反。
当然,这个问题还有其他的sql可以解决。这也正体现我们一个问题可以用多个sql写出来,但是性能就有所差别了。