日期:2014-05-17  浏览次数:20477 次

SELECT 1 的问题
百度一下会出来下面这段话:
1)select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。

2)select 1 from table 增加临时列,每行的列值是写在select后的数。

作为新手,让我不理解的是增加临时列居然比select * 效率还高?

select?1

------解决方案--------------------
这个使用1 或者是 * ,讨论是很厉害的。某些过激的言论甚至把这个说道了宗教层面。 

在特定的条件下两者差别较大。比如列非常多的状况。

个人推荐使用1 ,主要是区别于获取全部数据的写法 * 。



------解决方案--------------------
你select * 和select 1from 同一张表试试就知道了。如果用到像if exists(select...)推荐使用select top 1 1
------解决方案--------------------
SELECT *是表扫描、索引扫描、聚集索引扫描,都是扫描,表越大越慢,需要加载数据到内存。select 1怎么增加临时列?
------解决方案--------------------
引用:
Quote: 引用:

1)select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
从速度上来说1的确快一点,但是你要考虑的是是否你想要的,如果在exists里面,用select 1就够了。


第二个问题没看懂

第二个问题也是资料里的一部分,他说select 1 from table是增加临时列,而每行的列值是写在select后的数


就是查询出来的全部是常量1啊 
------解决方案--------------------
这样的话,是否可以理解为select 1不需要完全知道表的具体内容,
这句话可以这样理解,不过速度的话我觉得要看你怎么写了,如果select *,1 as '新列' from tb的话,估计和select * from tb是差不多的
------解决方案--------------------
select 1 from sys.tables
select * from sys.tables

举个简单的例子


执行上面这两个查询  然后查看两者的执行计划和开销情况  你自己去琢磨吧
------解决方案--------------------
我觉得 exists 语句中就用 select 1 ,减少资源浪费;
如果不是exists,需要各个字段的时候,就直接用 select 字段1,字段2,。。。

养成一个习惯还是比较好的。

一旦用惯了select * ,如果碰到了数据量很大,且字段比较多的表,你直接上手 select * ,
呵呵,你慢慢等吧,如果在web中调用了这样的语句,服务器超时都是有可能出现的