为什么即使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' );
这是对SQL Server 2012和2014的测试,这是一个在线示例:http://rextester.com/GDGB80815
SQL 语句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' );
Inner Customer_Tbl
是具有常量的列的别名2
.所述Country
在WHERE
是外表的列Customer_Tbl
.
使用AS
别名并使用表名完全限定列是一种很好的做法.
当您尝试单独运行内部部件时
SELECT 2 Customer_Tbl WHERE Country = 'MEXICO'
它失败不是因为没有FROM
,而是因为解析器不知道是什么Country
:
消息207,级别16,状态1,行2无效的列名称"国家/地区".
为了完整起见,以下是MSDNSELECT
中SQL Server 中语句的语法:
可选条款位于方括号内[
]
.正如您所看到的,几乎所有子句都是可选的,包括FROM
,除了SELECT
关键字本身和< select_list >
.
这是有效的.它与之相关Customer_Tbl.Country
如果当时至少有一条记录,Customer_Tbl.Country='MEXICO'
则WHERE EXISTS为TRUE
I'ts唯一有效时,它的内部EXISTS
,虽然