字段名称SQL中的前缀

时间:2015-09-29 19:43:22

标签: sql-server

对于SQL而言,我是一个极端的新手,我正在尝试自我教学。我有几个关于SQL和编写查询的问题:

  1. 我已经向同事提供了一些查询示例,其中许多人的字段名称都以m开头。或者t。或o.email(例如m.email或t.email或o.email)。前缀表示什么?

  2. 我正在尝试编写一个JOIN查询,但仍然收到一条错误消息:在预期条件的上下文中指定的非布尔类型的表达式,接近')&# 39; 会导致什么?我尝试加入的数据扩展都没有包含boonlean字段。

  3. 我把它写成:

    SELECT DISTINCT email, status_type, status_value_text FROM ent.[Table 1] JOIN [Table 2] ON email
    

    同样,我非常新,任何帮助都将不胜感激!

3 个答案:

答案 0 :(得分:1)

  

前缀表示什么?

如果查看您正在质疑的示例查询的FROM子句,您应该注意在完整的表名后指定了表别名。有时只使用别名来缩短表名称需要完全拼写,但通常需要消除FROM中多个表中类似命名列之间的歧义。

SELECT
  -- Get the email column from the table aliased
  -- as `m` (table1)
  m.email
FROM
  -- table1 aliased as m
  table1 AS m
  -- table1 aliased as e
  INNER JOIN table2 AS e ON....

考虑两个相关表格table1table2。它们都有一个名为email的列。在SELECT列表中,您可能不会仅指定email,因为RDBMS将不知道您想要哪一个。相反,您必须使用表名限定它。由于这些表在m, e中的别名为FROM,因此您必须使用SELECT中的别名而不是完整的表名。

MS SQL Server documentation on table aliases...

  

在预期条件的上下文中指定的非布尔类型的表达式,在')'

附近

在您的联接的ON子句中,您只提供了列名email,我们可以假设它是与这两个表相关的公共值。连接的ON子句需要一个布尔表达式,其中 true 值在表之间进行逐行比较会导致返回一行。

因此ON子句需要一个带有两边的布尔表达式,或者返回TRUE的东西。在您的情况下,email

之间是相等的
SELECT DISTINCT
   -- Must qualify email since both tables have it
   -- Using the full table name, or its alias if an alias
   -- was provided in `FROM`.
   [Table 1].email,
   status_type,
   status_value_text
FROM 
  ent.[Table 1]
  -- Equality between email columns completes the join
  JOIN [Table 2] ON [Table 1].email = [Table 2].email

ON中的表达式可以是任何,其评估结果为TRUE。它不一定是列值之间的精确匹配,尽管完全匹配是迄今为止最常见的用例。你可以说ON 1 = 1总是为真。生成的行集将匹配[Table 1]中的每一行到[Table 2]的每一行(这是一个笛卡尔积)。它也可能是ON 1 = 2 从不为真,因此基本上没有意义,因为它永远不会返回行。

使用类似于您尝试的ON email的语法,一些RDBMS系统支持USING()代替ON,允许您指定相等的列而不是布尔表达式。因此,您也可以将其表达为

FROM 
  ent.[Table 1]
  JOIN [Table 2] USING (email)

另见What's the difference between ON and USING

答案 1 :(得分:1)

SQL SELECT查询的一般形式是:

SELECT (columns, expressions, aggregate functions)
FROM (data sources)
WHERE (filters on data sources)
GROUP BY (columns used to group the data, needed if you use aggregate functions)
HAVING (filters on data AFTER it's grouped)

关于FROM子句,如果您使用多个数据源(表格或视图),您应该考虑如何关联数据:

  1. 交叉联接返回所涉及表格的笛卡尔积。

    示例:

    FROM foo, bar将返回表foo的所有行以及表bar中的所有行,而没有任何关于它们如何相关的规则。

    < / LI>
  2. 内部联接仅返回满足关系规则的数据。

    实施例:

    FROM foo INNER JOIN bar ON foo.aField = bar.aField(备选方案:FROM foo JOIN bar ON foo.aField = b.aField)将仅返回符合所提供条件的foobar行(字段aField每个表中必须匹配)。 重要: INNER JOIN必须有一个布尔表达式,即关系必须为true或false;大多数情况下,它将是一个平等关系(=),但它可以是返回TRUE/FALSE值的任何内容(><>=等等。

  3. 外部联接返回一个表的完整数据,只返回与关系规则匹配的另一个表的行(对于第一个表的任何其他非匹配行,第二个表中的列将具有{{ 1}}值)。

    有两种可能的外连接:NULL将返回关系规则左侧表中的所有行,并且只返回关系右表的匹配行。 LEFT JOIN恰恰相反。

    实施例:

    RIGHT JOIN

    正如FROM foo LEFT JOIN bar ON foo.aField = bar.aField的情况一样,关系必须有一个布尔表达式。

  4. 现在,正如您所注意到的,您需要告诉系统您从哪个字段获取数据。这就是“前缀”的原因:它们是表(或schema.database.table)名称。如果需要,可以在此表名上使用别名(就像在字段上使用别名一样):

    示例:INNER JOIN

    每次在同一FROM foo AS f INNER JOIN bar AS b on f.aField = b.aField查询中使用该字段时,必须使用FROM子句中使用的别名。

    现在,明确谈论您的查询:帖子中的SELECT缺少关系规则:您告诉数据库服务器表是相关的,但您没有定义关系规则。哪个领域必须匹配?使用表之间必须匹配的列完成JOIN表达式。

答案 2 :(得分:0)

  1. m。或者t。是查询中表的别名(因此您可能正在使用以字母m和t开头的表)。别名在查询的FROM部分中的表名后面指定。
  2. 语法会查找您的JOIN。查询应该看起来更像这样:
  3.   

    SELECT DISTINCT t1.email,t1.status_type,t2.status_value_text
      从   [表1] t1 JOIN [表2] t2 ON t1.email = t2.email

    点击此链接查看更多示例。http://www.w3schools.com/sql/sql_join.asp