我正在执行下面给出的 SQL 查询。
SELECT
a.`Cust_id`,
b.First_Name,
b.Last_Name,
b.Email
FROM
Customers AS a,
(SELECT Cust_Fname,Cust_LName,Email
FROM Cust_Info
)AS b
WHERE
a.`Product`='Pepsodent' #table b doesn't have Product column
GROUP BY Cust_id #Both tables 'a' and 'b' have Cust_id
;
我知道我可以在此处使用 JOINS 而不是子查询,但我正在从另一个角度查看此代码。
据我的理解,代码正在从两个表中检索信息 - a 和 b 即它从表 a 和 中获取 'Cust_id'表 b 中的名字、姓氏、电子邮件。它还在 WHERE 子句上过滤结果集,该子句在条件中仅使用表 a。然而,正如评论所说,表“a”和“b”都有 Cust_id。
所以我的问题是 - 表 b 如何知道要选择哪个 cust_id(因为条件仅在表 a 上,即 a.Product
='Pepsodent')? 什么是这里涉及到什么逻辑?
附注我正在 SQLYog 上编写此查询
最佳答案
这里发生的是 SQL 为您连接表,但由于您没有指定条件,因此您将获得这些表的所有组合(笛卡尔积,在 sql 中称为 CROSS JOIN
),例如,如果表 a
有 3 行和 Cust_Info
有 2 行,您将得到 6 行,当然,因为这些行的部分数据来自 a
您可以过滤产品。
另请注意,即使两个表都有 Cust_id
您的子查询没有选择它,这意味着 b
没有这样调用的列,如果不是这种情况,SQL 也无法知道您引用的是哪一列,此时您必须指定 a.Cust_id
或b.Cust_id
.
关于mysql - SQL查询中子查询的语法和逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25152894/