编写SQL查询时几乎没有疑问

Fre*_*d A 1 sql

我在这里几乎没有问题

  • 我总是看到一些SQL编写如下(不确定我是否正确)

    SELECT a.column_1, a.column_2 FROM table_name WHERE b.column_a = 'some value'
    
    Run Code Online (Sandbox Code Playgroud)

    我不太了解以这种方式编写的SQL.它是否类似于在编程中使用对象,您可以在对象中定义对象和变量?如果是,上面的SQL的a和b的定义在哪里(假设我的查询正确)?

  • 我想在3个不同的表中比较3列(比如C1 C2 C3),比如T1 T2和T3.条件是从T1中的C1获得值,在T2中存在于C2中,但在T3中不存在于C3中.这两列实际上是相同的,只是有些列可能与其他2个表中的其他列不同或更少的记录,我想知道差异是什么.查询是否以正确的方式执行此操作?

    select distinct C1 from T1
    and (C1) not in (select C2 from T2)
    and (C1) in (select C3 from T3)
    order by C1; 
    
    Run Code Online (Sandbox Code Playgroud)

    如果我想使用上面的查询包含更多的表进行比较,是否可以扩展条件?

  • 如果我要将上面的查询自定义为类似于第一个问题的东西,那么查询是否以正确的方式进行?

    select a.C1 from T1 a
    and (a.C1) not in (select b.C2 from T2 b)
    and (a.C1) in (select c.C3 from T3 c)        
    order by a.C1;
    
    Run Code Online (Sandbox Code Playgroud)
  • 与以传统方式编写查询相比,以对象方式编写查询(如上所述)的优势是什么?我觉得即使您将表名定义为变量,该变量也只能在定义它的查询中使用,并且不能扩展到其他查询.

谢谢

Use*_*ady 6

第一点是a和b是"表别名"(对该查询中涉及的表的快捷方式引用),例如

SELECT a.column_1, a.column_2 
FROM table_name_a a  ------------------------------- table alias a defined here
INNER JOIN table_name_b b -------------------------- table alias b defined here
      ON a.id = b.id 
WHERE b.column_a = 'some value'
Run Code Online (Sandbox Code Playgroud)

您的第二个查询有一个语法问题:您需要WHERE如大写所示.它还具有性能影响.Distinct为查询添加了精力,使用IN()实际上是一系列OR的语法快捷方式(它可能无法很好地扩展).但是使用语法它是有效的.

select distinct C1 
from T1
WHERE (C1) not in (select C2 from T2)
and (C1) in (select C3 from T3)
order by C1;       
Run Code Online (Sandbox Code Playgroud)

是(具有性能预留)您可以在该比较中添加更多表.

您将正确完成的表别名引入第三个查询 - 但该查询结构没有真正的优势.除了使代码更方便之外,别名还用于区分不明确的项目.在我上面的第一个查询中ON a.id = b.id显示可能的歧义,因为2个表都有一个同名的字段.通过表或表别名对字段名称进行前缀解决了这种歧义.