为什么即使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
答案 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
内有效时才会有效