SQL查找是否“存在“,别再count了

根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECT count(*) 呢?

无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往的count

目前多数人的写法

多次REVIEW代码时,发现如现现象:

业务代码中,需要根据一个或多个条件,查询是否存在记录,不关心有多少条记录。普遍的SQL及代码写法如下

##### SQL写法:SELECT count(*) FROM table WHERE a = 1 AND b = 2
##### Java写法:int nums = xxDao.countXxxxByXxx(params);if ( nums > 0 ) {    //当存在时,执行这里的代码} else {    //当不存在时,执行这里的代码}
 

是不是感觉很OK,没有什么问题

如果你近期准备面试跳槽,建议在ddkk.com在线刷题,涵盖 一万+ 道 Java 面试题,几乎覆盖了所有主流技术面试题,还有市面上最全的技术五百套,精品系列教程,免费提供。

优化方案

推荐写法如下:

##### SQL写法:SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1
##### Java写法:Integer exist = xxDao.existXxxxByXxx(params);if ( exist != NULL ) {    //当存在时,执行这里的代码} else {    //当不存在时,执行这里的代码}
 

SQL不再使用count,而是改用LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了

业务代码中直接判断是否非空即可

总结

根据查询条件查出来的条数越多,性能提升的越明显,在某些情况下,还可以减少联合索引的创建。

### 如何用 SQL 查询判断记录或表是否存在 #### 判断记录是否存在 对于判断特定条件下是否有记录存在于某个表格内,可以采用 `EXISTS` 子查询的方法。此方法通过检查子查询是否返回任何行来决定外层查询的结果。当子查询找到至少一条符合条件的记录时,整个表达式的值即为真;反之则为假。 ```sql IF EXISTS (SELECT 1 FROM users WHERE name = 'John') BEGIN -- 如果存在名为 John 的用户执行这里的操作 END; ``` 上述例子展示了如何检测名称为 "John" 的用户是否存在于 `users` 表格中[^4]。 #### 判断表是否存在 为了验证数据库是否存在指定名字的数据表,可以通过查询系统目录视图来进行判定。下面的例子说明了怎样确认名为 `TEST` 的数据库以及名为 `tableName` 的表是否已经创建: 针对 **SQL Server**: ```sql -- 检查数据库 TEST 是否存在 IF EXISTS (SELECT * FROM sys.databases WHERE NAME='TEST') PRINT '数据库TEST存在' ELSE PRINT '数据库TEST不存在' -- 检查表 tableName 是否存在于当前数据库 IF OBJECT_ID('dbo.tableName', 'U') IS NOT NULL PRINT '表 tableName 已经存在' ELSE PRINT '表 tableName 尚未被创建'; ``` 这段脚本先利用 `sys.databases` 来查看目标数据库存在情况,再借助 `OBJECT_ID()` 函数测试具体表单的状态。这里 `'U'` 参数表示只考虑用户定义的对象类型——也就是普通的表格[^2]。 对于其他类型的数据库管理系统(DBMS),如 MySQL 或 PostgreSQL, 可能会有所不同但是概念相似。例如,在MySQL环境下,通常使用如下方式检查表的存在性: ```sql SHOW TABLES LIKE 'tableName'; ``` 或者更推荐的做法是使用带有条件的 `INFORMATION_SCHEMA.TABLES` 查找: ```sql SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'tableName' AND TABLE_SCHEMA = DATABASE(); ``` 这种方法不仅限定了要查找的具体表名,还指明了所在的数据库实例,从而提高了准确性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值