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

时间:2014-08-21 09:00:50

标签: 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获得值,在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;
    
  • 与以传统方式编写查询相比,以对象方式编写查询(如上所述)的优势是什么?我觉得即使您将表名定义为变量,该变量也只能在定义它的查询中使用,并且不能扩展到其他查询。

由于

4 个答案:

答案 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;

正如您所看到的,一个看起来比另一个看起来更容易理解和阅读,并使您的查询更小。

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

  • 查询中涉及多个表
  • 在查询中使用函数
  • 列名很大或不太可读
  • 两个或多个列组合在一起

http://www.w3schools.com/sql/sql_alias.asp