如果语法错误,SQL Exists语句如何工作?
发布时间:2020-12-12 16:32:29 所属栏目:MsSql教程 来源:网络整理
导读:为什么SQL查询工作,即使SELECT缺少一个FROM,这将是一个语法错误.另请注意,查询仅显示满足WHERE子句的查询. CREATE TABLE Customer_Tbl( CustomerName VARCHAR(50),Address VARCHAR(250),Country VARCHAR(50));INSERT INTO Customer_Tbl VALUES ('AAA','','Phi
为什么SQL查询工作,即使SELECT缺少一个FROM,这将是一个语法错误.另请注意,查询仅显示满足WHERE子句的查询.
CREATE TABLE Customer_Tbl ( CustomerName VARCHAR(50),Address VARCHAR(250),Country VARCHAR(50) ); INSERT INTO Customer_Tbl VALUES ('AAA','','Philippines'),('BBB','Mexico'),('CCC',('DDD',('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 Server在SELECT语句中不要求FROM.例如,以下查询中没有语法错误: 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的列的别名.WHERE中的国家是外部表Customer_Tbl的列. 使用AS进行别名是一个很好的做法,并用列表完全限定列. 当您尝试分开运行内部零件时 SELECT 2 Customer_Tbl WHERE Country = 'MEXICO' 它不是因为没有FROM,而是因为解析器不知道是什么国家:
为了完整起见,这里是SQL Server从MSDN开始的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> ;. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server – sql脚本变量的默认值
- SQLite中的WAL机制详细介绍
- 让SQL Server 2008默认使用Report Builder 2.0做报表设计器
- sql-server – Sql Server STUFF – 应该使用position> 800
- sqlserver数据库的索引、视图和触发器
- 比较详细的完美解决安装sql2000时出现以前的某个程序安装已
- 数据库 – Freebase:什么数据转储文件包含“imdb_id”?
- SQL中“IF EXISTS”和“IF NOT EXISTS”之间的区别?
- SQLSERVER数据库所有者SID问题
- clojure – 如何撤销数据库中的事务?