SQL如何从数据库中查找数据是否存在

2023-09-19 08:49:39

SQL查找是否存在,别再用count!!!

问题背景
在业务开发中,经常遇到如下需求:从数据库中查找符合一组条件的数据是否存在。结果也无非两种状态:“有”或者“没有”。

模拟数据表


CREATE TABLE `user`  (
  `id` bigint NOT NULL COMMENT 'id',
  `userName` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户昵称',
  `userAccount` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '账号',
  `userAvatar` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户头像',
  `gender` tinyint NULL DEFAULT NULL COMMENT '性别',
  `userRole` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'user' COMMENT '用户角色:user / admin',
  `userPassword` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '密码',
  `mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手机号',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `isDelete` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uni_userAccount`(`userAccount`) USING BTREE,
  UNIQUE INDEX `uni_mobile`(`mobile`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户' ROW_FORMAT = Dynamic;

大多数人的写法
SQL写法

SELECT COUNT(*) FROM user WHERE gender = '女';

Java写法

QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.eq("gender", '女');
int countNum = userService.count(queryWrapper);
if (countNum > 0) {
    //...
} else {
    //...
}

优化方案
在业务代码中,根据一个或者一组条件,查询记录是否存在,并不关心记录有多少条。

SQL写法

SELECT 1 FROM user WHERE gender = '女' LIMIT 1;

Java写法

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("1")
            .eq("gender", "女")
            .last("LIMIT 1");
User user = userMapper.selectOne(queryWrapper);
if (user != null) {
    //...
} else {
    //...
}

拓展知识
SELECT 1 FROM user WHERE gender = ‘女’ LIMIT 1; 解释
这是一条SQL查询语句,它的作用是从名为"用户"(user)的表中选择一个性别为女(gender = ‘女’)的记录,并且只返回第一条匹配项(LIMIT 1)。

具体而言,SELECT 1表示只需要返回一个值,因此并不会返回整个记录。如果有多个符合条件的记录,也只会返回第一条记录。

在该表中,可能会包含其他字段,例如用户名、密码等等,但在此查询中,我们只关心返回一个值,以便验证表中是否存在至少一个女性用户。

SELECT 1 和 LIMIT 1是否重复?
SELECT 1 和 LIMIT 1 不重复,它们之间有不同的作用。

SELECT 1 是一条 SQL 查询语句,表示要选取表中的数据列或者返回一个常量。下面这个示例中,SELECT 1 返回了一个常量值 “1”:

SELECT 1 FROM table;

常见的用途是检查表是否存在或者用于查询返回布尔值(true/false)。

LIMIT 1 也是一条SQL语句,用于限制查询结果的返回行数。例如:

SELECT * FROM table LIMIT 1;

这将返回“table”表中的第一行(行号为1)。

因此,两条语句具有不同的作用:SELECT 1可以返回一个常量值,而LIMIT 1则限制返回的行数,并不会返回任何特定的值。在某些情况下,可以将两者组合使用,例如:

SELECT 1 FROM table WHERE id = 1234 LIMIT 1;

该查询将返回id等于1234的记录中的第一行,如果不存在则返回空结果集。

更多推荐

卡尔曼滤波应用在数据处理方面的应用

卡尔曼滤波应用到交通领域滤波器介绍核心思想核心公式一维卡尔曼滤波器示例导入所需的库滤波器介绍卡尔曼滤波器是一种用于估计系统状态的数学方法,它以卡尔曼核心思想为基础,广泛应用于估计动态系统的状态和滤除测量中的噪声。以下是卡尔曼滤波器的核心思想和介绍:系统状态估计:卡尔曼滤波器的主要目标是估计动态系统的状态,这个状态通常由

网络安全(黑客)自学

前言作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈技术圈职业圈。娱乐圈:主要是初中生和高中生较多,玩网恋,人气,空间,建站收徒玩赚钱,技术高的也是有的,只是很少见。技术圈:这个圈子

【SpringBoot集成Redis + Session持久化存储到Redis】

目录SpringBoot集成Redis1.添加redis依赖2.配置redis3.手动操作redisSession持久化存储到Redis1.添加依赖2.修改redis配置3.存储和读取String类型的代码4.存储和读取对象类型的代码5.序列化细节SpringBoot集成Redis1.添加redis依赖或将以下配置添加

Docker--未完结

一.Docker是干什么的在没亲自使用过之前,再多的术语也仅仅是抽象,只有写的人或者使用过的人能看懂。所以,作为新手来说,只要知道Docker是用于部署项目就够了,下面展示如何用Docker部署项目及Docker常用命令。二、安装Docker#1、yum包更新到最新yumupdate#2、安装需要的软件包,yum-ut

展会动态 | 迪捷软件邀您参加2023世界智能网联汽车大会

*9月18日之前注册的观众免收门票费*由北京市人民政府、工业和信息化部、公安部、交通运输部和中国科学技术协会联合主办的2023世界智能网联汽车大会将于9月21日-24日在北京·中国国际展览中心(顺义馆)举行。论坛背景本届展会以“聚智成势协同向新——迈向商业化应用新征程”为主题,总面积预计5万平方米,参展商200余家。展

java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发

Java版工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离功能清单如下:首页工作台:待办工作、消息通知、预警信息,点击可进入相应的列表项目进度图表:选择(总体或单个)项目显示1、项目进度图表2、项目信息施工地图:1、展示当前角色权限下能看到的施工地图(

《机器学习实战》笔记

《机器学习实战》笔记一:K近邻KNNK近邻算法概述:工作原理,一般流程;KNN示例:加载数据,分析数据,数据归一化,定义KNN算法,划分数据集,训练测试,使用算法构建完整可用系统;《机器学习实战》笔记二:决策树决策树构造:伪代码,一般流程,信息增益,划分数据集,递归构造决策树;测试和存储决策树:使用决策树执行分类,决策

JDK8特性——Stream API

文章目录集合处理数据的弊端Steam流式思想概述Stream流的获取方式根据Collection获取通过Stream的of方法Stream常用方法介绍forEachcountfilterlimitskipmapsorteddistinctmatchfindmax和minreducemap和reduce的组合mapToI

VScode常用快捷键

添加多个光标alt+鼠标左键Ctrl+Shift+P,F1:显示命令面板Ctrl+P:快速打开Ctrl+Shift+N:新窗口/实例Ctrl+Shift+W:关闭窗口/实例Ctrl+X:剪切行Ctrl+C:复制行ALT+↑/↓:上下移动Shift+Alt+↓/↑:向上/向下复制行Ctrl+Shift+K:删除行Ctrl

【树形 DP】如何从“方向“角度理解树形 DP

题目描述这是LeetCode上的「834.树中距离之和」,难度为「困难」。Tag:「树形DP」、「DFS」、「动态规划」、「树」给定一个无向、连通的树。树中有n个标记为0...n-1的节点以及n-1条边。给定整数n和数组edges,表示树中的节点和之间有一条边。返回长度为n的数组answer,其中answer[i]是树

UML六大关系总结

UML六大关系有:继承、关系、聚合、组合、实现、依赖。分为通过图和代码总结这些关系。1、继承classBird:Animal{}说明:一段都是子类继承父类,在子类的后面用一个冒号表示,冒号后面跟着父类的名字。继承只能继承父类共有和保护的属性或方法,私有的变量或方法不能被子类继承。2、关联ClassPenguin{pri

热文推荐