为什么即使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 语句FROM在SELECT语句中不需要.
例如,以下查询中没有语法错误:
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.所述Country在WHERE是外表的列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 >.
这是有效的.它与之相关Customer_Tbl.Country
如果当时至少有一条记录,Customer_Tbl.Country='MEXICO'则WHERE EXISTS为TRUE
I'ts唯一有效时,它的内部EXISTS,虽然