我是sql的新手,在w3schools上练习。https://www.w3schools.com/sql/trysql.asp?filename=trysql
在维恩图中,它显示了不同类型的Join.But,我试图得到维恩图的这一部分。

因此,我使用子查询尝试了这种方法。
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
WHERE CUSTOMERS.CUSTOMERID NOT IN (SELECT CUSTOMERID FROM ORDERS);但是,有没有可能在不使用子查询和不使用"In“语句的情况下只获得维恩图的左边部分(而不是相交数据)?如果可能,那么请与我分享解决方案。
发布于 2019-09-12 11:46:27
来自没有订单的客户的所有记录:
SELECT *
FROM Customers c
LEFT JOIN Orders o ON o.CustomerId = c.CustomerId
WHERE o.CustomerId IS NULL 我真的不确定我是否会像vent图那样表示您的客户订单关系,因为它对我来说意味着可以有没有客户的订单,但我会忽略这一点
当我们离开join时,我们得到了所有的客户以及他们所下的任何订单。没有下订单的客户在相关的o.CustomerId中有一个null,这就是我们在where子句中查找的内容
在执行此测试时,使用join条件中指定的(一个或多个)列是最可靠的。由于其他原因(例如,产品类型未知),orders中的任何其他列都可能为null,除非在表定义中将其指定为not NULL。为了避免查找,我们依赖这样一个事实:在这个特定的查询中(在连接中提到的地方),o.CustomerId可以为null的唯一原因是该客户没有匹配的订单行
您也可以使用以下两种方法之一:
SELECT *
FROM Customers c
WHERE c.CustomerId NOT IN (SELECT CustomerId FROM orders)
SELECT *
FROM Customers c
WHERE NOT EXISTS (SELECT null FROM orders o WHERE o.CustomerID = c.CustomerID)在大多数高端数据库系统中,这些都是在幕后实现的;查询编译器将识别它们试图执行的工作,并以相同的方式执行它们。在某些数据库中,NOT IN可能会表现不佳,尤其是较旧的或编写得更幼稚的数据库,遵循这一原则可能是一个合理的经验法则:“在列表中使用in的时间不要长于您愿意手动键入的时间”。EXISTS版本被称为协作子查询,通常是一种相当简洁和高性能的方式来做这样的事情-很长一段时间以来,数据库对EXISTS进行了特定的优化,以前它们可能没有基于连接的路由,但现在这又是很大程度上已经消失的东西。看到某人显示出对EXISTS的偏好可能表明他们已经使用SQL很长时间了,因为在古代数据库中,SQL通常是回答这类查询的最佳方式
在所有3个方法中,我发现join方法最容易阅读和理解--协调的子查询总是需要更多的精力来了解它们是如何挂钩到更大的图景中的,因为它们引用的列不是其局部作用域的一部分。与其他表单相比,也有可能在协调子查询中更容易出错,尤其是在IN中,方法是将外部查询中的列键入到内部查询中,更改它发出的结果。
使用任何适合您的方式;能够阅读和理解所有这些表单将在您阅读他人的代码时对您有所帮助
发布于 2019-09-12 11:47:11
下面的查询将只选择没有订单的客户。
SELECT c.CustomerName, o.OrderID
FROM Customers c
LEFT JOIN Orders o on o.CUSTOMERID = c.CUSTOMERID
WHERE o.OrderID IS NULL
Customer Orders
1 1
2 null
3 2应该只给予
Customer Orders
2 null发布于 2019-09-12 11:49:32
如果你正在寻找没有下单的客户,他们的订单id无论如何都会是空的(这就是你的维恩图所说的):
SELECT Customers.CustomerName
FROM Customers
WHERE CUSTOMERS.CUSTOMERID NOT IN (SELECT CUSTOMERID FROM ORDERS);https://stackoverflow.com/questions/57899419
复制相似问题