【发布时间】:2013-03-26 06:21:03
【问题描述】:
下面是两个脚本
select *select count(*)
第一个出错,第二个没有出错。
下面是sql server给出的错误
消息 263,第 16 级,状态 1,第 1 行 必须指定要从中选择的表。
你能说出原因吗?
注意:未指定表名。
提前致谢。
【问题讨论】:
标签: sql-server
下面是两个脚本
select *select count(*)第一个出错,第二个没有出错。
下面是sql server给出的错误
消息 263,第 16 级,状态 1,第 1 行 必须指定要从中选择的表。
你能说出原因吗?
注意:未指定表名。
提前致谢。
【问题讨论】:
标签: sql-server
select count(*) 起作用的原因是因为它默认为master 数据库
如其他答案中所述,您必须指定表名。
【讨论】:
SELECT * 不是一个完整的查询
应该是
SELECT * from MyTableName
【讨论】:
select count(*) 有效,因为count 是一个函数并返回一个标量值,因为from 子句是可选的,它会成功执行,而* 既不是函数也不是标量值,这就是它无法执行的原因。
来自SELECT
[ WITH <common_table_expression>]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
SELECT 语句中子句的顺序很重要。任何一个可选子句都可以省略,但是在使用可选子句时,它们必须以适当的顺序出现
所以选择后跟任何标量值将执行,即选择1,选择'*'
【讨论】:
在1st查询中,要使其完整,需要定义from子句。
SELECT * FROM <Table_Name>
在 2nd 查询中,如果您没有指定要从中选择的表,则单次选择只会返回一行 - 因此 count(*) 将返回 1。
FROM 子句是可选的,它一直以这种方式工作。所以你可以做"SELECT 1"或"SELECT @val"等等而不需要一张桌子。
在其他数据库系统中,有一个名为"DUAL" 的虚拟表,其中一行用于执行诸如"SELECT 1 FROM dual;" 之类的SELECT 语句
【讨论】: