关于如select 1 from **中的"1"。

本文主要讨论了几种SELECT语句,以table表为例,对select 1、select count(1)、select sum(1)等语句进行测试。测试发现,第一种写法增加临时列,列值为select后数字;第二种得出表行数;第三种计算临时列和。提醒要注意SQL细节。

     在这里我主要讨论的有以下几个select 语句:

table表是一个数据表,假设表的行数为10行,以下同。

1:select  1 from table     

2:select count(1)  from table  

3:select sum(1) from table

对第一个select语句,我刚开始以为是“1”代表是列名,从2,3种顺推得出得结果:)有点无耻吧。不过通过我自己得观察,这样我觉得是不对的,所以我在SQL SERVER中测试了一下,发现结果如下:

1:测试结果,得出一个行数和table表行数一样的临时列(暂且这么叫,我也不知道该叫什么),每行的列值是1;

2:得出一个数,该数是table表的行数;

3:得出一个数,该数是table表的行数;

然后我又用“2”测试,结果如下:

1:得出一个行数和table表行数一样的临时列,每行的列值是2;

2:得出一个数,该数是table表的行数;

3:得出一个数,该数是table表的行数×2的数

然后我又用更大的数测试:

1:得出一个行数和table表行数一样的临时列,每行的列值是我写在select后的数;

2:还是得出一个数,该数是table表的行数;

3:得出一个数,该数是table表的行数×写在select后的数

综上所述:我发现第一种的写法是增加临时列,每行的列值是写在select后的数;第二种是不管count(a)的a值如何变化,得出的值总是table表的行数;第三种是计算临时列的和。

小结:自以为SQL用的挺多的,但是没想到这里的几种写法让我一下子轻易放过去了,看来以后还是要好好注意,不要放过任何疑点。

### SQL中`SELECT 1 FROM`和`SELECT * FROM`的区别 #### 1. 功能上的区别 `SELECT 1 FROM` 和 `SELECT * FROM` 的主要区别在于它们返回的数据内容和用途不同。 - `SELECT 1 FROM` 返回的是一列,其中每一行的值都是常量 1。这种查询通常用于检查是否存在符合条件的记录,尤其是在 `EXISTS` 子句中使用时非常高效。例如: ```sql SELECT * FROM mytable WHERE EXISTS (SELECT 1 FROM mytable WHERE condition); ``` 在这种情况下,数据库不需要检索实际的数据行,只需要判断是否存在符合条件的结果即可,因此效率较高 [^2]。 - `SELECT * FROM` 则会返回表中所有列的所有数据。这种查询通常用于需要获取表中完整数据的场景,但由于需要检索所有列,性能开销相对较大,尤其是在表数据量较大的情况下 [^1]。 #### 2. 性能上的区别 性能差异主要体现在查询效率和资源消耗上: - `SELECT 1 FROM` 的性能通常优于 `SELECT * FROM`,因为前者只需要返回一个常量值,不需要检索表中的实际数据列。特别是在 `WHERE` 子句中使用索引的情况下,`SELECT 1 FROM` 的执行速度更快 [^1]。 - `SELECT * FROM` 需要检索表中的所有列,因此需要更多的 I/O 操作和内存资源,尤其是在表中包含大量列或大字段(如 BLOB)时,性能开销会显著增加 [^2]。 #### 3. 使用场景的区别 - **`SELECT 1 FROM` 的典型使用场景:** - 检查是否存在符合条件的记录,例如在 `EXISTS` 子句中。 - 快速验证表中是否有数据,例如 `SELECT 1 FROM table_name LIMIT 1;`。 - 作为子查询的一部分,用于条件判断。 - **`SELECT * FROM` 的典型使用场景:** - 需要获取表中所有列的数据时,例如生成报表或导出数据。 - 调试或分析表结构时,快速查看表中的完整数据。 #### 4. 示例对比 以下是一些具体的查询示例,展示了 `SELECT 1 FROM` 和 `SELECT * FROM` 的不同行为: - **`SELECT 1 FROM` 示例:** ```sql SELECT 1 FROM employees WHERE department_id = 10; ``` 如果存在符合条件的记录,查询结果将返回多行,每行的值都是 1。 - **`SELECT * FROM` 示例:** ```sql SELECT * FROM employees WHERE department_id = 10; ``` 查询结果将返回 `employees` 表中所有 `department_id = 10` 的记录,包括所有列的数据。 #### 5. 效率比较 从效率角度来看,`SELECT 1` 和 `SELECT anycol`(表中的任意列)以及 `SELECT *` 的性能顺序为: ```text SELECT 1 > SELECT anycol > SELECT * ``` 这是因为 `SELECT 1` 不需要访问表中的实际数据列,而 `SELECT anycol` 只需要访问特定列的数据,而 `SELECT *` 则需要访问所有列的数据 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值