Select count(*) from与Select * from的区别

本文介绍了两种常用的SQL查询语句:一种是使用select count(*)从表T中查询数据的行数;另一种是使用select *来获取表T中的所有数据详情。通过对比这两种语句,帮助读者理解它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语句一:select count(*) from T;
作用:查询T表中数据的行数。
语句二:select * from T;
作用:查询T表中所有的数据。

区别:语句一查询结果为一个数值,就是表中数据条数;语句二查询结果是表中所有数据,就是包括字段名字,字段里面的内容的详细信息。
简单记:
Select count(*) 返回的是记录的数目
Select * 返回的是记录内容
<think>我们使用SQLite的系统表sqlite_master来检查表是否存在。sqlite_master表中存储了数据库的元数据,包括表、索引、视图等信息。要判断某个表是否存在,我们可以查询sqlite_master表,检查type='table'且name等于表名的记录是否存在。具体步骤:1.编写SQL查询:SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDname='表名';2.执行该查询,如果返回的count(*)大于0,则表存在;否则,表不存在。注意:表名在sqlite_master中是大小写敏感的,但是SQLite默认情况下表名是不区分大小写的(因为SQLite在创建表时会将表名转换为小写存储?实际上并不是这样,SQLite默认对表名是大小写不敏感的,但在查询时需要注意:默认情况下,SQLite会忽略表名的大小写,但在sqlite_master表中存储的表名是创建时指定的名称,可能大小写混合。因此,为了确保查询准确,我们通常将表名转换为统一的大小写进行比较,或者使用COLLATENOCASE)。然而,根据SQLite的文档,表名在sqlite_master中存储的是创建时使用的名称(保留大小写),但SQLite在比较表名时默认是大小写不敏感的。也就是说,即使我们创建表时用了"MyTable",我们也可以用"mytable"来引用它。但是在sqlite_master表中,name字段存储的是"MyTable"。因此,我们在查询sqlite_master表时,为了确保匹配,我们可以使用大小写不敏感的比较。所以,我们可以这样写:SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDname='your_table_name'COLLATENOCASE;但是,注意:如果数据库中存在多个只有大小写不同的表名(这种情况在SQLite中是不允许的,因为SQLite默认认为它们是同一个表),所以实际上我们不需要担心。因此,我们也可以直接使用:SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDname='your_table_name';因为SQLite在创建表时已经确保了表名在大小写不敏感的情况下是唯一的。但是在sqlite_master表中,存储的是创建时的表名,而查询时我们传入的表名如果大小写不同,那么直接比较可能匹配不到。因此,为了安全起见,我们使用大小写不敏感的比较。因此,推荐写法:SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDname=?COLLATENOCASE;或者,我们可以使用:SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDLOWER(name)=LOWER('your_table_name');但是,注意:使用LOWER函数可能会使索引失效(如果sqlite_master表有索引的话,但实际上它不大,所以性能不是问题)。另外,SQLite还提供了一个临时表sqlite_temp_master,如果我们需要检查临时表,可以同时查询这个表。但是通常我们只关心持久化的表,所以只查sqlite_master即可。示例代码(在SQLite命令行中):假设我们要检查名为“employees”的表是否存在:方法1(直接使用大小写敏感比较,但前提是知道创建时表名的大小写):SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDname='employees';方法2(使用大小写不敏感比较,更通用):SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDname='employees'COLLATENOCASE;方法3(使用大写或小写转换,注意表名中可能有非英文字符,所以大小写转换可能不适用所有情况,但表名通常使用英文字母):SELECTcount(*)FROMsqlite_masterWHEREtype='table'ANDLOWER(name)=LOWER('employees');我们通常使用方法2。在应用程序中,我们可以这样使用:如果查询返回的计数值大于0,则表存在。另外,引用[3]中提到:查询表存在否:SELECT*fromsqlite_masterwherename=‘表名’。但是这样会返回整个记录,我们只需要知道是否存在,所以用count(*)更高效。因此,我们使用count(*)来检查。总结:判断表是否存在的SQL语句如下:```sqlSELECTcount(*)AScntFROMsqlite_masterWHEREtype='table'ANDname='your_table_name';```或者为了大小写不敏感:```sqlSELECTcount(*)AScntFROMsqlite_masterWHEREtype='table'ANDname='your_table_name'COLLATENOCASE;```然后判断cnt是否大于0。注意:临时表不在sqlite_master中,而在sqlite_temp_master中。如果需要检查临时表,则需要同时检查sqlite_temp_master。但通常我们只检查普通表。如果确实需要检查临时表,可以联合查询:```sqlSELECTcount(*)FROM(SELECT*FROMsqlite_masterUNIONALLSELECT*FROMsqlite_temp_master)WHEREtype='table'ANDname='your_table_name'COLLATENOCASE;```不过,大多数情况下,我们只需要检查普通表。根据引用[5]中的例子,他们使用了联合查询来同时检查普通表和临时表。因此,如果您的应用涉及临时表,请使用联合查询的方式。但是,对于大多数情况,我们只需要检查普通表(持久化表),所以使用sqlite_master即可。所以,根据需求,如果只是判断普通表是否存在,使用第一种方法即可。</think>### 使用 SQLite 的 `sqlite_master` 判断表是否存在 在 SQLite 中,可以通过查询系统表 `sqlite_master` 来判断表是否存在。以下是具体方法和说明: #### 📌 核心查询语句 ```sql SELECT count(*) FROM sqlite_master WHERE type = 'table' AND name = 'your_table_name'; -- 替换为你的表名 ``` #### 🔍 执行结果解读: - **返回值 = 1**:表存在 - **返回值 = 0**:表不存在 #### ⚠️ 注意事项: 1. **大小写敏感** SQLite 表名默认**区分大小写**。若创建表时使用引号包裹表名(如 `CREATE TABLE "MyTable"`),查询时需保持相同大小写: ```sql -- 正确(匹配带引号的表名) SELECT count(*) FROM sqlite_master WHERE name = 'MyTable'; -- 错误(不会匹配) SELECT count(*) FROM sqlite_master WHERE name = 'mytable'; ``` 2. **临时表处理** 临时表存储在 `sqlite_temp_master` 系统表中。若需同时检查普通表和临时表: ```sql SELECT count(*) FROM ( SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master ) WHERE type = 'table' AND name = 'temp_table'; -- 临时表名 ``` 3. **字段检查(扩展)** 如需检查表中是否包含特定字段: ```sql SELECT sql FROM sqlite_master WHERE name = 'your_table' AND sql LIKE '%column_name%'; -- 字段名 ``` #### 💡 实际应用示例 ```sql -- 检查 employees 表是否存在 SELECT CASE WHEN (SELECT count(*) FROM sqlite_master WHERE type='table' AND name='employees') > 0 THEN '表存在' ELSE '表不存在' END AS result; ``` #### 📚 技术原理 `sqlite_master` 是 SQLite 的系统表,存储数据库的元数据: - `type`:对象类型(`table`/`index`/`view`) - `name`:对象名称(表名/索引名) - `sql`:创建对象的 SQL 语句[^1][^4] --- ### 相关问题 1. SQLite 中如何动态创建不存在的表? 2. 为什么在 `sqlite_master` 中查询不到新创建的表?[^4] 3. 如何获取 SQLite 数据库中所有表的列表? 4. SQLite 表名大小写敏感有哪些应用场景? 5. 临时表 `sqlite_temp_master` 普通表有何区别?[^5] [^1]: 参考 SQLite 系统表结构说明 [^4]: 关联 `sqlite_master` 表的读写特性 [^5]: 涉及临时表的处理方式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值