繁体   English   中英

有人可以解释一下 sql 查询是如何工作的吗?

[英]Can someone explain how the sql query works?

下面的 SQL 查询获取所有具有不同姓氏的 first_names。

select a.first_name
from names a
WHERE a.first_name in (
select b.first_name 
  from names b
  WHERE a.last_name<>b.last_name
)

我无法弄清楚这到底是如何工作的。 我认为会发生的是,对于表中的每一行,子查询将检查是否存在具有不同姓氏的行。 但是检查只发生在名字的相同值之间。 有人可以解释这实际上是如何工作的。

首先,正如我在评论中提到的,我建议为此使用HAVING 它不需要对表进行 2 次扫描,只需一次,它不会返回相同first_name的重复项,并且您可能更容易理解:

SELECT first_name
FROM dbo.names
GROUP BY first_name
HAVING COUNT(DISTINCT last_name) > 1;

应该是不言自明的; 它返回对于first_name的每个值有超过 1 个不同last_name值的行。


对于您的查询,让我们看看WHERE

WHERE a.first_name IN (SELECT b.first_name 
                       FROM names b
                       WHERE a.last_name<>b.last_name

首先,我们“加入”两个names实例(别名a ad b ),其中两个实例中last_name的值不同。 这很可能是一项昂贵的操作; 如果您有一个表将有 1,000 行,并且它有 900 个不同的last_name值,那么您最终会得到行数百个匹配项的连接。

之后,它检查连接的行集中别名为anames实例中的行的first_name的值; 确实如此,那么有 2 个(或更多)具有不同last_name值的相同first_name实例。

在上下文中使用带有子查询的IN与使用值的文字列表没有什么不同。 WHERE SomeColumn IN (1,2,3,4,5,7)将与WHERE SomeColumn IN (SELECT I FROM SomeTable)相同,如果表SomeTable中的列I具有值1 , 2 , 3 , 4 , 5 , 和7 .

你可以把它读成这样的内部连接,或者 EXISTS :

SQL小提琴

查询 2

select a.first_name
from names a
inner join names b
on a.first_name = b.first_name 
  and a.last_name <> b.last_name
Group by a.first_name, a.last_name 

结果

| first_name |
|------------|
|       john |
|       john |
|       john |

查询 3

select a.first_name
from names a
where exists( 
  select 1 from names b
  WHERE a.first_name = b.first_name 
    and a.last_name <> b.last_name
  )

结果

| first_name |
|------------|
|       john |
|       john |
|       john |
  1. 首先进行语法检查,然后创建表达式树(此时您可以另外检查项目和“排列”)(即表中确实存在字段)。 这是初始阶段; 如果有错误,您只是建议提交者认真对待。
  2. 然后是分析。 SQL 查询与程序的不同之处在于它不指定如何执行任务。 相反,它指定了结果是什么。 基于集合的逻辑。 因此,您引入了一个查询分析器(根据产品的不同,其范围从糟糕到好——Oracle 长期以来一直有蹩脚的,DB2 有最敏感的,包括监控磁盘速度)来找出如何最好地处理这个结果. 这是一只非常复杂的野兽,它可能会尝试数十种或数百种技术,然后才能确定他认为最快的一种(基于成本,基本上是一些统计数据)。
  3. 然后执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM