我在这里几乎没有问题
我总是看到一些如下所示的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中。两列实际上是相同的,只是有些可能与其他2个表中的其他列不同或更少的记录,我想知道差异是什么。查询是否以正确的方式进行?
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;
与以传统方式编写查询相比,以对象方式编写查询(如上所述)的优势是什么?我觉得即使您将表名定义为变量,该变量也只能在定义它的查询中使用,并且不能扩展到其他查询。
由于
答案 0 :(得分: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'
您的第二个查询存在语法问题:您需要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;
是(有性能预订)您可以在该比较中添加更多表格。
将表正确的表别名引入第三个查询 - 但该查询结构没有任何实际优势。除了使代码更方便之外,别名还用于区分不明确的项目。在上面的第一个查询中,ON a.id = b.id
显示了可能的歧义,因为2个表中都有一个同名的字段。通过表或表别名对字段名称进行前缀可以解决这种歧义。
答案 1 :(得分:2)
第一点。
我总是看到一些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;
我个人更喜欢别名,除非我有很多表,否则他们往往是单字母表。
答案 2 :(得分:1)
您必须在FROM子句中定义表别名,所以:
SELECT a.column_1, b.column_1
FROM table1 a, table2 b
WHERE a.id = b.id
应该可以按照上面编写查询的方式进行比较,但是也可以通过在FROM子句中使用子查询来使别名更容易,例如:
SELECT tab1.id, tab2.id, tab3.id
FROM table1 as tab1,
(select * from table2)as tab2,
(select * from table3)as tab3
这样你可以使用tab1.xxx等从任何表中选择任何列,然后使用WHERE子句来表示NOT IN tab2.column_1等...
答案 3 :(得分:1)
我不是百分之百地确定这个,所以不要引用我,但生病了,尽我所能。
我认为当别名'使用它是因为如果你不使用它们,你的声明可能很大而且难以理解,这里是与两个SQL查询的比较,一个使用别名'而另一个没有:
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;
正如您所看到的,一个看起来比另一个看起来更容易理解和阅读,并使您的查询更小。
别名在以下情况下非常有用: