如果语法错误,SQL Exists语句如何工作?

时间:2017-01-12 05:11:03

标签: sql sql-server

为什么即使SELECT缺少FROM,这个SQL查询仍然有效,这将是一个语法错误。另请注意,查询仅显示满足WHERE子句的那个。

CREATE TABLE Customer_Tbl
(
    CustomerName VARCHAR(50), 
    Address VARCHAR(250),
    Country VARCHAR(50)
);


INSERT INTO Customer_Tbl 
VALUES
    ('AAA', '','Philippines'),
    ('BBB', '','Mexico'),
    ('CCC', '','Philippines'),
    ('DDD', '','Mexico'),
    ('EEE', '','Philippines');


SELECT *
FROM Customer_Tbl 
WHERE EXISTS(
    -- This is missing a FROM
    -- running it by itself is a syntax error.
    SELECT 2 Customer_Tbl 
    WHERE Country = 'MEXICO'
);

这是对 SQL Server 2012和2014的测试,这是一个在线示例:http://rextester.com/GDGB80815

2 个答案:

答案 0 :(得分:28)

SQL Server在FROM语句中不需要SELECT

例如,以下查询中没有语法错误:

SELECT 2 AS t
WHERE 0 = 0

它会返回一行,其中包含t列和值2

你可以写简单的

SELECT 2 AS t

得到相同的结果。

您的查询与此相同:

SELECT *
FROM Customer_Tbl 
WHERE EXISTS(
    SELECT 2 AS Customer_Tbl 
    WHERE Customer_Tbl.Country = 'MEXICO'
);

内部Customer_Tbl是具有常量2的列的别名。 Country中的WHERE是外表Customer_Tbl的列。

最好将AS用于别名,并使用表名完全限定列。

当您尝试单独运行内部部件时

SELECT 2 Customer_Tbl 
WHERE Country = 'MEXICO'

它失败不是因为没有FROM,而是因为解析器不知道Country是什么:

  

消息207,级别16,状态1,行2无效的列名称'国家'。

为了完整起见,以下是来自MSDN的SQL Server中SELECT语句的语法:

<SELECT statement> ::=    
    [ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]  
    <query_expression>   
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }   
  [ ,...n ] ]   
    [ <FOR Clause>]   
    [ OPTION ( <query_hint> [ ,...n ] ) ]   
<query_expression> ::=   
    { <query_specification> | ( <query_expression> ) }   
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }  
        <query_specification> | ( <query_expression> ) [...n ] ]   
<query_specification> ::=   
SELECT [ ALL | DISTINCT ]   
    [TOP ( expression ) [PERCENT] [ WITH TIES ] ]   
    < select_list >   
    [ INTO new_table ]   
    [ FROM { <table_source> } [ ,...n ] ]   
    [ WHERE <search_condition> ]   
    [ <GROUP BY> ]   
    [ HAVING < search_condition > ]   

可选条款位于方括号[ ]中。如您所见,几乎所有子句都是可选的,包括FROM,但SELECT关键字本身和< select_list >除外。

答案 1 :(得分:5)

它有效。它与Customer_Tbl.Country

相关联

如果Customer_Tbl.Country='MEXICO'中至少有一条记录,则WHERE EXISTS为TRUE

我只有在EXISTS内有效时才会有效