关于编写SQL查询的几点疑问

关于编写SQL查询的几点疑问,sql,Sql,我这里有几个问题 我总是看到下面这样写的一些SQL,不确定是否正确 SELECT a.column_1, a.column_2 FROM table_name WHERE b.column_a = 'some value' 我不太理解用这种方式编写的SQL。它是否类似于在编程中使用对象,您可以在对象中定义对象和变量?如果是,假设我的查询是正确的,那么上面SQL的a和b的定义在哪里 我想比较3个不同表中的3列,比如C1 C2 C3,比如T1 T2和T3。条件是从T1中的C1中获取值,该值存在于T

我这里有几个问题

我总是看到下面这样写的一些SQL,不确定是否正确

SELECT a.column_1, a.column_2 FROM table_name WHERE b.column_a = 'some value'
我不太理解用这种方式编写的SQL。它是否类似于在编程中使用对象,您可以在对象中定义对象和变量?如果是,假设我的查询是正确的,那么上面SQL的a和b的定义在哪里

我想比较3个不同表中的3列,比如C1 C2 C3,比如T1 T2和T3。条件是从T1中的C1中获取值,该值存在于T2中的C2中,但不存在于T3中的C3中。这两个列实际上是相同的,只是有些记录可能与其他两个表中的其他列不同或更少,我想知道它们的区别是什么。下面的查询是正确的方法吗

select distinct C1 from T1
and (C1) not in (select C2 from T2)
and (C1) in (select C3 from T3)
order by C1; 
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;
如果我想使用上面的查询在比较中包含更多的表,是否可以扩展条件

如果我将上面的查询自定义为类似于第一个问题的内容,下面的查询是正确的方式吗

select distinct C1 from T1
and (C1) not in (select C2 from T2)
and (C1) in (select C3 from T3)
order by C1; 
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;
与传统方式相比,用上述对象方式编写查询有哪些优点?我觉得即使将表名定义为变量,变量也只能在定义它的查询中使用,不能扩展到其他查询


谢谢

第一点是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'
您的第二个查询有一个语法问题:您需要如大写所示的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;       
是的,通过性能保留,您可以在比较中添加更多表


您在第三个查询中引入了正确的表别名,但在该查询结构中没有真正的优势。除了使代码更方便之外,别名还可以用来区分那些模棱两可的项目。在我上面关于a.id=b.id的第一个查询中,由于两个表都有一个同名字段,因此显示了可能的歧义。用表或表别名作为字段名的前缀可以解决这种歧义。

第一点是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'
您的第二个查询有一个语法问题:您需要如大写所示的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;       
是的,通过性能保留,您可以在比较中添加更多表


您在第三个查询中引入了正确的表别名,但在该查询结构中没有真正的优势。除了使代码更方便之外,别名还可以用来区分那些模棱两可的项目。在我上面关于a.id=b.id的第一个查询中,由于两个表都有一个同名字段,因此显示了可能的歧义。用表或表别名作为字段名的前缀可以解决这种歧义。

必须在FROM子句中定义表别名,因此:

SELECT a.column_1, b.column_1
FROM table1 a, table2 b
WHERE a.id = b.id
应该可以按照上面编写查询的方式进行比较,但是也可以通过在FROM子句ie:

SELECT tab1.id, tab2.id, tab3.id
FROM table1 as tab1,
(select * from table2)as tab2,
(select * from table3)as tab3

通过这种方式,您可以使用tab1.xxx等从任何表中选择任何列,然后使用WHERE子句表示不在tab2.column_1等中。

您必须在from子句中定义表别名,因此:

SELECT a.column_1, b.column_1
FROM table1 a, table2 b
WHERE a.id = b.id
应该可以按照上面编写查询的方式进行比较,但是也可以通过在FROM子句ie:

SELECT tab1.id, tab2.id, tab3.id
FROM table1 as tab1,
(select * from table2)as tab2,
(select * from table3)as tab3

通过这种方式,您可以使用tab1.xxx等从任何表中选择任何列,然后使用WHERE子句在tab2.column_1等中表示NOT。

我对此不是100%肯定,所以不要引用我的话,但我会尽我所能

我认为当使用alias时,这是因为如果不使用alias,您的语句可能会非常庞大且难以理解,下面是两个SQL查询的比较,一个使用alias,另一个不使用alias:

SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName="Around the Horn" AND c.CustomerID=o.CustomerID;
没有:

SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Customers, Orders
WHERE Customers.CustomerName="Around the Horn" AND Customers.CustomerID=Orders.CustomerID;
正如您所见,其中一个看起来比另一个更容易理解和阅读,并且使您的查询更小

别名在以下情况下非常有用:

查询中涉及多个表 在查询中使用函数 列名太大或可读性不强 两列或多列组合在一起
我不是100%肯定这一点,所以不要引用我的话,但我会尽我最大的努力

我认为当使用alias时,这是因为如果不使用alias,您的语句可能会非常庞大且难以理解,下面是两个SQL查询的比较,一个使用alias,另一个不使用alias:

SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName="Around the Horn" AND c.CustomerID=o.CustomerID;
没有:

SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Customers, Orders
WHERE Customers.CustomerName="Around the Horn" AND Customers.CustomerID=Orders.CustomerID;
< p> 正如您所见,其中一个看起来比另一个更容易理解和阅读,并且使您的查询更小

