SQL - FROM(子查询)和 WHERE - IN(子查询)之间的区别
SQL - Difference between FROM(subquery) and WHERE - IN(subquery)
我想问一下以下两个 SQL 语句之间的区别。
第一个工作正常,但第二个没有。当我从子查询“创建一个新的 table”时,结果是正确的,但是如果我在 WHERE-IN 语句中使用相同的子查询,那么我会得到不同的结果。
SELECT `T`.`city`, COUNT(*)
FROM (
SELECT `address`.`city`
FROM `address`
INNER JOIN `person` ON `person`.`address_id`=`address`.`address_id`
INNER JOIN `person_detail` ON `person_detail`.`person_detail_id`=`person`.`person_detail_id`
WHERE (`person_detail`.`phone` LIKE '%+42056%') OR (`person_detail`.`phone` LIKE '%+42057%')
) AS T
GROUP BY `T`.`city`
ORDER BY `COUNT(*)` ASC
///////////////////////////////////
SELECT `address`.`city`, COUNT(*)
FROM `address`
WHERE `address`.`city` IN (
SELECT `address`.`city`
FROM `address`
INNER JOIN `person` ON `person`.`address_id`=`address`.`address_id`
INNER JOIN `person_detail` ON `person_detail`.`person_detail_id`=`person`.`person_detail_id`
WHERE (`person_detail`.`phone` LIKE '%+42056%') OR (`person_detail`.`phone` LIKE '%+42057%')
)
GROUP BY `address`.`city`
ORDER BY `COUNT(*)`;
第一个查询将 运行 子查询首先 return 是 'city' 的不同列表。然后你用一个计数对它做另一个分组,这应该导致结果集 'city' 和它旁边的所有结果集。本质上,您 运行 将查询从子查询(而不是地址 table 本身)中分离出来。
您的第二个查询将首先 运行 子查询,return 'city' 的不同列表,然后使用该列表,返回到原始 table 和 return 匹配的所有内容(应该是整个 table 地址)然后按它分组并 return 计数。这将导致不同的结果,因为您正在点击原始 table 与点击子查询结果。
我想问一下以下两个 SQL 语句之间的区别。 第一个工作正常,但第二个没有。当我从子查询“创建一个新的 table”时,结果是正确的,但是如果我在 WHERE-IN 语句中使用相同的子查询,那么我会得到不同的结果。
SELECT `T`.`city`, COUNT(*)
FROM (
SELECT `address`.`city`
FROM `address`
INNER JOIN `person` ON `person`.`address_id`=`address`.`address_id`
INNER JOIN `person_detail` ON `person_detail`.`person_detail_id`=`person`.`person_detail_id`
WHERE (`person_detail`.`phone` LIKE '%+42056%') OR (`person_detail`.`phone` LIKE '%+42057%')
) AS T
GROUP BY `T`.`city`
ORDER BY `COUNT(*)` ASC
///////////////////////////////////
SELECT `address`.`city`, COUNT(*)
FROM `address`
WHERE `address`.`city` IN (
SELECT `address`.`city`
FROM `address`
INNER JOIN `person` ON `person`.`address_id`=`address`.`address_id`
INNER JOIN `person_detail` ON `person_detail`.`person_detail_id`=`person`.`person_detail_id`
WHERE (`person_detail`.`phone` LIKE '%+42056%') OR (`person_detail`.`phone` LIKE '%+42057%')
)
GROUP BY `address`.`city`
ORDER BY `COUNT(*)`;
第一个查询将 运行 子查询首先 return 是 'city' 的不同列表。然后你用一个计数对它做另一个分组,这应该导致结果集 'city' 和它旁边的所有结果集。本质上,您 运行 将查询从子查询(而不是地址 table 本身)中分离出来。
您的第二个查询将首先 运行 子查询,return 'city' 的不同列表,然后使用该列表,返回到原始 table 和 return 匹配的所有内容(应该是整个 table 地址)然后按它分组并 return 计数。这将导致不同的结果,因为您正在点击原始 table 与点击子查询结果。