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

jba*_*tac 12 sql sql-server

为什么即使SELECT缺少a 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'
);
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*nov 28

SQL 语句FROMSELECT语句中不需要.

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

SELECT 2 AS t
WHERE 0 = 0
Run Code Online (Sandbox Code Playgroud)

它返回一行包含列t和值2.

你可以写简单

SELECT 2 AS t
Run Code Online (Sandbox Code Playgroud)

得到相同的结果.


您的查询与此相同:

SELECT *
FROM Customer_Tbl 
WHERE EXISTS(
    SELECT 2 AS Customer_Tbl 
    WHERE Customer_Tbl.Country = 'MEXICO'
);
Run Code Online (Sandbox Code Playgroud)

Inner Customer_Tbl是具有常量的列的别名2.所述CountryWHERE是外表的列Customer_Tbl.

使用AS别名并使用表名完全限定列是一种很好的做法.


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

SELECT 2 Customer_Tbl 
WHERE Country = 'MEXICO'
Run Code Online (Sandbox Code Playgroud)

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

消息207,级别16,状态1,行2无效的列名称"国家/地区".


为了完整起见,以下是MSDNSELECT中SQL Server 中语句的语法:

<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 > ]   
Run Code Online (Sandbox Code Playgroud)

可选条款位于方括号内[ ].正如您所看到的,几乎所有子句都是可选的,包括FROM,除了SELECT关键字本身和< select_list >.


Nic*_*aid 5

这是有效的.它与之相关Customer_Tbl.Country

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

I'ts唯一有效时,它的内部EXISTS,虽然

  • @jbalintac那是因为你的陈述当前是,它将`Customer_Tbl`解释为列别名.如果你改变它(在`Customer_Tbl`之前添加`FROM`),它会将`Customer_Tbl`解释为一个表,而exists子句变得完全不同. (3认同)