知道为什么SQL查询语句不能使用*吗? 考验你们的小细节

不是不能用,为什么不推荐用呢?作为运行效率来说的。看你们知道不... 不是不能用,为什么不推荐用呢?作为运行效率来说的。看你们知道不 展开
 我来答
匿名用户
2013-01-13
展开全部
作为运行效率来说的话, 有2种情况。

第一种情况, 是返回了太多没有用处的列,导致网络传输的数据过多。
* 要返回所有的列的信息。
如果你表的列很多, 又存在很多 二进制的数据类型的话。
例如有某个 安保系统, 有个 进出门的日志表。 这个门需要 2个人, 各刷一次卡,才能进入。
这个表包含下面的列:
自增流水、门口代码、日期时间、第一次刷卡的卡片代码,第二次刷卡的卡片代码,第一次刷卡的照片,第二次刷卡的照片,......其他列

现在发现可能有安全问题, 说昨天有东西丢了。
那么首先就是先
SELECT
日期时间、门口代码,第一次刷卡的卡片代码,第二次刷卡的卡片代码
FROM

WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点

先看看都哪些人刷卡了, 然后再去有重点地去查看那些 可能有问题的 刷卡记录的 照片信息。

否则你直接
SELECT
*
FROM

WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点

一次就会有太多的数据, 从服务器 传递到你的客户端。 而这些数据, 又可能是你用不上的。

第二种情况, 是如果检索的列都包含在索引里面了, 那么查询效率要快很多。
还是上面那个例子。
假如存在有这样的索引 (门口代码, 日期时间)

SELECT
日期时间、门口代码
FROM

WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点

这个查询, 连表都不需要查询了, 直接查询完索引, 就能返回了。

在 SQL Server 中, 可以通过 Include 来包含一个额外的数据到索引上面。
例如:
CREATE NONCLUSTERED INDEX idx_TestDoc
ON 表 (门口代码, 日期时间)
Include(第一次刷卡的卡片代码,第二次刷卡的卡片代码) ;

上面的索引创建完毕的话

SELECT
日期时间、门口代码,第一次刷卡的卡片代码,第二次刷卡的卡片代码
FROM

WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点

也不需要访问表了, 直接查询索引, 就能返回了。

这个情况,用 select * 嘛, 是不行的。就要先去访问好索引, 然后通过索引里面的 信息, 去表里面定位到具体的行数据, 最后再检索出来。
duoingdown
2013-01-13 · TA获得超过290个赞
知道小有建树答主
回答量:249
采纳率:100%
帮助的人:183万
展开全部

因为如果是*的话,SQL的语法解析器会先去读这张表有什么列,然后把*给替换成那些列,这无疑浪费了时间。但这是可以忽略不计的,如果一定要选择所有列,我还是建议用*,因为这样写出来的SQL语句短小清晰。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
开源类库
2013-01-13 · TA获得超过152个赞
知道答主
回答量:85
采纳率:100%
帮助的人:62.4万
展开全部
1楼说的太多了,但是不是重要的。

sql语句之所以不能使用*,是为了程序的扩展性,即向后兼容性,
在c#和众多web项目的开发中,如果sql语句写死了,如果将来你修改sql表结构,用* 查询,那么会发生什么情况,,,
可想而知,程序异常。而不使用*,那么不管你以后怎么修改表结构,都没问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
乌微月2S
2013-01-13 · TA获得超过5037个赞
知道大有可为答主
回答量:5361
采纳率:42%
帮助的人:2979万
展开全部
那你说说看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式