别名在以下情况下非常有用:

查询中涉及多个表 在查询中使用函数 列名太大或可读性不强 两列或多列组合在一起 关于你的第一点

我总是看到下面这样写的一些SQL,不确定是否正确

SELECT a.column_1, a.column_2 FROM table_name WHERE b.column_a = 'some value'
这个问题是错误的。应该是这样的——

SELECT a.column_1, a.column_2 
FROM table_name a INNER JOIN --(There might be another join also like left join etc..)
table_name b
ON a.id = b.id WHERE b.column_a = 'some value'
所以您在上面的查询中注意到a和b只是表别名。嗯,有些情况下您必须使用它们,比如当您需要在一个查询中两次连接到同一个表时

关于第二点。你也可以这样做

SELECT DISTINCT C1 FROM T1 t1 
WHERE NOT EXISTS (
    SELECT C2 FROM T2 t2 where t2.C2 = t1.C1)
AND WHERE EXISTS (
    SELECT C3 FROM T3 t3 where t3.C3 = t1.C1)
ORDER BY C1;
就我个人而言,我更喜欢别名,除非我有很多表格,否则它们往往是单字母的。

关于你的第一点

我总是看到下面这样写的一些SQL,不确定是否正确

SELECT a.column_1, a.column_2 FROM table_name WHERE b.column_a = 'some value'
这个问题是错误的。应该是这样的——

SELECT a.column_1, a.column_2 
FROM table_name a INNER JOIN --(There might be another join also like left join etc..)
table_name b
ON a.id = b.id WHERE b.column_a = 'some value'
所以您在上面的查询中注意到a和b只是表别名。嗯,有些情况下您必须使用它们,比如当您需要在一个查询中两次连接到同一个表时

关于第二点。你也可以这样做

SELECT DISTINCT C1 FROM T1 t1 
WHERE NOT EXISTS (
    SELECT C2 FROM T2 t2 where t2.C2 = t1.C1)
AND WHERE EXISTS (
    SELECT C3 FROM T3 t3 where t3.C3 = t1.C1)
ORDER BY C1;


就我个人而言,我更喜欢别名,除非我有很多表,否则它们往往是单字母的。

Yah忘记了WHERE子句,因为我是根据原始查询编辑的,原始查询上有WHERE子句;我在键入seelct时遇到困难:请注意下面Krishnaj Rana的回答,他指出使用| NOT |作为INYah的替代词存在,但忘记了WHERE子句,因为我从原始查询中编辑了它,其中有一个WHERE子句;我在键入seelct时遇到困难:请注意下面Krishnaj Rana的回答,他指出使用| NOT |作为INYah的替代词存在,因为我从原始查询中编辑了WHERE子句,该查询上有一个WHERE子句。不管怎样,我看到您在一行中为所有表定义所有表别名?但是您定义的表必须与您在“选择权限”中定义的列匹配?我不能在FROM语句中一起定义整个表别名吗,即使在查询的后面部分使用了其他表的某些列?SQL实际上是反向工作的,所以在FROM和WHERE中定义的任何内容都是在SELECT之前计算出来的,所以如果先在FROM中计算别名,这样,选择SELECT元素就更容易了,特别是在SQL Management Studio中,它具有自动完成功能,这意味着我可以从SELECT中定义所有表别名,而不是传统的SELECT FROM,以及查询下面的相应列?不,抱歉…格式仍然相同,即从表1中选择*其中x=y顺序为1,这只是SQL server处理查询的方式,因此,在FROM子句中填充数据源,然后向上移动到SELECT语句可能是有利的。AH忘记了WHERE子句,因为我从原始查询中编辑了它,该查询上有WHERE子句。不管怎样,我看到您在一行中为所有表定义所有表别名?但是您定义的表必须与您在“选择权限”中定义的列匹配?我不能在FROM语句中一起定义整个表别名吗,即使在查询的后面部分使用了其他表的某些列?SQL实际上是反向工作的,所以在FROM和WHERE中定义的任何内容都是在SELECT之前计算出来的,所以如果先在FROM中计算别名,这样,选择SELECT元素就更容易了,特别是在SQL Management Studio中,它具有自动完成功能,这意味着我可以从SELECT中定义所有表别名,而不是传统的SELECT FROM,以及查询下面的相应列?不,抱歉……格式仍然相同,即从表1中选择*x=y顺序为1,这正是SQL server处理查询的方式,因此在FROM子句中填充数据源,然后再上移到SELECT语句可能是比较的有利方法。我发现表别名很适合显示多个表中的联接列。所以我认为FROM语句中定义的表别名必须和SELECT语句中声明的列匹配?因为我在想,如果可以这样做,只需在一个FROM语句中定义整个表,尽管我并没有使用SELECT语句中定义的所有表,这将是非常好的。感谢您的比较。我发现表别名很适合显示多个表中的联接列。所以我认为FROM语句中定义的表别名必须和SELECT语句中声明的列匹配?因为我在想,如果可以这样做的话,只需在一个FROM语句中定义整个表,尽管我没有使用SELECT语句中定义的所有表,这将是非常好的。感谢您指出EXISTS作为INthanks的良好替代品的使用,感谢您指出EXISTS作为in的良好替代品的使用